mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-04 04:07:32 -05:00 
			
		
		
		
	Merge branch 'invoiceninja/develop' into attached-documents
This commit is contained in:
		
						commit
						9fbee962de
					
				@ -41,4 +41,6 @@ API_SECRET=password
 | 
			
		||||
 | 
			
		||||
#GOOGLE_CLIENT_ID=
 | 
			
		||||
#GOOGLE_CLIENT_SECRET=
 | 
			
		||||
#GOOGLE_OAUTH_REDIRECT=http://ninja.dev/auth/google
 | 
			
		||||
#GOOGLE_OAUTH_REDIRECT=http://ninja.dev/auth/google
 | 
			
		||||
 | 
			
		||||
#GOOGLE_MAPS_API_KEY=
 | 
			
		||||
							
								
								
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							@ -13,7 +13,7 @@ open-source software.
 | 
			
		||||
 | 
			
		||||
1. Redistributions of source code, in whole or part and with or without
 | 
			
		||||
modification requires the express permission of the author and must prominently 
 | 
			
		||||
display "Powered by InvoiceNinja" or the Invoice Ninja logo in verifiable form 
 | 
			
		||||
display "Powered by InvoiceNinja" and the Invoice Ninja logo in verifiable form 
 | 
			
		||||
with hyperlink to said site.
 | 
			
		||||
2. Neither the name nor any trademark of the Author may be used to
 | 
			
		||||
endorse or promote products derived from this software without specific
 | 
			
		||||
 | 
			
		||||
@ -760,7 +760,7 @@ class AccountController extends BaseController
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $labels = [];
 | 
			
		||||
            foreach (['item', 'description', 'unit_cost', 'quantity', 'line_total', 'terms'] as $field) {
 | 
			
		||||
            foreach (['item', 'description', 'unit_cost', 'quantity', 'line_total', 'terms', 'balance_due', 'partial_due'] as $field) {
 | 
			
		||||
                $labels[$field] = Input::get("labels_{$field}");
 | 
			
		||||
            }
 | 
			
		||||
            $account->invoice_labels = json_encode($labels);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										179
									
								
								app/Http/Controllers/DashboardApiController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								app/Http/Controllers/DashboardApiController.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,179 @@
 | 
			
		||||
<?php namespace App\Http\Controllers;
 | 
			
		||||
 | 
			
		||||
use Auth;
 | 
			
		||||
use DB;
 | 
			
		||||
use View;
 | 
			
		||||
use App\Models\Activity;
 | 
			
		||||
 | 
			
		||||
class DashboardApiController extends BaseAPIController
 | 
			
		||||
{
 | 
			
		||||
    public function index()
 | 
			
		||||
    {
 | 
			
		||||
        $view_all = !Auth::user()->hasPermission('view_all');
 | 
			
		||||
        $user_id = Auth::user()->id;
 | 
			
		||||
 | 
			
		||||
        // total_income, billed_clients, invoice_sent and active_clients
 | 
			
		||||
        $select = DB::raw('COUNT(DISTINCT CASE WHEN invoices.id IS NOT NULL THEN clients.id ELSE null END) billed_clients,
 | 
			
		||||
                        SUM(CASE WHEN invoices.invoice_status_id >= '.INVOICE_STATUS_SENT.' THEN 1 ELSE 0 END) invoices_sent,
 | 
			
		||||
                        COUNT(DISTINCT clients.id) active_clients');
 | 
			
		||||
        $metrics = DB::table('accounts')
 | 
			
		||||
            ->select($select)
 | 
			
		||||
            ->leftJoin('clients', 'accounts.id', '=', 'clients.account_id')
 | 
			
		||||
            ->leftJoin('invoices', 'clients.id', '=', 'invoices.client_id')
 | 
			
		||||
            ->where('accounts.id', '=', Auth::user()->account_id)
 | 
			
		||||
            ->where('clients.is_deleted', '=', false)
 | 
			
		||||
            ->where('invoices.is_deleted', '=', false)
 | 
			
		||||
            ->where('invoices.is_recurring', '=', false)
 | 
			
		||||
            ->where('invoices.is_quote', '=', false);
 | 
			
		||||
 | 
			
		||||
        if(!$view_all){
 | 
			
		||||
            $metrics = $metrics->where(function($query) use($user_id){
 | 
			
		||||
                $query->where('invoices.user_id', '=', $user_id);
 | 
			
		||||
                $query->orwhere(function($query) use($user_id){
 | 
			
		||||
                    $query->where('invoices.user_id', '=', null);
 | 
			
		||||
                    $query->where('clients.user_id', '=', $user_id);
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $metrics = $metrics->groupBy('accounts.id')
 | 
			
		||||
            ->first();
 | 
			
		||||
 | 
			
		||||
        $select = DB::raw('SUM(clients.paid_to_date) as value, clients.currency_id as currency_id');
 | 
			
		||||
        $paidToDate = DB::table('accounts')
 | 
			
		||||
            ->select($select)
 | 
			
		||||
            ->leftJoin('clients', 'accounts.id', '=', 'clients.account_id')
 | 
			
		||||
            ->where('accounts.id', '=', Auth::user()->account_id)
 | 
			
		||||
            ->where('clients.is_deleted', '=', false);
 | 
			
		||||
 | 
			
		||||
        if(!$view_all){
 | 
			
		||||
            $paidToDate = $paidToDate->where('clients.user_id', '=', $user_id);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $paidToDate = $paidToDate->groupBy('accounts.id')
 | 
			
		||||
            ->groupBy(DB::raw('CASE WHEN clients.currency_id IS NULL THEN CASE WHEN accounts.currency_id IS NULL THEN 1 ELSE accounts.currency_id END ELSE clients.currency_id END'))
 | 
			
		||||
            ->get();
 | 
			
		||||
 | 
			
		||||
        $select = DB::raw('AVG(invoices.amount) as invoice_avg, clients.currency_id as currency_id');
 | 
			
		||||
        $averageInvoice = DB::table('accounts')
 | 
			
		||||
            ->select($select)
 | 
			
		||||
            ->leftJoin('clients', 'accounts.id', '=', 'clients.account_id')
 | 
			
		||||
            ->leftJoin('invoices', 'clients.id', '=', 'invoices.client_id')
 | 
			
		||||
            ->where('accounts.id', '=', Auth::user()->account_id)
 | 
			
		||||
            ->where('clients.is_deleted', '=', false)
 | 
			
		||||
            ->where('invoices.is_deleted', '=', false)
 | 
			
		||||
            ->where('invoices.is_quote', '=', false)
 | 
			
		||||
            ->where('invoices.is_recurring', '=', false);
 | 
			
		||||
 | 
			
		||||
        if(!$view_all){
 | 
			
		||||
            $averageInvoice = $averageInvoice->where('invoices.user_id', '=', $user_id);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $averageInvoice = $averageInvoice->groupBy('accounts.id')
 | 
			
		||||
            ->groupBy(DB::raw('CASE WHEN clients.currency_id IS NULL THEN CASE WHEN accounts.currency_id IS NULL THEN 1 ELSE accounts.currency_id END ELSE clients.currency_id END'))
 | 
			
		||||
            ->get();
 | 
			
		||||
 | 
			
		||||
        $select = DB::raw('SUM(clients.balance) as value, clients.currency_id as currency_id');
 | 
			
		||||
        $balances = DB::table('accounts')
 | 
			
		||||
            ->select($select)
 | 
			
		||||
            ->leftJoin('clients', 'accounts.id', '=', 'clients.account_id')
 | 
			
		||||
            ->where('accounts.id', '=', Auth::user()->account_id)
 | 
			
		||||
            ->where('clients.is_deleted', '=', false)
 | 
			
		||||
            ->groupBy('accounts.id')
 | 
			
		||||
            ->groupBy(DB::raw('CASE WHEN clients.currency_id IS NULL THEN CASE WHEN accounts.currency_id IS NULL THEN 1 ELSE accounts.currency_id END ELSE clients.currency_id END'))
 | 
			
		||||
            ->get();
 | 
			
		||||
 | 
			
		||||
        $pastDue = DB::table('invoices')
 | 
			
		||||
                    ->leftJoin('clients', 'clients.id', '=', 'invoices.client_id')
 | 
			
		||||
                    ->leftJoin('contacts', 'contacts.client_id', '=', 'clients.id')
 | 
			
		||||
                    ->where('invoices.account_id', '=', Auth::user()->account_id)
 | 
			
		||||
                    ->where('clients.deleted_at', '=', null)
 | 
			
		||||
                    ->where('contacts.deleted_at', '=', null)
 | 
			
		||||
                    ->where('invoices.is_recurring', '=', false)
 | 
			
		||||
                    //->where('invoices.is_quote', '=', false)
 | 
			
		||||
                    ->where('invoices.balance', '>', 0)
 | 
			
		||||
                    ->where('invoices.is_deleted', '=', false)
 | 
			
		||||
                    ->where('invoices.deleted_at', '=', null)
 | 
			
		||||
                    ->where('contacts.is_primary', '=', true)
 | 
			
		||||
                    ->where('invoices.due_date', '<', date('Y-m-d'));
 | 
			
		||||
 | 
			
		||||
        if(!$view_all){
 | 
			
		||||
            $pastDue = $pastDue->where('invoices.user_id', '=', $user_id);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $pastDue = $pastDue->select(['invoices.due_date', 'invoices.balance', 'invoices.public_id', 'invoices.invoice_number', 'clients.name as client_name', 'contacts.email', 'contacts.first_name', 'contacts.last_name', 'clients.currency_id', 'clients.public_id as client_public_id', 'clients.user_id as client_user_id', 'is_quote'])
 | 
			
		||||
                    ->orderBy('invoices.due_date', 'asc')
 | 
			
		||||
                    ->take(50)
 | 
			
		||||
                    ->get();
 | 
			
		||||
 | 
			
		||||
        $upcoming = DB::table('invoices')
 | 
			
		||||
                    ->leftJoin('clients', 'clients.id', '=', 'invoices.client_id')
 | 
			
		||||
                    ->leftJoin('contacts', 'contacts.client_id', '=', 'clients.id')
 | 
			
		||||
                    ->where('invoices.account_id', '=', Auth::user()->account_id)
 | 
			
		||||
                    ->where('clients.deleted_at', '=', null)
 | 
			
		||||
                    ->where('contacts.deleted_at', '=', null)
 | 
			
		||||
                    ->where('invoices.deleted_at', '=', null)
 | 
			
		||||
                    ->where('invoices.is_recurring', '=', false)
 | 
			
		||||
                    //->where('invoices.is_quote', '=', false)
 | 
			
		||||
                    ->where('invoices.balance', '>', 0)
 | 
			
		||||
                    ->where('invoices.is_deleted', '=', false)
 | 
			
		||||
                    ->where('contacts.is_primary', '=', true)
 | 
			
		||||
                    ->where('invoices.due_date', '>=', date('Y-m-d'))
 | 
			
		||||
                    ->orderBy('invoices.due_date', 'asc');
 | 
			
		||||
 | 
			
		||||
        if(!$view_all){
 | 
			
		||||
            $upcoming = $upcoming->where('invoices.user_id', '=', $user_id);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $upcoming = $upcoming->take(50)
 | 
			
		||||
                    ->select(['invoices.due_date', 'invoices.balance', 'invoices.public_id', 'invoices.invoice_number', 'clients.name as client_name', 'contacts.email', 'contacts.first_name', 'contacts.last_name', 'clients.currency_id', 'clients.public_id as client_public_id', 'clients.user_id as client_user_id', 'is_quote'])
 | 
			
		||||
                    ->get();
 | 
			
		||||
 | 
			
		||||
        $payments = DB::table('payments')
 | 
			
		||||
                    ->leftJoin('clients', 'clients.id', '=', 'payments.client_id')
 | 
			
		||||
                    ->leftJoin('contacts', 'contacts.client_id', '=', 'clients.id')
 | 
			
		||||
                    ->leftJoin('invoices', 'invoices.id', '=', 'payments.invoice_id')
 | 
			
		||||
                    ->where('payments.account_id', '=', Auth::user()->account_id)
 | 
			
		||||
                    ->where('payments.is_deleted', '=', false)
 | 
			
		||||
                    ->where('invoices.is_deleted', '=', false)
 | 
			
		||||
                    ->where('clients.is_deleted', '=', false)
 | 
			
		||||
                    ->where('contacts.deleted_at', '=', null)
 | 
			
		||||
                    ->where('contacts.is_primary', '=', true);
 | 
			
		||||
 | 
			
		||||
        if(!$view_all){
 | 
			
		||||
            $payments = $payments->where('payments.user_id', '=', $user_id);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $payments = $payments->select(['payments.payment_date', 'payments.amount', 'invoices.public_id', 'invoices.invoice_number', 'clients.name as client_name', 'contacts.email', 'contacts.first_name', 'contacts.last_name', 'clients.currency_id', 'clients.public_id as client_public_id', 'clients.user_id as client_user_id'])
 | 
			
		||||
                    ->orderBy('payments.payment_date', 'desc')
 | 
			
		||||
                    ->take(50)
 | 
			
		||||
                    ->get();
 | 
			
		||||
 | 
			
		||||
        $hasQuotes = false;
 | 
			
		||||
        foreach ([$upcoming, $pastDue] as $data) {
 | 
			
		||||
            foreach ($data as $invoice) {
 | 
			
		||||
                if ($invoice->is_quote) {
 | 
			
		||||
                    $hasQuotes = true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        $data = [
 | 
			
		||||
                'id' => 1,
 | 
			
		||||
                'paidToDate' => $paidToDate[0]->value,
 | 
			
		||||
                'paidToDateCurrency' => $paidToDate[0]->currency_id,
 | 
			
		||||
                'balances' => $balances[0]->value,
 | 
			
		||||
                'balancesCurrency' => $balances[0]->currency_id,
 | 
			
		||||
                'averageInvoice' => $averageInvoice[0]->invoice_avg,
 | 
			
		||||
                'averageInvoiceCurrency' => $averageInvoice[0]->currency_id,
 | 
			
		||||
                'invoicesSent' => $metrics ? $metrics->invoices_sent : 0,
 | 
			
		||||
                'activeClients' => $metrics ? $metrics->active_clients : 0,
 | 
			
		||||
            ];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            return $this->response($data);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -45,7 +45,7 @@ class ExpenseController extends BaseController
 | 
			
		||||
        return View::make('list', array(
 | 
			
		||||
            'entityType' => ENTITY_EXPENSE,
 | 
			
		||||
            'title' => trans('texts.expenses'),
 | 
			
		||||
            'sortCol' => '1',
 | 
			
		||||
            'sortCol' => '3',
 | 
			
		||||
            'columns' => Utils::trans([
 | 
			
		||||
              'checkbox',
 | 
			
		||||
              'vendor',
 | 
			
		||||
 | 
			
		||||
@ -52,6 +52,7 @@ class InvoiceController extends BaseController
 | 
			
		||||
        $data = [
 | 
			
		||||
            'title' => trans('texts.invoices'),
 | 
			
		||||
            'entityType' => ENTITY_INVOICE,
 | 
			
		||||
            'sortCol' => '3',
 | 
			
		||||
            'columns' => Utils::trans([
 | 
			
		||||
                'checkbox',
 | 
			
		||||
                'invoice_number',
 | 
			
		||||
@ -88,7 +89,7 @@ class InvoiceController extends BaseController
 | 
			
		||||
    {
 | 
			
		||||
        $account = Auth::user()->account;
 | 
			
		||||
        $invoice = Invoice::scope($publicId)
 | 
			
		||||
                        ->with('invitations', 'account.country', 'client.contacts', 'client.country', 'invoice_items')
 | 
			
		||||
                        ->with('invitations', 'account.country', 'client.contacts', 'client.country', 'invoice_items', 'payments')
 | 
			
		||||
                        ->withTrashed()
 | 
			
		||||
                        ->firstOrFail();
 | 
			
		||||
        
 | 
			
		||||
@ -154,6 +155,14 @@ class InvoiceController extends BaseController
 | 
			
		||||
            if (!$invoice->is_recurring && $invoice->balance > 0) {
 | 
			
		||||
                $actions[] = ['url' => 'javascript:onPaymentClick()', 'label' => trans('texts.enter_payment')];
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            foreach ($invoice->payments as $payment) {
 | 
			
		||||
                $label = trans("texts.view_payment");
 | 
			
		||||
                if (count($invoice->payments) > 1) {
 | 
			
		||||
                    $label .= ' - ' . $account->formatMoney($payment->amount, $invoice->client);   
 | 
			
		||||
                }                
 | 
			
		||||
                $actions[] = ['url' => $payment->present()->url, 'label' => $label];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (count($actions) > 3) {
 | 
			
		||||
 | 
			
		||||
@ -48,6 +48,7 @@ class PaymentController extends BaseController
 | 
			
		||||
        return View::make('list', array(
 | 
			
		||||
            'entityType' => ENTITY_PAYMENT,
 | 
			
		||||
            'title' => trans('texts.payments'),
 | 
			
		||||
            'sortCol' => '6',
 | 
			
		||||
            'columns' => Utils::trans([
 | 
			
		||||
              'checkbox',
 | 
			
		||||
              'invoice',
 | 
			
		||||
@ -641,6 +642,6 @@ class PaymentController extends BaseController
 | 
			
		||||
        $message .= $error ?: trans('texts.payment_error');
 | 
			
		||||
 | 
			
		||||
        Session::flash('error', $message);
 | 
			
		||||
        Utils::logError("Payment Error [{$type}]: " . ($exception ? Utils::getErrorString($exception) : $message));
 | 
			
		||||
        Utils::logError("Payment Error [{$type}]: " . ($exception ? Utils::getErrorString($exception) : $message), 'PHP', true);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -54,6 +54,7 @@ class QuoteController extends BaseController
 | 
			
		||||
        $data = [
 | 
			
		||||
          'title' => trans('texts.quotes'),
 | 
			
		||||
          'entityType' => ENTITY_QUOTE,
 | 
			
		||||
          'sortCol' => '3',
 | 
			
		||||
          'columns' => Utils::trans([
 | 
			
		||||
            'checkbox',
 | 
			
		||||
            'quote_number',
 | 
			
		||||
 | 
			
		||||
@ -354,8 +354,8 @@ class ReportController extends BaseController
 | 
			
		||||
 | 
			
		||||
    private function generateInvoiceReport($startDate, $endDate, $isExport)
 | 
			
		||||
    {
 | 
			
		||||
        $columns = ['client', 'invoice_number', 'invoice_date', 'amount', 'paid', 'balance'];
 | 
			
		||||
 | 
			
		||||
        $columns = ['client', 'invoice_number', 'invoice_date', 'amount', 'payment_date', 'paid', 'method'];
 | 
			
		||||
        
 | 
			
		||||
        $account = Auth::user()->account;
 | 
			
		||||
        $displayData = [];
 | 
			
		||||
        $reportTotals = [];
 | 
			
		||||
@ -379,19 +379,25 @@ class ReportController extends BaseController
 | 
			
		||||
                        }]);
 | 
			
		||||
        
 | 
			
		||||
        foreach ($clients->get() as $client) {
 | 
			
		||||
            $currencyId = $client->currency_id ?: Auth::user()->account->getCurrencyId();
 | 
			
		||||
            foreach ($client->invoices as $invoice) {               
 | 
			
		||||
                
 | 
			
		||||
                $payments = count($invoice->payments) ? $invoice->payments : [false];
 | 
			
		||||
                foreach ($payments as $payment) {
 | 
			
		||||
                    $displayData[] = [
 | 
			
		||||
                        $isExport ? $client->getDisplayName() : $client->present()->link,
 | 
			
		||||
                        $isExport ? $invoice->invoice_number : $invoice->present()->link,
 | 
			
		||||
                        $invoice->present()->invoice_date,
 | 
			
		||||
                        $account->formatMoney($invoice->amount, $client),
 | 
			
		||||
                        $payment ? $payment->present()->payment_date : '',
 | 
			
		||||
                        $payment ? $account->formatMoney($payment->amount, $client) : '',
 | 
			
		||||
                        $payment ? $payment->present()->method : '',
 | 
			
		||||
                    ];          
 | 
			
		||||
                    if ($payment) {
 | 
			
		||||
                        $reportTotals = $this->addToTotals($reportTotals, $client->currency_id, 'paid', $payment->amount);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            foreach ($client->invoices as $invoice) {
 | 
			
		||||
                $displayData[] = [
 | 
			
		||||
                    $isExport ? $client->getDisplayName() : $client->present()->link,
 | 
			
		||||
                    $isExport ? $invoice->invoice_number : $invoice->present()->link,
 | 
			
		||||
                    $invoice->present()->invoice_date,
 | 
			
		||||
                    $account->formatMoney($invoice->amount, $client),
 | 
			
		||||
                    $account->formatMoney($invoice->getAmountPaid(), $client),
 | 
			
		||||
                    $account->formatMoney($invoice->balance, $client),
 | 
			
		||||
                ];
 | 
			
		||||
                $reportTotals = $this->addToTotals($reportTotals, $client->currency_id, 'amount', $invoice->amount);
 | 
			
		||||
                $reportTotals = $this->addToTotals($reportTotals, $client->currency_id, 'paid', $invoice->getAmountPaid());
 | 
			
		||||
                $reportTotals = $this->addToTotals($reportTotals, $client->currency_id, 'balance', $invoice->balance);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -77,7 +77,6 @@ class UserController extends BaseController
 | 
			
		||||
            'user' => $user,
 | 
			
		||||
            'method' => 'PUT',
 | 
			
		||||
            'url' => 'users/'.$publicId,
 | 
			
		||||
            'title' => trans('texts.edit_user'),
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return View::make('users.edit', $data);
 | 
			
		||||
@ -120,7 +119,6 @@ class UserController extends BaseController
 | 
			
		||||
          'user' => null,
 | 
			
		||||
          'method' => 'POST',
 | 
			
		||||
          'url' => 'users',
 | 
			
		||||
          'title' => trans('texts.add_user'),
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return View::make('users.edit', $data);
 | 
			
		||||
 | 
			
		||||
@ -257,6 +257,7 @@ Route::group(['middleware' => 'api', 'prefix' => 'api/v1'], function()
 | 
			
		||||
    Route::resource('expenses','ExpenseApiController');
 | 
			
		||||
    Route::post('add_token', 'AccountApiController@addDeviceToken');
 | 
			
		||||
    Route::post('update_notifications', 'AccountApiController@updatePushNotifications');
 | 
			
		||||
    Route::get('dashboard', 'DashboardApiController@index');
 | 
			
		||||
 | 
			
		||||
    // Vendor
 | 
			
		||||
    Route::resource('vendors', 'VendorApiController');
 | 
			
		||||
@ -508,6 +509,8 @@ if (!defined('CONTACT_EMAIL')) {
 | 
			
		||||
    define('GATEWAY_PAYFAST', 13);
 | 
			
		||||
    define('GATEWAY_PAYPAL_EXPRESS', 17);
 | 
			
		||||
    define('GATEWAY_PAYPAL_PRO', 18);
 | 
			
		||||
    define('GATEWAY_SAGE_PAY_DIRECT', 20);
 | 
			
		||||
    define('GATEWAY_SAGE_PAY_SERVER', 21);
 | 
			
		||||
    define('GATEWAY_STRIPE', 23);
 | 
			
		||||
    define('GATEWAY_GOCARDLESS', 6);
 | 
			
		||||
    define('GATEWAY_TWO_CHECKOUT', 27);
 | 
			
		||||
@ -532,7 +535,7 @@ if (!defined('CONTACT_EMAIL')) {
 | 
			
		||||
    define('NINJA_GATEWAY_CONFIG', 'NINJA_GATEWAY_CONFIG');
 | 
			
		||||
    define('NINJA_WEB_URL', 'https://www.invoiceninja.com');
 | 
			
		||||
    define('NINJA_APP_URL', 'https://app.invoiceninja.com');
 | 
			
		||||
    define('NINJA_VERSION', '2.5.0.4');
 | 
			
		||||
    define('NINJA_VERSION', '2.5.1.1');
 | 
			
		||||
    define('NINJA_DATE', '2000-01-01');
 | 
			
		||||
 | 
			
		||||
    define('SOCIAL_LINK_FACEBOOK', 'https://www.facebook.com/invoiceninja');
 | 
			
		||||
@ -705,4 +708,4 @@ if (Utils::isNinjaDev())
 | 
			
		||||
  //ini_set('memory_limit','1024M');
 | 
			
		||||
  //Auth::loginUsingId(1);
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
*/
 | 
			
		||||
@ -247,7 +247,7 @@ class Utils
 | 
			
		||||
        return  "***{$class}*** [{$code}] : {$exception->getFile()} [Line {$exception->getLine()}] => {$exception->getMessage()}";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static function logError($error, $context = 'PHP')
 | 
			
		||||
    public static function logError($error, $context = 'PHP', $info = false)
 | 
			
		||||
    {
 | 
			
		||||
        if ($error instanceof Exception) {
 | 
			
		||||
            $error = self::getErrorString($error);
 | 
			
		||||
@ -271,7 +271,11 @@ class Utils
 | 
			
		||||
            'count' => Session::get('error_count', 0),
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        Log::error($error."\n", $data);
 | 
			
		||||
        if ($info) {
 | 
			
		||||
            Log::info($error."\n", $data);
 | 
			
		||||
        } else {
 | 
			
		||||
            Log::error($error."\n", $data);    
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
        Mail::queue('emails.error', ['message'=>$error.' '.json_encode($data)], function($message)
 | 
			
		||||
@ -620,8 +624,8 @@ class Utils
 | 
			
		||||
 | 
			
		||||
    private static function getMonth($offset)
 | 
			
		||||
    {
 | 
			
		||||
        $months = [ "January", "February", "March", "April", "May", "June",
 | 
			
		||||
            "July", "August", "September", "October", "November", "December", ];
 | 
			
		||||
        $months = [ "january", "february", "march", "april", "may", "june",
 | 
			
		||||
            "july", "august", "september", "october", "november", "december", ];
 | 
			
		||||
 | 
			
		||||
        $month = intval(date('n')) - 1;
 | 
			
		||||
 | 
			
		||||
@ -632,7 +636,7 @@ class Utils
 | 
			
		||||
            $month += 12;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $months[$month];
 | 
			
		||||
        return trans('texts.' . $months[$month]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static function getQuarter($offset)
 | 
			
		||||
 | 
			
		||||
@ -683,7 +683,7 @@ class Account extends Eloquent
 | 
			
		||||
            'subtotal',
 | 
			
		||||
            'paid_to_date',
 | 
			
		||||
            'balance_due',
 | 
			
		||||
            'amount_due',
 | 
			
		||||
            'partial_due',
 | 
			
		||||
            'terms',
 | 
			
		||||
            'your_invoice',
 | 
			
		||||
            'quote',
 | 
			
		||||
@ -1023,7 +1023,7 @@ class Account extends Eloquent
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function showCustomField($field, $entity)
 | 
			
		||||
    public function showCustomField($field, $entity = false)
 | 
			
		||||
    {
 | 
			
		||||
        if ($this->isPro()) {
 | 
			
		||||
            return $this->$field ? true : false;
 | 
			
		||||
 | 
			
		||||
@ -75,6 +75,8 @@ class Gateway extends Eloquent
 | 
			
		||||
            $link = 'https://bitpay.com/dashboard/signup';
 | 
			
		||||
        } elseif ($this->id == GATEWAY_DWOLLA) {
 | 
			
		||||
            $link = 'https://www.dwolla.com/register';
 | 
			
		||||
        } elseif ($this->id == GATEWAY_SAGE_PAY_DIRECT || $this->id == GATEWAY_SAGE_PAY_SERVER) {
 | 
			
		||||
            $link = 'https://applications.sagepay.com/apply/2C02C252-0F8A-1B84-E10D-CF933EFCAA99';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $key = 'texts.gateway_help_'.$this->id;
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@ use DB;
 | 
			
		||||
use Carbon;
 | 
			
		||||
use App\Events\VendorWasCreated;
 | 
			
		||||
use App\Events\VendorWasUpdated;
 | 
			
		||||
use App\Events\VendorWasDeleted;
 | 
			
		||||
use Laracasts\Presenter\PresentableTrait;
 | 
			
		||||
use Illuminate\Database\Eloquent\SoftDeletes;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -81,7 +81,7 @@ class Mailer
 | 
			
		||||
            $emailError = $exception->getMessage();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Utils::logError("Email Error: $emailError");
 | 
			
		||||
        //Utils::logError("Email Error: $emailError");
 | 
			
		||||
        
 | 
			
		||||
        if (isset($data['invitation'])) {
 | 
			
		||||
            $invitation = $data['invitation'];
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,7 @@ class InvoicePresenter extends Presenter {
 | 
			
		||||
    public function balanceDueLabel()
 | 
			
		||||
    {
 | 
			
		||||
        if ($this->entity->partial) {
 | 
			
		||||
            return 'amount_due';
 | 
			
		||||
            return 'partial_due';
 | 
			
		||||
        } elseif ($this->entity->is_quote) {
 | 
			
		||||
            return 'total';
 | 
			
		||||
        } else {
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,6 @@
 | 
			
		||||
<?php namespace App\Ninja\Presenters;
 | 
			
		||||
 | 
			
		||||
use URL;
 | 
			
		||||
use Utils;
 | 
			
		||||
use Laracasts\Presenter\Presenter;
 | 
			
		||||
 | 
			
		||||
@ -24,4 +25,14 @@ class PaymentPresenter extends Presenter {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function url()
 | 
			
		||||
    {
 | 
			
		||||
        return URL::to('/payments/' . $this->entity->public_id . '/edit');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function link()
 | 
			
		||||
    {
 | 
			
		||||
        return link_to('/payments/' . $this->entity->public_id . '/edit', $this->entity->getDisplayName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -58,4 +58,9 @@ if (strstr($_SERVER['HTTP_USER_AGENT'], 'PhantomJS') && Utils::isNinjaDev()) {
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Write info messages to a separate file
 | 
			
		||||
$app->configureMonologUsing(function($monolog) {
 | 
			
		||||
    $monolog->pushHandler(new Monolog\Handler\StreamHandler(storage_path() . '/logs/laravel-info.log', Monolog\Logger::INFO, false));
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
return $app;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										229
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										229
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							@ -123,12 +123,12 @@
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/formers/former.git",
 | 
			
		||||
                "reference": "795f7b9b200a4ff4a33b37a96eaaab0229e36325"
 | 
			
		||||
                "reference": "d97f907741323b390f43954a90a227921ecc6b96"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/formers/former/zipball/795f7b9b200a4ff4a33b37a96eaaab0229e36325",
 | 
			
		||||
                "reference": "795f7b9b200a4ff4a33b37a96eaaab0229e36325",
 | 
			
		||||
                "url": "https://api.github.com/repos/formers/former/zipball/d97f907741323b390f43954a90a227921ecc6b96",
 | 
			
		||||
                "reference": "d97f907741323b390f43954a90a227921ecc6b96",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -174,7 +174,7 @@
 | 
			
		||||
                "foundation",
 | 
			
		||||
                "laravel"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2015-11-05 15:53:52"
 | 
			
		||||
            "time": "2016-03-16 01:43:45"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "anahkiasen/html-object",
 | 
			
		||||
@ -381,12 +381,12 @@
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/barryvdh/laravel-ide-helper.git",
 | 
			
		||||
                "reference": "19553f63e4635480363ff2254350075f285fbbc5"
 | 
			
		||||
                "reference": "e97ed532f09e290b91ff7713b785ed7ab11d0812"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/19553f63e4635480363ff2254350075f285fbbc5",
 | 
			
		||||
                "reference": "19553f63e4635480363ff2254350075f285fbbc5",
 | 
			
		||||
                "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/e97ed532f09e290b91ff7713b785ed7ab11d0812",
 | 
			
		||||
                "reference": "e97ed532f09e290b91ff7713b785ed7ab11d0812",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -436,7 +436,7 @@
 | 
			
		||||
                "phpstorm",
 | 
			
		||||
                "sublime"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2016-03-02 10:03:09"
 | 
			
		||||
            "time": "2016-03-03 14:38:04"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "cardgate/omnipay-cardgate",
 | 
			
		||||
@ -579,7 +579,7 @@
 | 
			
		||||
                "laravel"
 | 
			
		||||
            ],
 | 
			
		||||
            "abandoned": "OpenSkill/Datatable",
 | 
			
		||||
            "time": "2015-11-23 21:33:41"
 | 
			
		||||
            "time": "2015-04-29 07:00:36"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "classpreloader/classpreloader",
 | 
			
		||||
@ -880,12 +880,12 @@
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/delatbabel/omnipay-fatzebra.git",
 | 
			
		||||
                "reference": "7b3cb869abe8327d4cf6ccc6591a89a95c02bfbc"
 | 
			
		||||
                "reference": "d0a56a8704357d91457672741a48a4cb6c7ecd53"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/delatbabel/omnipay-fatzebra/zipball/7b3cb869abe8327d4cf6ccc6591a89a95c02bfbc",
 | 
			
		||||
                "reference": "7b3cb869abe8327d4cf6ccc6591a89a95c02bfbc",
 | 
			
		||||
                "url": "https://api.github.com/repos/delatbabel/omnipay-fatzebra/zipball/d0a56a8704357d91457672741a48a4cb6c7ecd53",
 | 
			
		||||
                "reference": "d0a56a8704357d91457672741a48a4cb6c7ecd53",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -929,7 +929,7 @@
 | 
			
		||||
                "payment",
 | 
			
		||||
                "paystream"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2015-02-15 11:27:23"
 | 
			
		||||
            "time": "2016-03-21 09:21:14"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "dercoder/omnipay-ecopayz",
 | 
			
		||||
@ -1039,12 +1039,12 @@
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/descubraomundo/omnipay-pagarme.git",
 | 
			
		||||
                "reference": "528953568929b57189de16fa7431eaab75d61840"
 | 
			
		||||
                "reference": "8571396139eb1fb1a7011450714a5e8d8d604d8c"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/descubraomundo/omnipay-pagarme/zipball/528953568929b57189de16fa7431eaab75d61840",
 | 
			
		||||
                "reference": "528953568929b57189de16fa7431eaab75d61840",
 | 
			
		||||
                "url": "https://api.github.com/repos/descubraomundo/omnipay-pagarme/zipball/8571396139eb1fb1a7011450714a5e8d8d604d8c",
 | 
			
		||||
                "reference": "8571396139eb1fb1a7011450714a5e8d8d604d8c",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -1081,7 +1081,7 @@
 | 
			
		||||
                "pay",
 | 
			
		||||
                "payment"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2015-10-27 19:17:20"
 | 
			
		||||
            "time": "2016-03-18 19:37:37"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "dioscouri/omnipay-cybersource",
 | 
			
		||||
@ -1938,16 +1938,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "guzzlehttp/guzzle",
 | 
			
		||||
            "version": "6.1.1",
 | 
			
		||||
            "version": "6.2.0",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/guzzle/guzzle.git",
 | 
			
		||||
                "reference": "c6851d6e48f63b69357cbfa55bca116448140e0c"
 | 
			
		||||
                "reference": "d094e337976dff9d8e2424e8485872194e768662"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/c6851d6e48f63b69357cbfa55bca116448140e0c",
 | 
			
		||||
                "reference": "c6851d6e48f63b69357cbfa55bca116448140e0c",
 | 
			
		||||
                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d094e337976dff9d8e2424e8485872194e768662",
 | 
			
		||||
                "reference": "d094e337976dff9d8e2424e8485872194e768662",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -1963,7 +1963,7 @@
 | 
			
		||||
            "type": "library",
 | 
			
		||||
            "extra": {
 | 
			
		||||
                "branch-alias": {
 | 
			
		||||
                    "dev-master": "6.1-dev"
 | 
			
		||||
                    "dev-master": "6.2-dev"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "autoload": {
 | 
			
		||||
@ -1996,20 +1996,20 @@
 | 
			
		||||
                "rest",
 | 
			
		||||
                "web service"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2015-11-23 00:47:50"
 | 
			
		||||
            "time": "2016-03-21 20:02:09"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "guzzlehttp/promises",
 | 
			
		||||
            "version": "1.0.3",
 | 
			
		||||
            "version": "1.1.0",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/guzzle/promises.git",
 | 
			
		||||
                "reference": "b1e1c0d55f8083c71eda2c28c12a228d708294ea"
 | 
			
		||||
                "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/guzzle/promises/zipball/b1e1c0d55f8083c71eda2c28c12a228d708294ea",
 | 
			
		||||
                "reference": "b1e1c0d55f8083c71eda2c28c12a228d708294ea",
 | 
			
		||||
                "url": "https://api.github.com/repos/guzzle/promises/zipball/bb9024c526b22f3fe6ae55a561fd70653d470aa8",
 | 
			
		||||
                "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -2047,7 +2047,7 @@
 | 
			
		||||
            "keywords": [
 | 
			
		||||
                "promise"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2015-10-15 22:28:00"
 | 
			
		||||
            "time": "2016-03-08 01:15:46"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "guzzlehttp/psr7",
 | 
			
		||||
@ -2603,12 +2603,12 @@
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/labs7in0/omnipay-wechat.git",
 | 
			
		||||
                "reference": "4e279ff4535dfa0636a3d6af5c92b8e9dcc4311a"
 | 
			
		||||
                "reference": "40c9f86df6573ad98ae1dd0d29712ccbc789a74e"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/labs7in0/omnipay-wechat/zipball/4e279ff4535dfa0636a3d6af5c92b8e9dcc4311a",
 | 
			
		||||
                "reference": "4e279ff4535dfa0636a3d6af5c92b8e9dcc4311a",
 | 
			
		||||
                "url": "https://api.github.com/repos/labs7in0/omnipay-wechat/zipball/40c9f86df6573ad98ae1dd0d29712ccbc789a74e",
 | 
			
		||||
                "reference": "40c9f86df6573ad98ae1dd0d29712ccbc789a74e",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -2644,7 +2644,7 @@
 | 
			
		||||
                "purchase",
 | 
			
		||||
                "wechat"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2015-11-16 11:04:21"
 | 
			
		||||
            "time": "2016-03-18 09:59:11"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "laracasts/presenter",
 | 
			
		||||
@ -2694,16 +2694,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "laravel/framework",
 | 
			
		||||
            "version": "v5.2.22",
 | 
			
		||||
            "version": "v5.2.24",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/laravel/framework.git",
 | 
			
		||||
                "reference": "aec1b7cb9ec0bac0107361a3730cac9b6f945ef4"
 | 
			
		||||
                "reference": "396297a5fd3c70c2fc1af68f09ee574a2380175c"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/laravel/framework/zipball/aec1b7cb9ec0bac0107361a3730cac9b6f945ef4",
 | 
			
		||||
                "reference": "aec1b7cb9ec0bac0107361a3730cac9b6f945ef4",
 | 
			
		||||
                "url": "https://api.github.com/repos/laravel/framework/zipball/396297a5fd3c70c2fc1af68f09ee574a2380175c",
 | 
			
		||||
                "reference": "396297a5fd3c70c2fc1af68f09ee574a2380175c",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -2716,7 +2716,7 @@
 | 
			
		||||
                "monolog/monolog": "~1.11",
 | 
			
		||||
                "mtdowling/cron-expression": "~1.0",
 | 
			
		||||
                "nesbot/carbon": "~1.20",
 | 
			
		||||
                "paragonie/random_compat": "~1.1",
 | 
			
		||||
                "paragonie/random_compat": "~1.4",
 | 
			
		||||
                "php": ">=5.5.9",
 | 
			
		||||
                "psy/psysh": "0.7.*",
 | 
			
		||||
                "swiftmailer/swiftmailer": "~5.1",
 | 
			
		||||
@ -2818,7 +2818,7 @@
 | 
			
		||||
                "framework",
 | 
			
		||||
                "laravel"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2016-02-27 22:09:19"
 | 
			
		||||
            "time": "2016-03-22 13:45:19"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "laravel/socialite",
 | 
			
		||||
@ -2975,16 +2975,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "league/flysystem",
 | 
			
		||||
            "version": "1.0.17",
 | 
			
		||||
            "version": "1.0.20",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/thephpleague/flysystem.git",
 | 
			
		||||
                "reference": "02f5b6c9a8b9278c8381e3361e7bd9d641c740ca"
 | 
			
		||||
                "reference": "e87a786e3ae12a25cf78a71bb07b4b384bfaa83a"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/02f5b6c9a8b9278c8381e3361e7bd9d641c740ca",
 | 
			
		||||
                "reference": "02f5b6c9a8b9278c8381e3361e7bd9d641c740ca",
 | 
			
		||||
                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e87a786e3ae12a25cf78a71bb07b4b384bfaa83a",
 | 
			
		||||
                "reference": "e87a786e3ae12a25cf78a71bb07b4b384bfaa83a",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -3054,7 +3054,7 @@
 | 
			
		||||
                "sftp",
 | 
			
		||||
                "storage"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2016-02-19 15:35:38"
 | 
			
		||||
            "time": "2016-03-14 21:54:11"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "league/fractal",
 | 
			
		||||
@ -3587,16 +3587,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "monolog/monolog",
 | 
			
		||||
            "version": "1.18.0",
 | 
			
		||||
            "version": "1.18.1",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/Seldaek/monolog.git",
 | 
			
		||||
                "reference": "e19b764b5c855580e8ffa7e615f72c10fd2f99cc"
 | 
			
		||||
                "reference": "a5f2734e8c16f3aa21b3da09715d10e15b4d2d45"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/e19b764b5c855580e8ffa7e615f72c10fd2f99cc",
 | 
			
		||||
                "reference": "e19b764b5c855580e8ffa7e615f72c10fd2f99cc",
 | 
			
		||||
                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/a5f2734e8c16f3aa21b3da09715d10e15b4d2d45",
 | 
			
		||||
                "reference": "a5f2734e8c16f3aa21b3da09715d10e15b4d2d45",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -3661,7 +3661,7 @@
 | 
			
		||||
                "logging",
 | 
			
		||||
                "psr-3"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2016-03-01 18:00:40"
 | 
			
		||||
            "time": "2016-03-13 16:08:35"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "mtdowling/cron-expression",
 | 
			
		||||
@ -3815,7 +3815,7 @@
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/thephpleague/omnipay-2checkout/zipball/31394ce58d5999b6f49b321cb3547747837c1297",
 | 
			
		||||
                "url": "https://api.github.com/repos/thephpleague/omnipay-2checkout/zipball/77b316bd08c6b7a1e93721f15d1bfbd21a62ba6b",
 | 
			
		||||
                "reference": "e9c079c2dde0d7ba461903b3b7bd5caf6dee1248",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
@ -3866,16 +3866,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "omnipay/authorizenet",
 | 
			
		||||
            "version": "v2.3.0",
 | 
			
		||||
            "version": "2.3.1",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/thephpleague/omnipay-authorizenet.git",
 | 
			
		||||
                "reference": "142a95f550a5320db09e66019ecf5c8b8c3885b9"
 | 
			
		||||
                "reference": "e2e813b0b6306ef97b8763037f05476456546b3e"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/thephpleague/omnipay-authorizenet/zipball/142a95f550a5320db09e66019ecf5c8b8c3885b9",
 | 
			
		||||
                "reference": "142a95f550a5320db09e66019ecf5c8b8c3885b9",
 | 
			
		||||
                "url": "https://api.github.com/repos/thephpleague/omnipay-authorizenet/zipball/e2e813b0b6306ef97b8763037f05476456546b3e",
 | 
			
		||||
                "reference": "e2e813b0b6306ef97b8763037f05476456546b3e",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -3921,7 +3921,7 @@
 | 
			
		||||
                "pay",
 | 
			
		||||
                "payment"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2015-07-15 18:11:17"
 | 
			
		||||
            "time": "2016-03-10 11:35:24"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "omnipay/bitpay",
 | 
			
		||||
@ -3929,12 +3929,12 @@
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/thephpleague/omnipay-bitpay.git",
 | 
			
		||||
                "reference": "e659f0e993c586cb36acafaf50835570b4a16eb2"
 | 
			
		||||
                "reference": "cf813f1d5436a1d2f942d3df6666695d1e2b5280"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/thephpleague/omnipay-bitpay/zipball/e659f0e993c586cb36acafaf50835570b4a16eb2",
 | 
			
		||||
                "reference": "e659f0e993c586cb36acafaf50835570b4a16eb2",
 | 
			
		||||
                "url": "https://api.github.com/repos/thephpleague/omnipay-bitpay/zipball/cf813f1d5436a1d2f942d3df6666695d1e2b5280",
 | 
			
		||||
                "reference": "cf813f1d5436a1d2f942d3df6666695d1e2b5280",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -3979,7 +3979,7 @@
 | 
			
		||||
                "pay",
 | 
			
		||||
                "payment"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2015-03-23 14:18:26"
 | 
			
		||||
            "time": "2016-03-10 03:16:04"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "omnipay/buckaroo",
 | 
			
		||||
@ -4328,16 +4328,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "omnipay/eway",
 | 
			
		||||
            "version": "v2.2.0",
 | 
			
		||||
            "version": "v2.2.1",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/thephpleague/omnipay-eway.git",
 | 
			
		||||
                "reference": "0dcf28596f0382fbfc3ee229e98e60798675ed16"
 | 
			
		||||
                "reference": "1c953630f7097bfdeed200b17a847015a4df5607"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/thephpleague/omnipay-eway/zipball/0dcf28596f0382fbfc3ee229e98e60798675ed16",
 | 
			
		||||
                "reference": "0dcf28596f0382fbfc3ee229e98e60798675ed16",
 | 
			
		||||
                "url": "https://api.github.com/repos/thephpleague/omnipay-eway/zipball/1c953630f7097bfdeed200b17a847015a4df5607",
 | 
			
		||||
                "reference": "1c953630f7097bfdeed200b17a847015a4df5607",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -4381,7 +4381,7 @@
 | 
			
		||||
                "pay",
 | 
			
		||||
                "payment"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2015-03-30 00:28:33"
 | 
			
		||||
            "time": "2016-03-22 01:11:02"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "omnipay/firstdata",
 | 
			
		||||
@ -5536,16 +5536,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "paragonie/random_compat",
 | 
			
		||||
            "version": "v1.2.1",
 | 
			
		||||
            "version": "v1.4.1",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/paragonie/random_compat.git",
 | 
			
		||||
                "reference": "f078eba3bcf140fd69b5fcc3ea5ac809abf729dc"
 | 
			
		||||
                "reference": "c7e26a21ba357863de030f0b9e701c7d04593774"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/f078eba3bcf140fd69b5fcc3ea5ac809abf729dc",
 | 
			
		||||
                "reference": "f078eba3bcf140fd69b5fcc3ea5ac809abf729dc",
 | 
			
		||||
                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/c7e26a21ba357863de030f0b9e701c7d04593774",
 | 
			
		||||
                "reference": "c7e26a21ba357863de030f0b9e701c7d04593774",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -5580,7 +5580,7 @@
 | 
			
		||||
                "pseudorandom",
 | 
			
		||||
                "random"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2016-02-29 17:25:04"
 | 
			
		||||
            "time": "2016-03-18 20:34:03"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "patricktalmadge/bootstrapper",
 | 
			
		||||
@ -5836,16 +5836,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "psy/psysh",
 | 
			
		||||
            "version": "v0.7.1",
 | 
			
		||||
            "version": "v0.7.2",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/bobthecow/psysh.git",
 | 
			
		||||
                "reference": "5e8cedbe0a3681f18782594eefc78423f8401fc8"
 | 
			
		||||
                "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/bobthecow/psysh/zipball/5e8cedbe0a3681f18782594eefc78423f8401fc8",
 | 
			
		||||
                "reference": "5e8cedbe0a3681f18782594eefc78423f8401fc8",
 | 
			
		||||
                "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e64e10b20f8d229cac76399e1f3edddb57a0f280",
 | 
			
		||||
                "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -5904,20 +5904,20 @@
 | 
			
		||||
                "interactive",
 | 
			
		||||
                "shell"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2016-02-27 18:59:18"
 | 
			
		||||
            "time": "2016-03-09 05:03:14"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "samvaughton/omnipay-barclays-epdq",
 | 
			
		||||
            "version": "2.1.1",
 | 
			
		||||
            "version": "2.2.0",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/samvaughton/omnipay-barclays-epdq.git",
 | 
			
		||||
                "reference": "f971de37aa40c72cc58f02d05f540a93b2c5958e"
 | 
			
		||||
                "reference": "b7f9263afa73b8e6c3c5e8bb2bf04a82548a41da"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/samvaughton/omnipay-barclays-epdq/zipball/f971de37aa40c72cc58f02d05f540a93b2c5958e",
 | 
			
		||||
                "reference": "f971de37aa40c72cc58f02d05f540a93b2c5958e",
 | 
			
		||||
                "url": "https://api.github.com/repos/samvaughton/omnipay-barclays-epdq/zipball/b7f9263afa73b8e6c3c5e8bb2bf04a82548a41da",
 | 
			
		||||
                "reference": "b7f9263afa73b8e6c3c5e8bb2bf04a82548a41da",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -5966,7 +5966,7 @@
 | 
			
		||||
                "pay",
 | 
			
		||||
                "payment"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2015-05-07 14:45:43"
 | 
			
		||||
            "time": "2016-03-03 14:40:27"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "simshaun/recurr",
 | 
			
		||||
@ -6716,7 +6716,7 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "symfony/polyfill-mbstring",
 | 
			
		||||
            "version": "v1.1.0",
 | 
			
		||||
            "version": "v1.1.1",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/symfony/polyfill-mbstring.git",
 | 
			
		||||
@ -6775,16 +6775,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "symfony/polyfill-php54",
 | 
			
		||||
            "version": "v1.1.0",
 | 
			
		||||
            "version": "v1.1.1",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/symfony/polyfill-php54.git",
 | 
			
		||||
                "reference": "74663d5a2ff3c530c1bc0571500e0feec9094054"
 | 
			
		||||
                "reference": "9ba741ca01c77282ecf5796c2c1d667f03454ffb"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/74663d5a2ff3c530c1bc0571500e0feec9094054",
 | 
			
		||||
                "reference": "74663d5a2ff3c530c1bc0571500e0feec9094054",
 | 
			
		||||
                "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/9ba741ca01c77282ecf5796c2c1d667f03454ffb",
 | 
			
		||||
                "reference": "9ba741ca01c77282ecf5796c2c1d667f03454ffb",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -6829,11 +6829,11 @@
 | 
			
		||||
                "portable",
 | 
			
		||||
                "shim"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2016-01-20 09:13:37"
 | 
			
		||||
            "time": "2016-01-25 19:13:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "symfony/polyfill-php55",
 | 
			
		||||
            "version": "v1.1.0",
 | 
			
		||||
            "version": "v1.1.1",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/symfony/polyfill-php55.git",
 | 
			
		||||
@ -6889,7 +6889,7 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "symfony/polyfill-php56",
 | 
			
		||||
            "version": "v1.1.0",
 | 
			
		||||
            "version": "v1.1.1",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/symfony/polyfill-php56.git",
 | 
			
		||||
@ -6945,7 +6945,7 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "symfony/polyfill-util",
 | 
			
		||||
            "version": "v1.1.0",
 | 
			
		||||
            "version": "v1.1.1",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/symfony/polyfill-util.git",
 | 
			
		||||
@ -8211,41 +8211,42 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "codeception/codeception",
 | 
			
		||||
            "version": "2.1.6",
 | 
			
		||||
            "version": "2.1.7",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/Codeception/Codeception.git",
 | 
			
		||||
                "reference": "b199941f5e59d1e7fd32d78296c8ab98db873d89"
 | 
			
		||||
                "reference": "65971b0dee4972710365b6102154cd412a9bf7b1"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/Codeception/Codeception/zipball/b199941f5e59d1e7fd32d78296c8ab98db873d89",
 | 
			
		||||
                "reference": "b199941f5e59d1e7fd32d78296c8ab98db873d89",
 | 
			
		||||
                "url": "https://api.github.com/repos/Codeception/Codeception/zipball/65971b0dee4972710365b6102154cd412a9bf7b1",
 | 
			
		||||
                "reference": "65971b0dee4972710365b6102154cd412a9bf7b1",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
                "ext-json": "*",
 | 
			
		||||
                "ext-mbstring": "*",
 | 
			
		||||
                "facebook/webdriver": ">=1.0.1",
 | 
			
		||||
                "facebook/webdriver": ">=1.0.1 <2.0",
 | 
			
		||||
                "guzzlehttp/guzzle": ">=4.1.4 <7.0",
 | 
			
		||||
                "guzzlehttp/psr7": "~1.0",
 | 
			
		||||
                "php": ">=5.4.0",
 | 
			
		||||
                "phpunit/phpunit": "~4.8.0",
 | 
			
		||||
                "symfony/browser-kit": ">=2.4|<3.1",
 | 
			
		||||
                "symfony/console": ">=2.4|<3.1",
 | 
			
		||||
                "symfony/css-selector": ">=2.4|<3.1",
 | 
			
		||||
                "symfony/dom-crawler": ">=2.4|<3.1",
 | 
			
		||||
                "symfony/event-dispatcher": ">=2.4|<3.1",
 | 
			
		||||
                "symfony/finder": ">=2.4|<3.1",
 | 
			
		||||
                "symfony/yaml": ">=2.4|<3.1"
 | 
			
		||||
                "php": ">=5.4.0 <8.0",
 | 
			
		||||
                "phpunit/php-code-coverage": ">=2.1.3",
 | 
			
		||||
                "phpunit/phpunit": ">4.8.20 <6.0",
 | 
			
		||||
                "symfony/browser-kit": ">=2.5 <3.1",
 | 
			
		||||
                "symfony/console": ">=2.5 <3.1",
 | 
			
		||||
                "symfony/css-selector": ">=2.5 <3.1",
 | 
			
		||||
                "symfony/dom-crawler": ">=2.5 <3.1",
 | 
			
		||||
                "symfony/event-dispatcher": ">=2.5 <3.1",
 | 
			
		||||
                "symfony/finder": ">=2.5 <3.1",
 | 
			
		||||
                "symfony/yaml": ">=2.5 <3.1"
 | 
			
		||||
            },
 | 
			
		||||
            "require-dev": {
 | 
			
		||||
                "codeception/specify": "~0.3",
 | 
			
		||||
                "facebook/php-sdk-v4": "~4.0",
 | 
			
		||||
                "facebook/php-sdk-v4": "~5.0",
 | 
			
		||||
                "flow/jsonpath": "~0.2",
 | 
			
		||||
                "monolog/monolog": "~1.8",
 | 
			
		||||
                "pda/pheanstalk": "~2.0",
 | 
			
		||||
                "videlalvaro/php-amqplib": "~2.4"
 | 
			
		||||
                "php-amqplib/php-amqplib": "~2.4"
 | 
			
		||||
            },
 | 
			
		||||
            "suggest": {
 | 
			
		||||
                "codeception/phpbuiltinserver": "Extension to start and stop PHP built-in web server for your tests",
 | 
			
		||||
@ -8287,7 +8288,7 @@
 | 
			
		||||
                "functional testing",
 | 
			
		||||
                "unit testing"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2016-02-09 22:27:48"
 | 
			
		||||
            "time": "2016-03-12 01:15:25"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "doctrine/instantiator",
 | 
			
		||||
@ -8474,16 +8475,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "phpspec/phpspec",
 | 
			
		||||
            "version": "2.4.1",
 | 
			
		||||
            "version": "2.5.0",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/phpspec/phpspec.git",
 | 
			
		||||
                "reference": "5528ce1e93a1efa090c9404aba3395c329b4e6ed"
 | 
			
		||||
                "reference": "385ecb015e97c13818074f1517928b24d4a26067"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/phpspec/phpspec/zipball/5528ce1e93a1efa090c9404aba3395c329b4e6ed",
 | 
			
		||||
                "reference": "5528ce1e93a1efa090c9404aba3395c329b4e6ed",
 | 
			
		||||
                "url": "https://api.github.com/repos/phpspec/phpspec/zipball/385ecb015e97c13818074f1517928b24d4a26067",
 | 
			
		||||
                "reference": "385ecb015e97c13818074f1517928b24d4a26067",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -8548,7 +8549,7 @@
 | 
			
		||||
                "testing",
 | 
			
		||||
                "tests"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2016-01-01 10:17:54"
 | 
			
		||||
            "time": "2016-03-20 20:34:32"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "phpspec/prophecy",
 | 
			
		||||
@ -8854,16 +8855,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "phpunit/phpunit",
 | 
			
		||||
            "version": "4.8.23",
 | 
			
		||||
            "version": "4.8.24",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/sebastianbergmann/phpunit.git",
 | 
			
		||||
                "reference": "6e351261f9cd33daf205a131a1ba61c6d33bd483"
 | 
			
		||||
                "reference": "a1066c562c52900a142a0e2bbf0582994671385e"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6e351261f9cd33daf205a131a1ba61c6d33bd483",
 | 
			
		||||
                "reference": "6e351261f9cd33daf205a131a1ba61c6d33bd483",
 | 
			
		||||
                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1066c562c52900a142a0e2bbf0582994671385e",
 | 
			
		||||
                "reference": "a1066c562c52900a142a0e2bbf0582994671385e",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -8922,7 +8923,7 @@
 | 
			
		||||
                "testing",
 | 
			
		||||
                "xunit"
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2016-02-11 14:56:33"
 | 
			
		||||
            "time": "2016-03-14 06:16:08"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "phpunit/phpunit-mock-objects",
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,28 @@
 | 
			
		||||
<?php
 | 
			
		||||
use Illuminate\Database\Schema\Blueprint;
 | 
			
		||||
use Illuminate\Database\Migrations\Migration;
 | 
			
		||||
 | 
			
		||||
class AddSupportThreeDecimalTaxes extends Migration {
 | 
			
		||||
	/**
 | 
			
		||||
	 * Run the migrations.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return void
 | 
			
		||||
	 */
 | 
			
		||||
	public function up()
 | 
			
		||||
	{
 | 
			
		||||
		Schema::table('tax_rates', function($table) {
 | 
			
		||||
			$table->decimal('rate', 13, 3)->change();
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
	/**
 | 
			
		||||
	 * Reverse the migrations.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return void
 | 
			
		||||
	 */
 | 
			
		||||
	public function down()
 | 
			
		||||
	{
 | 
			
		||||
		Schema::table('tax_rates', function($table) {
 | 
			
		||||
			$table->decimal('rate', 13, 2)->change();
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -54,6 +54,7 @@ class CurrenciesSeeder extends Seeder
 | 
			
		||||
            ['name' => 'Croatian Kuna', 'code' => 'HKR', 'symbol' => 'kn', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
 | 
			
		||||
            ['name' => 'Saudi Riyal', 'code' => 'SAR', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
 | 
			
		||||
            ['name' => 'Japanese Yen', 'code' => 'JPY', 'symbol' => '¥', 'precision' => '0', 'thousand_separator' => ',', 'decimal_separator' => '.'],
 | 
			
		||||
            ['name' => 'Maldivian Rufiyaa', 'code' => 'MVR', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        foreach ($currencies as $currency) {
 | 
			
		||||
 | 
			
		||||
@ -30487,6 +30487,7 @@ function calculateAmounts(invoice) {
 | 
			
		||||
  for (var i=0; i<invoice.invoice_items.length; i++) {
 | 
			
		||||
    var item = invoice.invoice_items[i];
 | 
			
		||||
    var lineTotal = roundToTwo(NINJA.parseFloat(item.cost)) * roundToTwo(NINJA.parseFloat(item.qty));
 | 
			
		||||
    lineTotal = roundToTwo(lineTotal);
 | 
			
		||||
    if (lineTotal) {
 | 
			
		||||
      total += lineTotal;
 | 
			
		||||
    }
 | 
			
		||||
@ -31182,7 +31183,7 @@ NINJA.decodeJavascript = function(invoice, javascript)
 | 
			
		||||
            var value = getDescendantProp(invoice, field);
 | 
			
		||||
            if (match.indexOf('?') < 0 || value) {
 | 
			
		||||
                if (invoice.partial && field == 'balance_due') {
 | 
			
		||||
                    field = 'amount_due';
 | 
			
		||||
                    field = 'partial_due';
 | 
			
		||||
                } else if (invoice.is_quote) {
 | 
			
		||||
                    field = field.replace('invoice', 'quote');
 | 
			
		||||
                }
 | 
			
		||||
@ -31259,10 +31260,10 @@ NINJA.invoiceColumns = function(invoice)
 | 
			
		||||
 | 
			
		||||
    columns.push("*")
 | 
			
		||||
 | 
			
		||||
    if (account.custom_invoice_item_label1) {
 | 
			
		||||
    if (invoice.is_pro && account.custom_invoice_item_label1) {
 | 
			
		||||
        columns.push("10%");
 | 
			
		||||
    }
 | 
			
		||||
    if (account.custom_invoice_item_label2) {
 | 
			
		||||
    if (invoice.is_pro && account.custom_invoice_item_label2) {
 | 
			
		||||
        columns.push("10%");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -31314,10 +31315,10 @@ NINJA.invoiceLines = function(invoice) {
 | 
			
		||||
 | 
			
		||||
    grid[0].push({text: invoiceLabels.description, style: ['tableHeader', 'descriptionTableHeader']});
 | 
			
		||||
 | 
			
		||||
    if (account.custom_invoice_item_label1) {
 | 
			
		||||
    if (invoice.is_pro && account.custom_invoice_item_label1) {
 | 
			
		||||
        grid[0].push({text: account.custom_invoice_item_label1, style: ['tableHeader', 'custom1TableHeader']});
 | 
			
		||||
    }
 | 
			
		||||
    if (account.custom_invoice_item_label2) {
 | 
			
		||||
    if (invoice.is_pro && account.custom_invoice_item_label2) {
 | 
			
		||||
        grid[0].push({text: account.custom_invoice_item_label2, style: ['tableHeader', 'custom2TableHeader']});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -31372,10 +31373,10 @@ NINJA.invoiceLines = function(invoice) {
 | 
			
		||||
            row.push({style:["productKey", rowStyle], text:productKey || ' '}); // product key can be blank when selecting from a datalist
 | 
			
		||||
        }
 | 
			
		||||
        row.push({style:["notes", rowStyle], stack:[{text:notes || ' '}]}); 
 | 
			
		||||
        if (account.custom_invoice_item_label1) {
 | 
			
		||||
        if (invoice.is_pro && account.custom_invoice_item_label1) {
 | 
			
		||||
            row.push({style:["customValue1", rowStyle], text:item.custom_value1 || ' '});
 | 
			
		||||
        }
 | 
			
		||||
        if (account.custom_invoice_item_label2) {
 | 
			
		||||
        if (invoice.is_pro && account.custom_invoice_item_label2) {
 | 
			
		||||
            row.push({style:["customValue2", rowStyle], text:item.custom_value2 || ' '});
 | 
			
		||||
        }
 | 
			
		||||
        row.push({style:["cost", rowStyle], text:cost});
 | 
			
		||||
@ -31439,12 +31440,22 @@ NINJA.subtotals = function(invoice, hideBalance)
 | 
			
		||||
        data.push([{text:invoiceLabels.paid_to_date}, {text:formatMoneyInvoice(paid, invoice)}]);        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!hideBalance) {
 | 
			
		||||
        var isPartial = NINJA.parseFloat(invoice.partial);
 | 
			
		||||
    var isPartial = NINJA.parseFloat(invoice.partial);
 | 
			
		||||
        
 | 
			
		||||
    if (!hideBalance || isPartial) {
 | 
			
		||||
        data.push([
 | 
			
		||||
            {text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style:['balanceDueLabel']},
 | 
			
		||||
            {text: formatMoneyInvoice(invoice.balance_amount, invoice), style:['balanceDue']}
 | 
			
		||||
            { text: invoiceLabels.balance_due, style: [isPartial ? '' : 'balanceDueLabel'] },
 | 
			
		||||
            { text: formatMoneyInvoice(invoice.total_amount, invoice), style: [isPartial ? '' : 'balanceDue'] }
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if (!hideBalance) {
 | 
			
		||||
        if (isPartial) {
 | 
			
		||||
            data.push([
 | 
			
		||||
                { text: invoiceLabels.partial_due, style: ['balanceDueLabel'] },
 | 
			
		||||
                { text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['balanceDue'] }
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
    }        
 | 
			
		||||
 | 
			
		||||
    return NINJA.prepareDataPairs(data, 'subtotals');
 | 
			
		||||
@ -31453,7 +31464,7 @@ NINJA.subtotals = function(invoice, hideBalance)
 | 
			
		||||
NINJA.subtotalsBalance = function(invoice) {
 | 
			
		||||
    var isPartial = NINJA.parseFloat(invoice.partial);
 | 
			
		||||
    return [[
 | 
			
		||||
        {text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style:['balanceDueLabel']},
 | 
			
		||||
        {text: isPartial ? invoiceLabels.partial_due : invoiceLabels.balance_due, style:['balanceDueLabel']},
 | 
			
		||||
        {text: formatMoneyInvoice(invoice.balance_amount, invoice), style:['balanceDue']}
 | 
			
		||||
    ]];
 | 
			
		||||
}
 | 
			
		||||
@ -31531,18 +31542,18 @@ NINJA.invoiceDetails = function(invoice) {
 | 
			
		||||
    
 | 
			
		||||
    if (NINJA.parseFloat(invoice.balance) < NINJA.parseFloat(invoice.amount)) {
 | 
			
		||||
        data.push([
 | 
			
		||||
            {text: invoiceLabels.total},
 | 
			
		||||
            {text: invoiceLabels.balance_due},
 | 
			
		||||
            {text: formatMoneyInvoice(invoice.amount, invoice)}
 | 
			
		||||
        ]);
 | 
			
		||||
    } else if (isPartial) {
 | 
			
		||||
        data.push([
 | 
			
		||||
            {text: invoiceLabels.total},
 | 
			
		||||
            {text: invoiceLabels.balance_due},
 | 
			
		||||
            {text: formatMoneyInvoice(invoice.total_amount, invoice)}
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    data.push([
 | 
			
		||||
        {text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
 | 
			
		||||
        {text: isPartial ? invoiceLabels.partial_due : invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
 | 
			
		||||
        {text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['invoiceDetailBalanceDue']}
 | 
			
		||||
    ])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								public/css/built.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								public/css/built.css
									
									
									
									
										vendored
									
									
								
							@ -2216,7 +2216,8 @@ th:last-child {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
tr {border: none;}
 | 
			
		||||
th {border-left: 1px solid #d26b26; }
 | 
			
		||||
thead th {border-left: 1px solid #d26b26;}
 | 
			
		||||
tbody td {border-left: 1px solid #FFFFFF;}
 | 
			
		||||
.table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td {
 | 
			
		||||
vertical-align: middle;
 | 
			
		||||
border-top: none;
 | 
			
		||||
@ -2528,6 +2529,16 @@ font-weight: bold;
 | 
			
		||||
  filter: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar,
 | 
			
		||||
.panel-default,
 | 
			
		||||
ul.dropdown-menu,
 | 
			
		||||
.twitter-typeahead .tt-menu,
 | 
			
		||||
canvas {
 | 
			
		||||
    x-moz-box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
 | 
			
		||||
    x-webkit-box-shadow: 0 0 1px 1px rgba(0,0,0,.05); 
 | 
			
		||||
    box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar .active > a {
 | 
			
		||||
  background-color: #09334f !important;
 | 
			
		||||
  background-image: none;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										26
									
								
								public/css/built.public.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								public/css/built.public.css
									
									
									
									
										vendored
									
									
								
							@ -790,14 +790,24 @@ html {
 | 
			
		||||
  overflow-y: scroll;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (min-width: 700px) { 
 | 
			
		||||
    .navbar-header {
 | 
			
		||||
        padding-top: 16px;
 | 
			
		||||
        padding-bottom: 16px;        
 | 
			
		||||
    }
 | 
			
		||||
    .navbar li a {
 | 
			
		||||
        padding: 31px 20px 31px 20px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
.navbar-header {
 | 
			
		||||
    padding-top: 4px;
 | 
			
		||||
    padding-bottom: 4px;        
 | 
			
		||||
}
 | 
			
		||||
.navbar li a {
 | 
			
		||||
    padding-top: 18px;
 | 
			
		||||
    font-weight: 500;
 | 
			
		||||
    font-size: 15px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    padding-left: 20px;
 | 
			
		||||
    padding-right: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar {
 | 
			
		||||
    x-moz-box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
 | 
			
		||||
    x-webkit-box-shadow: 0 0 1px 1px rgba(0,0,0,.05); 
 | 
			
		||||
    box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#footer {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										26
									
								
								public/css/public.style.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								public/css/public.style.css
									
									
									
									
										vendored
									
									
								
							@ -7,14 +7,24 @@ html {
 | 
			
		||||
  overflow-y: scroll;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (min-width: 700px) { 
 | 
			
		||||
    .navbar-header {
 | 
			
		||||
        padding-top: 16px;
 | 
			
		||||
        padding-bottom: 16px;        
 | 
			
		||||
    }
 | 
			
		||||
    .navbar li a {
 | 
			
		||||
        padding: 31px 20px 31px 20px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
.navbar-header {
 | 
			
		||||
    padding-top: 4px;
 | 
			
		||||
    padding-bottom: 4px;        
 | 
			
		||||
}
 | 
			
		||||
.navbar li a {
 | 
			
		||||
    padding-top: 18px;
 | 
			
		||||
    font-weight: 500;
 | 
			
		||||
    font-size: 15px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    padding-left: 20px;
 | 
			
		||||
    padding-right: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar {
 | 
			
		||||
    x-moz-box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
 | 
			
		||||
    x-webkit-box-shadow: 0 0 1px 1px rgba(0,0,0,.05); 
 | 
			
		||||
    box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#footer {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								public/css/style.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								public/css/style.css
									
									
									
									
										vendored
									
									
								
							@ -89,7 +89,8 @@ th:last-child {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
tr {border: none;}
 | 
			
		||||
th {border-left: 1px solid #d26b26; }
 | 
			
		||||
thead th {border-left: 1px solid #d26b26;}
 | 
			
		||||
tbody td {border-left: 1px solid #FFFFFF;}
 | 
			
		||||
.table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td {
 | 
			
		||||
vertical-align: middle;
 | 
			
		||||
border-top: none;
 | 
			
		||||
@ -401,6 +402,16 @@ font-weight: bold;
 | 
			
		||||
  filter: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar,
 | 
			
		||||
.panel-default,
 | 
			
		||||
ul.dropdown-menu,
 | 
			
		||||
.twitter-typeahead .tt-menu,
 | 
			
		||||
canvas {
 | 
			
		||||
    x-moz-box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
 | 
			
		||||
    x-webkit-box-shadow: 0 0 1px 1px rgba(0,0,0,.05); 
 | 
			
		||||
    box-shadow: 0 0 1px 1px rgba(0,0,0,.05);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar .active > a {
 | 
			
		||||
  background-color: #09334f !important;
 | 
			
		||||
  background-image: none;
 | 
			
		||||
 | 
			
		||||
@ -190,7 +190,7 @@ NINJA.decodeJavascript = function(invoice, javascript)
 | 
			
		||||
            var value = getDescendantProp(invoice, field);
 | 
			
		||||
            if (match.indexOf('?') < 0 || value) {
 | 
			
		||||
                if (invoice.partial && field == 'balance_due') {
 | 
			
		||||
                    field = 'amount_due';
 | 
			
		||||
                    field = 'partial_due';
 | 
			
		||||
                } else if (invoice.is_quote) {
 | 
			
		||||
                    field = field.replace('invoice', 'quote');
 | 
			
		||||
                }
 | 
			
		||||
@ -267,10 +267,10 @@ NINJA.invoiceColumns = function(invoice)
 | 
			
		||||
 | 
			
		||||
    columns.push("*")
 | 
			
		||||
 | 
			
		||||
    if (account.custom_invoice_item_label1) {
 | 
			
		||||
    if (invoice.is_pro && account.custom_invoice_item_label1) {
 | 
			
		||||
        columns.push("10%");
 | 
			
		||||
    }
 | 
			
		||||
    if (account.custom_invoice_item_label2) {
 | 
			
		||||
    if (invoice.is_pro && account.custom_invoice_item_label2) {
 | 
			
		||||
        columns.push("10%");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -322,10 +322,10 @@ NINJA.invoiceLines = function(invoice) {
 | 
			
		||||
 | 
			
		||||
    grid[0].push({text: invoiceLabels.description, style: ['tableHeader', 'descriptionTableHeader']});
 | 
			
		||||
 | 
			
		||||
    if (account.custom_invoice_item_label1) {
 | 
			
		||||
    if (invoice.is_pro && account.custom_invoice_item_label1) {
 | 
			
		||||
        grid[0].push({text: account.custom_invoice_item_label1, style: ['tableHeader', 'custom1TableHeader']});
 | 
			
		||||
    }
 | 
			
		||||
    if (account.custom_invoice_item_label2) {
 | 
			
		||||
    if (invoice.is_pro && account.custom_invoice_item_label2) {
 | 
			
		||||
        grid[0].push({text: account.custom_invoice_item_label2, style: ['tableHeader', 'custom2TableHeader']});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -380,10 +380,10 @@ NINJA.invoiceLines = function(invoice) {
 | 
			
		||||
            row.push({style:["productKey", rowStyle], text:productKey || ' '}); // product key can be blank when selecting from a datalist
 | 
			
		||||
        }
 | 
			
		||||
        row.push({style:["notes", rowStyle], stack:[{text:notes || ' '}]}); 
 | 
			
		||||
        if (account.custom_invoice_item_label1) {
 | 
			
		||||
        if (invoice.is_pro && account.custom_invoice_item_label1) {
 | 
			
		||||
            row.push({style:["customValue1", rowStyle], text:item.custom_value1 || ' '});
 | 
			
		||||
        }
 | 
			
		||||
        if (account.custom_invoice_item_label2) {
 | 
			
		||||
        if (invoice.is_pro && account.custom_invoice_item_label2) {
 | 
			
		||||
            row.push({style:["customValue2", rowStyle], text:item.custom_value2 || ' '});
 | 
			
		||||
        }
 | 
			
		||||
        row.push({style:["cost", rowStyle], text:cost});
 | 
			
		||||
@ -447,12 +447,22 @@ NINJA.subtotals = function(invoice, hideBalance)
 | 
			
		||||
        data.push([{text:invoiceLabels.paid_to_date}, {text:formatMoneyInvoice(paid, invoice)}]);        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!hideBalance) {
 | 
			
		||||
        var isPartial = NINJA.parseFloat(invoice.partial);
 | 
			
		||||
    var isPartial = NINJA.parseFloat(invoice.partial);
 | 
			
		||||
        
 | 
			
		||||
    if (!hideBalance || isPartial) {
 | 
			
		||||
        data.push([
 | 
			
		||||
            {text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style:['balanceDueLabel']},
 | 
			
		||||
            {text: formatMoneyInvoice(invoice.balance_amount, invoice), style:['balanceDue']}
 | 
			
		||||
            { text: invoiceLabels.balance_due, style: [isPartial ? '' : 'balanceDueLabel'] },
 | 
			
		||||
            { text: formatMoneyInvoice(invoice.total_amount, invoice), style: [isPartial ? '' : 'balanceDue'] }
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if (!hideBalance) {
 | 
			
		||||
        if (isPartial) {
 | 
			
		||||
            data.push([
 | 
			
		||||
                { text: invoiceLabels.partial_due, style: ['balanceDueLabel'] },
 | 
			
		||||
                { text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['balanceDue'] }
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
    }        
 | 
			
		||||
 | 
			
		||||
    return NINJA.prepareDataPairs(data, 'subtotals');
 | 
			
		||||
@ -461,7 +471,7 @@ NINJA.subtotals = function(invoice, hideBalance)
 | 
			
		||||
NINJA.subtotalsBalance = function(invoice) {
 | 
			
		||||
    var isPartial = NINJA.parseFloat(invoice.partial);
 | 
			
		||||
    return [[
 | 
			
		||||
        {text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style:['balanceDueLabel']},
 | 
			
		||||
        {text: isPartial ? invoiceLabels.partial_due : invoiceLabels.balance_due, style:['balanceDueLabel']},
 | 
			
		||||
        {text: formatMoneyInvoice(invoice.balance_amount, invoice), style:['balanceDue']}
 | 
			
		||||
    ]];
 | 
			
		||||
}
 | 
			
		||||
@ -539,18 +549,18 @@ NINJA.invoiceDetails = function(invoice) {
 | 
			
		||||
    
 | 
			
		||||
    if (NINJA.parseFloat(invoice.balance) < NINJA.parseFloat(invoice.amount)) {
 | 
			
		||||
        data.push([
 | 
			
		||||
            {text: invoiceLabels.total},
 | 
			
		||||
            {text: invoiceLabels.balance_due},
 | 
			
		||||
            {text: formatMoneyInvoice(invoice.amount, invoice)}
 | 
			
		||||
        ]);
 | 
			
		||||
    } else if (isPartial) {
 | 
			
		||||
        data.push([
 | 
			
		||||
            {text: invoiceLabels.total},
 | 
			
		||||
            {text: invoiceLabels.balance_due},
 | 
			
		||||
            {text: formatMoneyInvoice(invoice.total_amount, invoice)}
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    data.push([
 | 
			
		||||
        {text: isPartial ? invoiceLabels.amount_due : invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
 | 
			
		||||
        {text: isPartial ? invoiceLabels.partial_due : invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
 | 
			
		||||
        {text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['invoiceDetailBalanceDue']}
 | 
			
		||||
    ])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -595,6 +595,7 @@ function calculateAmounts(invoice) {
 | 
			
		||||
  for (var i=0; i<invoice.invoice_items.length; i++) {
 | 
			
		||||
    var item = invoice.invoice_items[i];
 | 
			
		||||
    var lineTotal = roundToTwo(NINJA.parseFloat(item.cost)) * roundToTwo(NINJA.parseFloat(item.qty));
 | 
			
		||||
    lineTotal = roundToTwo(lineTotal);
 | 
			
		||||
    if (lineTotal) {
 | 
			
		||||
      total += lineTotal;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -52,7 +52,7 @@ Note: we've recently updated this branch to Laravel 5.2. If you're upgrading her
 | 
			
		||||
* [Debian and Nginx](https://www.rosehosting.com/blog/install-invoice-ninja-on-a-debian-7-vps/)
 | 
			
		||||
* [User Guide](https://www.invoiceninja.com/app-user-guide/)
 | 
			
		||||
* [Developer Guide](https://www.invoiceninja.com/knowledgebase/developer-guide/)
 | 
			
		||||
* [API Documentation](https://www.invoiceninja.com/knowledgebase/api-documentation/)
 | 
			
		||||
* [API Documentation](https://www.invoiceninja.com/api-documentation/)
 | 
			
		||||
* [Support Forum](https://www.invoiceninja.com/forums/forum/support/)
 | 
			
		||||
* [Feature Roadmap](https://trello.com/b/63BbiVVe/)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -942,7 +942,7 @@ return array(
 | 
			
		||||
    'notes' => 'Notes',
 | 
			
		||||
    'invoice_will_create' => 'client will be created',
 | 
			
		||||
    'invoices_will_create' => 'invoices will be created',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
 | 
			
		||||
 | 
			
		||||
    'publishable_key' => 'Publishable Key',
 | 
			
		||||
    'secret_key' => 'Secret Key',
 | 
			
		||||
@ -1131,4 +1131,73 @@ return array(
 | 
			
		||||
    'overdue' => 'Overdue',
 | 
			
		||||
    'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
 | 
			
		||||
 | 
			
		||||
    'navigation' => 'Navigation',
 | 
			
		||||
    'list_invoices' => 'List Invoices',
 | 
			
		||||
    'list_clients' => 'List Clients',
 | 
			
		||||
    'list_quotes' => 'List Quotes',
 | 
			
		||||
    'list_tasks' => 'List Tasks',
 | 
			
		||||
    'list_expenses' => 'List Expenses',
 | 
			
		||||
    'list_recurring_invoices' => 'List Recurring Invoices',
 | 
			
		||||
    'list_payments' => 'List Payments',
 | 
			
		||||
    'list_credits' => 'List Credits',
 | 
			
		||||
    'tax_name' => 'Tax Name',
 | 
			
		||||
    'report_settings' => 'Report Settings',
 | 
			
		||||
    'search_hotkey' => 'shortcut is /',
 | 
			
		||||
 | 
			
		||||
    'new_user' => 'New User',
 | 
			
		||||
    'new_product' => 'New Product',
 | 
			
		||||
    'new_tax_rate' => 'New Tax Rate',
 | 
			
		||||
    'invoiced_amount' => 'Invoiced Amount',
 | 
			
		||||
    'invoice_item_fields' => 'Invoice Item Fields',
 | 
			
		||||
    'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
 | 
			
		||||
    'recurring_invoice_number' => 'Recurring Invoice Number',
 | 
			
		||||
    'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
 | 
			
		||||
    'enable_client_portal' => 'Dashboard',
 | 
			
		||||
    'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
 | 
			
		||||
 | 
			
		||||
    // Client Passwords
 | 
			
		||||
    'enable_portal_password'=>'Password protect invoices',
 | 
			
		||||
    'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
 | 
			
		||||
    'send_portal_password'=>'Generate password automatically',
 | 
			
		||||
    'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
 | 
			
		||||
    
 | 
			
		||||
    'expired' => 'Expired',
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
    
 | 
			
		||||
);
 | 
			
		||||
@ -943,7 +943,7 @@ return array(
 | 
			
		||||
    'notes' => 'Notes',
 | 
			
		||||
    'invoice_will_create' => 'client will be created',
 | 
			
		||||
    'invoices_will_create' => 'invoices will be created',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
 | 
			
		||||
 | 
			
		||||
    'publishable_key' => 'Publishable Key',
 | 
			
		||||
    'secret_key' => 'Secret Key',
 | 
			
		||||
@ -1132,4 +1132,73 @@ return array(
 | 
			
		||||
    'overdue' => 'Overdue',
 | 
			
		||||
    'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
 | 
			
		||||
 | 
			
		||||
    'navigation' => 'Navigation',
 | 
			
		||||
    'list_invoices' => 'List Invoices',
 | 
			
		||||
    'list_clients' => 'List Clients',
 | 
			
		||||
    'list_quotes' => 'List Quotes',
 | 
			
		||||
    'list_tasks' => 'List Tasks',
 | 
			
		||||
    'list_expenses' => 'List Expenses',
 | 
			
		||||
    'list_recurring_invoices' => 'List Recurring Invoices',
 | 
			
		||||
    'list_payments' => 'List Payments',
 | 
			
		||||
    'list_credits' => 'List Credits',
 | 
			
		||||
    'tax_name' => 'Tax Name',
 | 
			
		||||
    'report_settings' => 'Report Settings',
 | 
			
		||||
    'search_hotkey' => 'shortcut is /',
 | 
			
		||||
 | 
			
		||||
    'new_user' => 'New User',
 | 
			
		||||
    'new_product' => 'New Product',
 | 
			
		||||
    'new_tax_rate' => 'New Tax Rate',
 | 
			
		||||
    'invoiced_amount' => 'Invoiced Amount',
 | 
			
		||||
    'invoice_item_fields' => 'Invoice Item Fields',
 | 
			
		||||
    'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
 | 
			
		||||
    'recurring_invoice_number' => 'Recurring Invoice Number',
 | 
			
		||||
    'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
 | 
			
		||||
    'enable_client_portal' => 'Dashboard',
 | 
			
		||||
    'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
 | 
			
		||||
 | 
			
		||||
    // Client Passwords
 | 
			
		||||
    'enable_portal_password'=>'Password protect invoices',
 | 
			
		||||
    'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
 | 
			
		||||
    'send_portal_password'=>'Generate password automatically',
 | 
			
		||||
    'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
 | 
			
		||||
    
 | 
			
		||||
    'expired' => 'Expired',
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@ -161,7 +161,7 @@ $LANG = array(
 | 
			
		||||
    'work_email' => 'Email',
 | 
			
		||||
    'language_id' => 'Language',
 | 
			
		||||
    'timezone_id' => 'Timezone',
 | 
			
		||||
    'date_format_id' => 'Date format',
 | 
			
		||||
    'date_format_id' => 'Date Format',
 | 
			
		||||
    'datetime_format_id' => 'Date/Time Format',
 | 
			
		||||
    'users' => 'Users',
 | 
			
		||||
    'localization' => 'Localization',
 | 
			
		||||
@ -826,7 +826,7 @@ $LANG = array(
 | 
			
		||||
    'notes' => 'Notes',
 | 
			
		||||
    'invoice_will_create' => 'client will be created',
 | 
			
		||||
    'invoices_will_create' => 'invoices will be created',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
 | 
			
		||||
    'publishable_key' => 'Publishable Key',
 | 
			
		||||
    'secret_key' => 'Secret Key',
 | 
			
		||||
    'missing_publishable_key' => 'Set your Stripe publishable key for an improved checkout process',
 | 
			
		||||
@ -950,7 +950,7 @@ $LANG = array(
 | 
			
		||||
    'add_bank_account' => 'Add Bank Account',
 | 
			
		||||
    'setup_account' => 'Setup Account',
 | 
			
		||||
    'import_expenses' => 'Import Expenses',
 | 
			
		||||
    'bank_id' => 'bank',
 | 
			
		||||
    'bank_id' => 'Bank',
 | 
			
		||||
    'integration_type' => 'Integration Type',
 | 
			
		||||
    'updated_bank_account' => 'Successfully updated bank account',
 | 
			
		||||
    'edit_bank_account' => 'Edit Bank Account',
 | 
			
		||||
@ -1062,14 +1062,40 @@ $LANG = array(
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings, and view and modify all data',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
    
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -920,7 +920,7 @@ return array(
 | 
			
		||||
    'notes' => 'Notes',
 | 
			
		||||
    'invoice_will_create' => 'client will be created',
 | 
			
		||||
    'invoices_will_create' => 'invoices will be created',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
 | 
			
		||||
 | 
			
		||||
    'publishable_key' => 'Publishable Key',
 | 
			
		||||
    'secret_key' => 'Secret Key',
 | 
			
		||||
@ -1108,4 +1108,73 @@ return array(
 | 
			
		||||
    'overdue' => 'Overdue',
 | 
			
		||||
    'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
 | 
			
		||||
 | 
			
		||||
    'navigation' => 'Navigation',
 | 
			
		||||
    'list_invoices' => 'List Invoices',
 | 
			
		||||
    'list_clients' => 'List Clients',
 | 
			
		||||
    'list_quotes' => 'List Quotes',
 | 
			
		||||
    'list_tasks' => 'List Tasks',
 | 
			
		||||
    'list_expenses' => 'List Expenses',
 | 
			
		||||
    'list_recurring_invoices' => 'List Recurring Invoices',
 | 
			
		||||
    'list_payments' => 'List Payments',
 | 
			
		||||
    'list_credits' => 'List Credits',
 | 
			
		||||
    'tax_name' => 'Tax Name',
 | 
			
		||||
    'report_settings' => 'Report Settings',
 | 
			
		||||
    'search_hotkey' => 'shortcut is /',
 | 
			
		||||
 | 
			
		||||
    'new_user' => 'New User',
 | 
			
		||||
    'new_product' => 'New Product',
 | 
			
		||||
    'new_tax_rate' => 'New Tax Rate',
 | 
			
		||||
    'invoiced_amount' => 'Invoiced Amount',
 | 
			
		||||
    'invoice_item_fields' => 'Invoice Item Fields',
 | 
			
		||||
    'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
 | 
			
		||||
    'recurring_invoice_number' => 'Recurring Invoice Number',
 | 
			
		||||
    'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
 | 
			
		||||
    'enable_client_portal' => 'Dashboard',
 | 
			
		||||
    'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
 | 
			
		||||
 | 
			
		||||
    // Client Passwords
 | 
			
		||||
    'enable_portal_password'=>'Password protect invoices',
 | 
			
		||||
    'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
 | 
			
		||||
    'send_portal_password'=>'Generate password automatically',
 | 
			
		||||
    'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
 | 
			
		||||
    
 | 
			
		||||
    'expired' => 'Expired',
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@ -1128,4 +1128,73 @@ return array(
 | 
			
		||||
    'overdue' => 'Overdue',
 | 
			
		||||
    'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
 | 
			
		||||
 | 
			
		||||
    'navigation' => 'Navigation',
 | 
			
		||||
    'list_invoices' => 'List Invoices',
 | 
			
		||||
    'list_clients' => 'List Clients',
 | 
			
		||||
    'list_quotes' => 'List Quotes',
 | 
			
		||||
    'list_tasks' => 'List Tasks',
 | 
			
		||||
    'list_expenses' => 'List Expenses',
 | 
			
		||||
    'list_recurring_invoices' => 'List Recurring Invoices',
 | 
			
		||||
    'list_payments' => 'List Payments',
 | 
			
		||||
    'list_credits' => 'List Credits',
 | 
			
		||||
    'tax_name' => 'Tax Name',
 | 
			
		||||
    'report_settings' => 'Report Settings',
 | 
			
		||||
    'search_hotkey' => 'shortcut is /',
 | 
			
		||||
 | 
			
		||||
    'new_user' => 'New User',
 | 
			
		||||
    'new_product' => 'New Product',
 | 
			
		||||
    'new_tax_rate' => 'New Tax Rate',
 | 
			
		||||
    'invoiced_amount' => 'Invoiced Amount',
 | 
			
		||||
    'invoice_item_fields' => 'Invoice Item Fields',
 | 
			
		||||
    'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
 | 
			
		||||
    'recurring_invoice_number' => 'Recurring Invoice Number',
 | 
			
		||||
    'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
 | 
			
		||||
    'enable_client_portal' => 'Dashboard',
 | 
			
		||||
    'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
 | 
			
		||||
 | 
			
		||||
    // Client Passwords
 | 
			
		||||
    'enable_portal_password'=>'Password protect invoices',
 | 
			
		||||
    'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
 | 
			
		||||
    'send_portal_password'=>'Generate password automatically',
 | 
			
		||||
    'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
 | 
			
		||||
    
 | 
			
		||||
    'expired' => 'Expired',
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@ -934,7 +934,7 @@ return array(
 | 
			
		||||
    'notes' => 'Notes',
 | 
			
		||||
    'invoice_will_create' => 'client will be created',
 | 
			
		||||
    'invoices_will_create' => 'invoices will be created',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
 | 
			
		||||
 | 
			
		||||
    'publishable_key' => 'Publishable Key',
 | 
			
		||||
    'secret_key' => 'Secret Key',
 | 
			
		||||
@ -1123,4 +1123,73 @@ return array(
 | 
			
		||||
    'overdue' => 'Overdue',
 | 
			
		||||
    'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
 | 
			
		||||
 | 
			
		||||
    'navigation' => 'Navigation',
 | 
			
		||||
    'list_invoices' => 'List Invoices',
 | 
			
		||||
    'list_clients' => 'List Clients',
 | 
			
		||||
    'list_quotes' => 'List Quotes',
 | 
			
		||||
    'list_tasks' => 'List Tasks',
 | 
			
		||||
    'list_expenses' => 'List Expenses',
 | 
			
		||||
    'list_recurring_invoices' => 'List Recurring Invoices',
 | 
			
		||||
    'list_payments' => 'List Payments',
 | 
			
		||||
    'list_credits' => 'List Credits',
 | 
			
		||||
    'tax_name' => 'Tax Name',
 | 
			
		||||
    'report_settings' => 'Report Settings',
 | 
			
		||||
    'search_hotkey' => 'shortcut is /',
 | 
			
		||||
 | 
			
		||||
    'new_user' => 'New User',
 | 
			
		||||
    'new_product' => 'New Product',
 | 
			
		||||
    'new_tax_rate' => 'New Tax Rate',
 | 
			
		||||
    'invoiced_amount' => 'Invoiced Amount',
 | 
			
		||||
    'invoice_item_fields' => 'Invoice Item Fields',
 | 
			
		||||
    'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
 | 
			
		||||
    'recurring_invoice_number' => 'Recurring Invoice Number',
 | 
			
		||||
    'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
 | 
			
		||||
    'enable_client_portal' => 'Dashboard',
 | 
			
		||||
    'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
 | 
			
		||||
 | 
			
		||||
    // Client Passwords
 | 
			
		||||
    'enable_portal_password'=>'Password protect invoices',
 | 
			
		||||
    'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
 | 
			
		||||
    'send_portal_password'=>'Generate password automatically',
 | 
			
		||||
    'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
 | 
			
		||||
    
 | 
			
		||||
    'expired' => 'Expired',
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@ -1121,4 +1121,73 @@ return array(
 | 
			
		||||
    'overdue' => 'En souffrance',
 | 
			
		||||
    'white_label_text' => 'Achetez une licence sans pub d\'un an à $'.WHITE_LABEL_PRICE.' pour retirer le logo de Invoice Ninja du portail client et supporter notre projet.',
 | 
			
		||||
 | 
			
		||||
    'navigation' => 'Navigation',
 | 
			
		||||
    'list_invoices' => 'List Invoices',
 | 
			
		||||
    'list_clients' => 'List Clients',
 | 
			
		||||
    'list_quotes' => 'List Quotes',
 | 
			
		||||
    'list_tasks' => 'List Tasks',
 | 
			
		||||
    'list_expenses' => 'List Expenses',
 | 
			
		||||
    'list_recurring_invoices' => 'List Recurring Invoices',
 | 
			
		||||
    'list_payments' => 'List Payments',
 | 
			
		||||
    'list_credits' => 'List Credits',
 | 
			
		||||
    'tax_name' => 'Tax Name',
 | 
			
		||||
    'report_settings' => 'Report Settings',
 | 
			
		||||
    'search_hotkey' => 'shortcut is /',
 | 
			
		||||
 | 
			
		||||
    'new_user' => 'New User',
 | 
			
		||||
    'new_product' => 'New Product',
 | 
			
		||||
    'new_tax_rate' => 'New Tax Rate',
 | 
			
		||||
    'invoiced_amount' => 'Invoiced Amount',
 | 
			
		||||
    'invoice_item_fields' => 'Invoice Item Fields',
 | 
			
		||||
    'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
 | 
			
		||||
    'recurring_invoice_number' => 'Recurring Invoice Number',
 | 
			
		||||
    'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
 | 
			
		||||
    'enable_client_portal' => 'Dashboard',
 | 
			
		||||
    'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
 | 
			
		||||
 | 
			
		||||
    // Client Passwords
 | 
			
		||||
    'enable_portal_password'=>'Password protect invoices',
 | 
			
		||||
    'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
 | 
			
		||||
    'send_portal_password'=>'Generate password automatically',
 | 
			
		||||
    'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
 | 
			
		||||
    
 | 
			
		||||
    'expired' => 'Expired',
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
@ -937,7 +937,7 @@ return array(
 | 
			
		||||
    'notes' => 'Notes',
 | 
			
		||||
    'invoice_will_create' => 'client will be created',
 | 
			
		||||
    'invoices_will_create' => 'invoices will be created',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
 | 
			
		||||
 | 
			
		||||
    'publishable_key' => 'Publishable Key',
 | 
			
		||||
    'secret_key' => 'Secret Key',
 | 
			
		||||
@ -1126,4 +1126,73 @@ return array(
 | 
			
		||||
    'overdue' => 'Overdue',
 | 
			
		||||
    'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
 | 
			
		||||
 | 
			
		||||
    'navigation' => 'Navigation',
 | 
			
		||||
    'list_invoices' => 'List Invoices',
 | 
			
		||||
    'list_clients' => 'List Clients',
 | 
			
		||||
    'list_quotes' => 'List Quotes',
 | 
			
		||||
    'list_tasks' => 'List Tasks',
 | 
			
		||||
    'list_expenses' => 'List Expenses',
 | 
			
		||||
    'list_recurring_invoices' => 'List Recurring Invoices',
 | 
			
		||||
    'list_payments' => 'List Payments',
 | 
			
		||||
    'list_credits' => 'List Credits',
 | 
			
		||||
    'tax_name' => 'Tax Name',
 | 
			
		||||
    'report_settings' => 'Report Settings',
 | 
			
		||||
    'search_hotkey' => 'shortcut is /',
 | 
			
		||||
 | 
			
		||||
    'new_user' => 'New User',
 | 
			
		||||
    'new_product' => 'New Product',
 | 
			
		||||
    'new_tax_rate' => 'New Tax Rate',
 | 
			
		||||
    'invoiced_amount' => 'Invoiced Amount',
 | 
			
		||||
    'invoice_item_fields' => 'Invoice Item Fields',
 | 
			
		||||
    'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
 | 
			
		||||
    'recurring_invoice_number' => 'Recurring Invoice Number',
 | 
			
		||||
    'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
 | 
			
		||||
    'enable_client_portal' => 'Dashboard',
 | 
			
		||||
    'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
 | 
			
		||||
 | 
			
		||||
    // Client Passwords
 | 
			
		||||
    'enable_portal_password'=>'Password protect invoices',
 | 
			
		||||
    'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
 | 
			
		||||
    'send_portal_password'=>'Generate password automatically',
 | 
			
		||||
    'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
 | 
			
		||||
    
 | 
			
		||||
    'expired' => 'Expired',
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
@ -1051,6 +1051,51 @@ $LANG = array(
 | 
			
		||||
    'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
 | 
			
		||||
    'enable_client_portal' => 'ダッシュボード',
 | 
			
		||||
    'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
 | 
			
		||||
 | 
			
		||||
    // Client Passwords
 | 
			
		||||
    'enable_portal_password'=>'Password protect invoices',
 | 
			
		||||
    'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
 | 
			
		||||
    'send_portal_password'=>'Generate password automatically',
 | 
			
		||||
    'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
 | 
			
		||||
    
 | 
			
		||||
    'expired' => 'Expired',
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
    
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -944,7 +944,7 @@ return array(
 | 
			
		||||
    'notes' => 'Notes',
 | 
			
		||||
    'invoice_will_create' => 'client will be created',
 | 
			
		||||
    'invoices_will_create' => 'invoices will be created',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
 | 
			
		||||
 | 
			
		||||
    'publishable_key' => 'Publishable Key',
 | 
			
		||||
    'secret_key' => 'Secret Key',
 | 
			
		||||
@ -1133,4 +1133,73 @@ return array(
 | 
			
		||||
    'overdue' => 'Overdue',
 | 
			
		||||
    'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
 | 
			
		||||
 | 
			
		||||
    'navigation' => 'Navigation',
 | 
			
		||||
    'list_invoices' => 'List Invoices',
 | 
			
		||||
    'list_clients' => 'List Clients',
 | 
			
		||||
    'list_quotes' => 'List Quotes',
 | 
			
		||||
    'list_tasks' => 'List Tasks',
 | 
			
		||||
    'list_expenses' => 'List Expenses',
 | 
			
		||||
    'list_recurring_invoices' => 'List Recurring Invoices',
 | 
			
		||||
    'list_payments' => 'List Payments',
 | 
			
		||||
    'list_credits' => 'List Credits',
 | 
			
		||||
    'tax_name' => 'Tax Name',
 | 
			
		||||
    'report_settings' => 'Report Settings',
 | 
			
		||||
    'search_hotkey' => 'shortcut is /',
 | 
			
		||||
 | 
			
		||||
    'new_user' => 'New User',
 | 
			
		||||
    'new_product' => 'New Product',
 | 
			
		||||
    'new_tax_rate' => 'New Tax Rate',
 | 
			
		||||
    'invoiced_amount' => 'Invoiced Amount',
 | 
			
		||||
    'invoice_item_fields' => 'Invoice Item Fields',
 | 
			
		||||
    'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
 | 
			
		||||
    'recurring_invoice_number' => 'Recurring Invoice Number',
 | 
			
		||||
    'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
 | 
			
		||||
    'enable_client_portal' => 'Dashboard',
 | 
			
		||||
    'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
 | 
			
		||||
 | 
			
		||||
    // Client Passwords
 | 
			
		||||
    'enable_portal_password'=>'Password protect invoices',
 | 
			
		||||
    'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
 | 
			
		||||
    'send_portal_password'=>'Generate password automatically',
 | 
			
		||||
    'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
 | 
			
		||||
    
 | 
			
		||||
    'expired' => 'Expired',
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
@ -942,7 +942,7 @@ return array(
 | 
			
		||||
    'notes' => 'Notes',
 | 
			
		||||
    'invoice_will_create' => 'client will be created',
 | 
			
		||||
    'invoices_will_create' => 'invoices will be created',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
 | 
			
		||||
 | 
			
		||||
    'publishable_key' => 'Publishable Key',
 | 
			
		||||
    'secret_key' => 'Secret Key',
 | 
			
		||||
@ -1131,4 +1131,73 @@ return array(
 | 
			
		||||
    'overdue' => 'Overdue',
 | 
			
		||||
    'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
 | 
			
		||||
 | 
			
		||||
    'navigation' => 'Navigation',
 | 
			
		||||
    'list_invoices' => 'List Invoices',
 | 
			
		||||
    'list_clients' => 'List Clients',
 | 
			
		||||
    'list_quotes' => 'List Quotes',
 | 
			
		||||
    'list_tasks' => 'List Tasks',
 | 
			
		||||
    'list_expenses' => 'List Expenses',
 | 
			
		||||
    'list_recurring_invoices' => 'List Recurring Invoices',
 | 
			
		||||
    'list_payments' => 'List Payments',
 | 
			
		||||
    'list_credits' => 'List Credits',
 | 
			
		||||
    'tax_name' => 'Tax Name',
 | 
			
		||||
    'report_settings' => 'Report Settings',
 | 
			
		||||
    'search_hotkey' => 'shortcut is /',
 | 
			
		||||
 | 
			
		||||
    'new_user' => 'New User',
 | 
			
		||||
    'new_product' => 'New Product',
 | 
			
		||||
    'new_tax_rate' => 'New Tax Rate',
 | 
			
		||||
    'invoiced_amount' => 'Invoiced Amount',
 | 
			
		||||
    'invoice_item_fields' => 'Invoice Item Fields',
 | 
			
		||||
    'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
 | 
			
		||||
    'recurring_invoice_number' => 'Recurring Invoice Number',
 | 
			
		||||
    'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
 | 
			
		||||
    'enable_client_portal' => 'Dashboard',
 | 
			
		||||
    'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
 | 
			
		||||
 | 
			
		||||
    // Client Passwords
 | 
			
		||||
    'enable_portal_password'=>'Password protect invoices',
 | 
			
		||||
    'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
 | 
			
		||||
    'send_portal_password'=>'Generate password automatically',
 | 
			
		||||
    'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
 | 
			
		||||
    
 | 
			
		||||
    'expired' => 'Expired',
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
@ -937,7 +937,7 @@ return array(
 | 
			
		||||
    'notes' => 'Notities',
 | 
			
		||||
    'invoice_will_create' => 'klant zal worden aangemaakt',
 | 
			
		||||
    'invoices_will_create' => 'factuur zal worden aangemaakt',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
 | 
			
		||||
 | 
			
		||||
    'publishable_key' => 'Publishable Key',
 | 
			
		||||
    'secret_key' => 'Secret Key',
 | 
			
		||||
@ -1126,4 +1126,73 @@ return array(
 | 
			
		||||
    'overdue' => 'Overdue',
 | 
			
		||||
    'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
 | 
			
		||||
 | 
			
		||||
    'navigation' => 'Navigation',
 | 
			
		||||
    'list_invoices' => 'List Invoices',
 | 
			
		||||
    'list_clients' => 'List Clients',
 | 
			
		||||
    'list_quotes' => 'List Quotes',
 | 
			
		||||
    'list_tasks' => 'List Tasks',
 | 
			
		||||
    'list_expenses' => 'List Expenses',
 | 
			
		||||
    'list_recurring_invoices' => 'List Recurring Invoices',
 | 
			
		||||
    'list_payments' => 'List Payments',
 | 
			
		||||
    'list_credits' => 'List Credits',
 | 
			
		||||
    'tax_name' => 'Tax Name',
 | 
			
		||||
    'report_settings' => 'Report Settings',
 | 
			
		||||
    'search_hotkey' => 'shortcut is /',
 | 
			
		||||
 | 
			
		||||
    'new_user' => 'New User',
 | 
			
		||||
    'new_product' => 'New Product',
 | 
			
		||||
    'new_tax_rate' => 'New Tax Rate',
 | 
			
		||||
    'invoiced_amount' => 'Invoiced Amount',
 | 
			
		||||
    'invoice_item_fields' => 'Invoice Item Fields',
 | 
			
		||||
    'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
 | 
			
		||||
    'recurring_invoice_number' => 'Recurring Invoice Number',
 | 
			
		||||
    'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
 | 
			
		||||
    'enable_client_portal' => 'Dashboard',
 | 
			
		||||
    'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
 | 
			
		||||
 | 
			
		||||
    // Client Passwords
 | 
			
		||||
    'enable_portal_password'=>'Password protect invoices',
 | 
			
		||||
    'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
 | 
			
		||||
    'send_portal_password'=>'Generate password automatically',
 | 
			
		||||
    'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
 | 
			
		||||
    
 | 
			
		||||
    'expired' => 'Expired',
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
@ -1123,4 +1123,73 @@ return array(
 | 
			
		||||
    'overdue' => 'Overdue',
 | 
			
		||||
    'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
 | 
			
		||||
 | 
			
		||||
    'navigation' => 'Navigation',
 | 
			
		||||
    'list_invoices' => 'List Invoices',
 | 
			
		||||
    'list_clients' => 'List Clients',
 | 
			
		||||
    'list_quotes' => 'List Quotes',
 | 
			
		||||
    'list_tasks' => 'List Tasks',
 | 
			
		||||
    'list_expenses' => 'List Expenses',
 | 
			
		||||
    'list_recurring_invoices' => 'List Recurring Invoices',
 | 
			
		||||
    'list_payments' => 'List Payments',
 | 
			
		||||
    'list_credits' => 'List Credits',
 | 
			
		||||
    'tax_name' => 'Tax Name',
 | 
			
		||||
    'report_settings' => 'Report Settings',
 | 
			
		||||
    'search_hotkey' => 'shortcut is /',
 | 
			
		||||
 | 
			
		||||
    'new_user' => 'New User',
 | 
			
		||||
    'new_product' => 'New Product',
 | 
			
		||||
    'new_tax_rate' => 'New Tax Rate',
 | 
			
		||||
    'invoiced_amount' => 'Invoiced Amount',
 | 
			
		||||
    'invoice_item_fields' => 'Invoice Item Fields',
 | 
			
		||||
    'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
 | 
			
		||||
    'recurring_invoice_number' => 'Recurring Invoice Number',
 | 
			
		||||
    'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
 | 
			
		||||
    'enable_client_portal' => 'Dashboard',
 | 
			
		||||
    'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
 | 
			
		||||
 | 
			
		||||
    // Client Passwords
 | 
			
		||||
    'enable_portal_password'=>'Password protect invoices',
 | 
			
		||||
    'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
 | 
			
		||||
    'send_portal_password'=>'Generate password automatically',
 | 
			
		||||
    'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
 | 
			
		||||
    
 | 
			
		||||
    'expired' => 'Expired',
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@ -939,7 +939,7 @@ return array(
 | 
			
		||||
    'notes' => 'Notes',
 | 
			
		||||
    'invoice_will_create' => 'client will be created',
 | 
			
		||||
    'invoices_will_create' => 'invoices will be created',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import',
 | 
			
		||||
    'failed_to_import' => 'The following records failed to import, they either already exist or are missing required fields.',
 | 
			
		||||
 | 
			
		||||
    'publishable_key' => 'Publishable Key',
 | 
			
		||||
    'secret_key' => 'Secret Key',
 | 
			
		||||
@ -1128,4 +1128,73 @@ return array(
 | 
			
		||||
    'overdue' => 'Overdue',
 | 
			
		||||
    'white_label_text' => 'Purchase a ONE YEAR white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the client portal and help support our project.',
 | 
			
		||||
 | 
			
		||||
    'navigation' => 'Navigation',
 | 
			
		||||
    'list_invoices' => 'List Invoices',
 | 
			
		||||
    'list_clients' => 'List Clients',
 | 
			
		||||
    'list_quotes' => 'List Quotes',
 | 
			
		||||
    'list_tasks' => 'List Tasks',
 | 
			
		||||
    'list_expenses' => 'List Expenses',
 | 
			
		||||
    'list_recurring_invoices' => 'List Recurring Invoices',
 | 
			
		||||
    'list_payments' => 'List Payments',
 | 
			
		||||
    'list_credits' => 'List Credits',
 | 
			
		||||
    'tax_name' => 'Tax Name',
 | 
			
		||||
    'report_settings' => 'Report Settings',
 | 
			
		||||
    'search_hotkey' => 'shortcut is /',
 | 
			
		||||
 | 
			
		||||
    'new_user' => 'New User',
 | 
			
		||||
    'new_product' => 'New Product',
 | 
			
		||||
    'new_tax_rate' => 'New Tax Rate',
 | 
			
		||||
    'invoiced_amount' => 'Invoiced Amount',
 | 
			
		||||
    'invoice_item_fields' => 'Invoice Item Fields',
 | 
			
		||||
    'custom_invoice_item_fields_help' => 'Add a field when creating an invoice item and display the label and value on the PDF.',
 | 
			
		||||
    'recurring_invoice_number' => 'Recurring Invoice Number',
 | 
			
		||||
    'recurring_invoice_number_prefix_help' => 'Speciy a prefix to be added to the invoice number for recurring invoices. The default value is \'R\'.',
 | 
			
		||||
    'enable_client_portal' => 'Dashboard',
 | 
			
		||||
    'enable_client_portal_help' => 'Show/hide the dashboard page in the client portal.',
 | 
			
		||||
 | 
			
		||||
    // Client Passwords
 | 
			
		||||
    'enable_portal_password'=>'Password protect invoices',
 | 
			
		||||
    'enable_portal_password_help'=>'Allows you to set a password for each contact. If a password is set, the contact will be required to enter a password before viewing invoices.',
 | 
			
		||||
    'send_portal_password'=>'Generate password automatically',
 | 
			
		||||
    'send_portal_password_help'=>'If no password is set, one will be generated and sent with the first invoice.',
 | 
			
		||||
    
 | 
			
		||||
    'expired' => 'Expired',
 | 
			
		||||
    'invalid_card_number' => 'The credit card number is not valid.',
 | 
			
		||||
    'invalid_expiry' => 'The expiration date is not valid.',
 | 
			
		||||
    'invalid_cvv' => 'The CVV is not valid.',
 | 
			
		||||
    'cost' => 'Cost',
 | 
			
		||||
    'create_invoice_for_sample' => 'Note: create your first invoice to see a preview here.',
 | 
			
		||||
    
 | 
			
		||||
    // User Permissions
 | 
			
		||||
    'owner' => 'Owner',
 | 
			
		||||
    'administrator' => 'Administrator',
 | 
			
		||||
    'administrator_help' => 'Allow user to manage users, change settings and modify all records',
 | 
			
		||||
    'user_create_all' => 'Create clients, invoices, etc.',
 | 
			
		||||
    'user_view_all' => 'View all clients, invoices, etc.',
 | 
			
		||||
    'user_edit_all' => 'Edit all clients, invoices, etc.',
 | 
			
		||||
    'gateway_help_20' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'gateway_help_21' => ':link to sign up for Sage Pay.',
 | 
			
		||||
    'partial_due' => 'Partial Due',
 | 
			
		||||
    'restore_vendor' => 'Restore Vendor',
 | 
			
		||||
    'restored_vendor' => 'Successfully restored vendor',
 | 
			
		||||
    'restored_expense' => 'Successfully restored expense',
 | 
			
		||||
    'permissions' => 'Permissions',
 | 
			
		||||
    'create_all_help' => 'Allow user to create and modify records',
 | 
			
		||||
    'view_all_help' => 'Allow user to view records they didn\'t create',
 | 
			
		||||
    'edit_all_help' => 'Allow user to modify records they didn\'t create',
 | 
			
		||||
    'view_payment' => 'View Payment', 
 | 
			
		||||
   
 | 
			
		||||
    'january' => 'January',
 | 
			
		||||
    'february' => 'February',
 | 
			
		||||
    'march' => 'March',
 | 
			
		||||
    'april' => 'April',
 | 
			
		||||
    'may' => 'May',
 | 
			
		||||
    'june' => 'June',
 | 
			
		||||
    'july' => 'July',
 | 
			
		||||
    'august' => 'August',
 | 
			
		||||
    'september' => 'September',
 | 
			
		||||
    'october' => 'October',
 | 
			
		||||
    'november' => 'November',
 | 
			
		||||
    'december' => 'December',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@ -52,6 +52,15 @@
 | 
			
		||||
    @foreach ($gateways as $gateway)
 | 
			
		||||
 | 
			
		||||
        <div id="gateway_{{ $gateway->id }}_div" class='gateway-fields' style="display: none">
 | 
			
		||||
            @if ($gateway->getHelp())
 | 
			
		||||
                <div class="form-group">
 | 
			
		||||
                    <label class="control-label col-lg-4 col-sm-4"></label>
 | 
			
		||||
                    <div class="col-lg-8 col-sm-8 help-block">
 | 
			
		||||
                        {!! $gateway->getHelp() !!}
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            @endif
 | 
			
		||||
 | 
			
		||||
            @foreach ($gateway->fields as $field => $details)
 | 
			
		||||
 | 
			
		||||
                @if ($details && !$accountGateway)
 | 
			
		||||
@ -64,24 +73,15 @@
 | 
			
		||||
                    && isset($_ENV['DWOLLA_KEY']) && isset($_ENV['DWOLLA_SECRET']))
 | 
			
		||||
                    {{-- do nothing --}}
 | 
			
		||||
                @elseif ($field == 'testMode' || $field == 'developerMode' || $field == 'sandbox')
 | 
			
		||||
                    {!! Former::checkbox($gateway->id.'_'.$field)->label(Utils::toSpaceCase($field))->text('Enable')->value('true') !!}
 | 
			
		||||
                    {!! Former::checkbox($gateway->id.'_'.$field)->label(ucwords(Utils::toSpaceCase($field)))->text('Enable')->value('true') !!}
 | 
			
		||||
                @elseif ($field == 'username' || $field == 'password')
 | 
			
		||||
                    {!! Former::text($gateway->id.'_'.$field)->label('API '. ucfirst(Utils::toSpaceCase($field))) !!}
 | 
			
		||||
                @else
 | 
			
		||||
                    {!! Former::text($gateway->id.'_'.$field)->label($gateway->id == GATEWAY_STRIPE ? trans('texts.secret_key') : Utils::toSpaceCase($field)) !!}
 | 
			
		||||
                    {!! Former::text($gateway->id.'_'.$field)->label($gateway->id == GATEWAY_STRIPE ? trans('texts.secret_key') : ucwords(Utils::toSpaceCase($field))) !!}
 | 
			
		||||
                @endif
 | 
			
		||||
 | 
			
		||||
            @endforeach
 | 
			
		||||
 | 
			
		||||
            @if ($gateway->getHelp())
 | 
			
		||||
                <div class="form-group">
 | 
			
		||||
                    <label class="control-label col-lg-4 col-sm-4"></label>
 | 
			
		||||
                    <div class="col-lg-8 col-sm-8 help-block">
 | 
			
		||||
                        {!! $gateway->getHelp() !!}
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            @endif
 | 
			
		||||
 | 
			
		||||
            @if ($gateway->id == GATEWAY_STRIPE)
 | 
			
		||||
                {!! Former::text('publishable_key') !!}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@
 | 
			
		||||
	@include('accounts.nav', ['selected' => ACCOUNT_API_TOKENS, 'advanced' => true])
 | 
			
		||||
 | 
			
		||||
  <div class="pull-right">
 | 
			
		||||
  {!! Button::normal(trans('texts.documentation'))->asLinkTo(NINJA_WEB_URL.'/knowledgebase/api-documentation/')->withAttributes(['target' => '_blank'])->appendIcon(Icon::create('info-sign')) !!}
 | 
			
		||||
  {!! Button::normal(trans('texts.documentation'))->asLinkTo(NINJA_WEB_URL.'/api-documentation/')->withAttributes(['target' => '_blank'])->appendIcon(Icon::create('info-sign')) !!}
 | 
			
		||||
  @if (Utils::isNinja())  
 | 
			
		||||
    {!! Button::normal(trans('texts.zapier'))->asLinkTo(ZAPIER_URL)->withAttributes(['target' => '_blank']) !!}
 | 
			
		||||
  @endif
 | 
			
		||||
@ -51,4 +51,9 @@
 | 
			
		||||
 | 
			
		||||
  </script>
 | 
			
		||||
 | 
			
		||||
  @if (Utils::isNinja() && !Utils::isReseller())
 | 
			
		||||
    <p> </p>
 | 
			
		||||
    <script src="https://zapier.com/zapbook/embed/widget.js?services=invoice-ninja&container=false&limit=6"></script>
 | 
			
		||||
  @endif
 | 
			
		||||
  
 | 
			
		||||
@stop
 | 
			
		||||
 | 
			
		||||
@ -28,45 +28,47 @@
 | 
			
		||||
@include('accounts.nav', ['selected' => ACCOUNT_CLIENT_PORTAL])
 | 
			
		||||
 | 
			
		||||
<div class="row">
 | 
			
		||||
	<div class="panel panel-default">
 | 
			
		||||
		<div class="panel-heading">
 | 
			
		||||
			<h3 class="panel-title">{!! trans('texts.client_portal') !!}</h3>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="panel-body">
 | 
			
		||||
			<div class="col-md-10 col-md-offset-1">
 | 
			
		||||
				{!! Former::checkbox('enable_client_portal')
 | 
			
		||||
					->text(trans('texts.enable'))
 | 
			
		||||
					->help(trans('texts.enable_client_portal_help')) !!}
 | 
			
		||||
			</div>
 | 
			
		||||
			<div class="col-md-10 col-md-offset-1">
 | 
			
		||||
				{!! Former::checkbox('enable_portal_password')
 | 
			
		||||
					->text(trans('texts.enable_portal_password'))
 | 
			
		||||
					->help(trans('texts.enable_portal_password_help'))
 | 
			
		||||
					->label(' ') !!}
 | 
			
		||||
			</div>
 | 
			
		||||
			<div class="col-md-10 col-md-offset-1">
 | 
			
		||||
				{!! Former::checkbox('send_portal_password')
 | 
			
		||||
					->text(trans('texts.send_portal_password'))
 | 
			
		||||
					->help(trans('texts.send_portal_password_help'))
 | 
			
		||||
					->label(' ') !!}
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
	<div class="panel panel-default">
 | 
			
		||||
		<div class="panel-heading">
 | 
			
		||||
			<h3 class="panel-title">{!! trans('texts.custom_css') !!}</h3>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="panel-body">
 | 
			
		||||
			<div class="col-md-10 col-md-offset-1">
 | 
			
		||||
				{!! Former::textarea('client_view_css')
 | 
			
		||||
				->label(trans('texts.custom_css'))
 | 
			
		||||
				->rows(10)
 | 
			
		||||
				->raw()
 | 
			
		||||
				->autofocus()
 | 
			
		||||
				->maxlength(60000)
 | 
			
		||||
				->style("min-width:100%;max-width:100%;font-family:'Roboto Mono', 'Lucida Console', Monaco, monospace;font-size:14px;'") !!}
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
    <div class="col-md-12">
 | 
			
		||||
        <div class="panel panel-default">
 | 
			
		||||
            <div class="panel-heading">
 | 
			
		||||
                <h3 class="panel-title">{!! trans('texts.client_portal') !!}</h3>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="panel-body">
 | 
			
		||||
                <div class="col-md-10 col-md-offset-1">
 | 
			
		||||
                    {!! Former::checkbox('enable_client_portal')
 | 
			
		||||
                        ->text(trans('texts.enable'))
 | 
			
		||||
                        ->help(trans('texts.enable_client_portal_help')) !!}
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="col-md-10 col-md-offset-1">
 | 
			
		||||
                    {!! Former::checkbox('enable_portal_password')
 | 
			
		||||
                        ->text(trans('texts.enable_portal_password'))
 | 
			
		||||
                        ->help(trans('texts.enable_portal_password_help'))
 | 
			
		||||
                        ->label(' ') !!}
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="col-md-10 col-md-offset-1">
 | 
			
		||||
                    {!! Former::checkbox('send_portal_password')
 | 
			
		||||
                        ->text(trans('texts.send_portal_password'))
 | 
			
		||||
                        ->help(trans('texts.send_portal_password_help'))
 | 
			
		||||
                        ->label(' ') !!}
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="panel panel-default">
 | 
			
		||||
            <div class="panel-heading">
 | 
			
		||||
                <h3 class="panel-title">{!! trans('texts.custom_css') !!}</h3>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="panel-body">
 | 
			
		||||
                <div class="col-md-10 col-md-offset-1">
 | 
			
		||||
                    {!! Former::textarea('client_view_css')
 | 
			
		||||
                    ->label(trans('texts.custom_css'))
 | 
			
		||||
                    ->rows(10)
 | 
			
		||||
                    ->raw()
 | 
			
		||||
                    ->autofocus()
 | 
			
		||||
                    ->maxlength(60000)
 | 
			
		||||
                    ->style("min-width:100%;max-width:100%;font-family:'Roboto Mono', 'Lucida Console', Monaco, monospace;font-size:14px;'") !!}
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -153,7 +153,6 @@
 | 
			
		||||
 | 
			
		||||
        @if (isset($sampleInvoice) && $sampleInvoice)
 | 
			
		||||
            var sample = {!! $sampleInvoice->toJSON() !!}
 | 
			
		||||
            console.log(sample);
 | 
			
		||||
            $('#sampleData').show().html(prettyJson(sample));
 | 
			
		||||
        @endif
 | 
			
		||||
    });
 | 
			
		||||
@ -222,6 +221,9 @@
 | 
			
		||||
            {!! trans('texts.customize_help') !!}
 | 
			
		||||
 | 
			
		||||
            <pre id="sampleData" style="display:none;height:200px;padding-top:16px;"></pre>
 | 
			
		||||
            @if (empty($sampleInvoice))
 | 
			
		||||
                <div class="help-block">{{ trans('texts.create_invoice_for_sample') }}</div>
 | 
			
		||||
            @endif
 | 
			
		||||
          </div>
 | 
			
		||||
 | 
			
		||||
         <div class="modal-footer" style="margin-top: 0px">
 | 
			
		||||
 | 
			
		||||
@ -50,7 +50,7 @@
 | 
			
		||||
                            ->help(trans('texts.subdomain_help')) !!}
 | 
			
		||||
 | 
			
		||||
                {!! Former::text('iframe_url')
 | 
			
		||||
                            ->placeholder('http://www.example.com/invoice')
 | 
			
		||||
                            ->placeholder('https://www.example.com/invoice')
 | 
			
		||||
                            ->appendIcon('question-sign')
 | 
			
		||||
                            ->addGroupClass('iframe_url')
 | 
			
		||||
                            ->label(' ')
 | 
			
		||||
 | 
			
		||||
@ -60,7 +60,16 @@
 | 
			
		||||
      @else
 | 
			
		||||
        NINJA.headerFont = NINJA.bodyFont = 'Roboto';
 | 
			
		||||
      @endif
 | 
			
		||||
      var fields = ['item', 'description', 'unit_cost', 'quantity', 'line_total', 'terms'];
 | 
			
		||||
      var fields = [
 | 
			
		||||
          'item', 
 | 
			
		||||
          'description', 
 | 
			
		||||
          'unit_cost', 
 | 
			
		||||
          'quantity', 
 | 
			
		||||
          'line_total', 
 | 
			
		||||
          'terms', 
 | 
			
		||||
          'balance_due', 
 | 
			
		||||
          'partial_due'
 | 
			
		||||
      ];
 | 
			
		||||
      invoiceLabels.old = {};
 | 
			
		||||
      for (var i=0; i<fields.length; i++) {
 | 
			
		||||
        var field = fields[i];
 | 
			
		||||
@ -181,11 +190,13 @@
 | 
			
		||||
                              {!! Former::text('labels_item')->label(trans('texts.item')) !!}
 | 
			
		||||
                              {!! Former::text('labels_description')->label(trans('texts.description')) !!}
 | 
			
		||||
                              {!! Former::text('labels_unit_cost')->label(trans('texts.unit_cost')) !!}
 | 
			
		||||
                              {!! Former::text('labels_quantity')->label(trans('texts.quantity')) !!}
 | 
			
		||||
                        </div>
 | 
			
		||||
                        <div class="col-md-6">
 | 
			
		||||
                              {!! Former::text('labels_quantity')->label(trans('texts.quantity')) !!}
 | 
			
		||||
                              {!! Former::text('labels_line_total')->label(trans('texts.line_total')) !!}
 | 
			
		||||
                              {!! Former::text('labels_terms')->label(trans('texts.terms')) !!}
 | 
			
		||||
                              {!! Former::text('labels_balance_due')->label(trans('texts.balance_due')) !!}
 | 
			
		||||
                              {!! Former::text('labels_partial_due')->label(trans('texts.partial_due')) !!}
 | 
			
		||||
                        </div>
 | 
			
		||||
                      </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -11,26 +11,29 @@
 | 
			
		||||
    @include('accounts.nav', ['selected' => ACCOUNT_LOCALIZATION])
 | 
			
		||||
 | 
			
		||||
    <div class="row">
 | 
			
		||||
        
 | 
			
		||||
        <div class="col-md-12">
 | 
			
		||||
 | 
			
		||||
        <div class="panel panel-default">
 | 
			
		||||
          <div class="panel-heading">
 | 
			
		||||
            <h3 class="panel-title">{!! trans('texts.localization') !!}</h3>
 | 
			
		||||
          </div>
 | 
			
		||||
            <div class="panel-body form-padding-right">
 | 
			
		||||
            <div class="panel panel-default">
 | 
			
		||||
            <div class="panel-heading">
 | 
			
		||||
                <h3 class="panel-title">{!! trans('texts.localization') !!}</h3>
 | 
			
		||||
            </div>
 | 
			
		||||
                <div class="panel-body form-padding-right">
 | 
			
		||||
 | 
			
		||||
            {!! Former::select('currency_id')->addOption('','')
 | 
			
		||||
                ->fromQuery($currencies, 'name', 'id') !!}          
 | 
			
		||||
            {!! Former::select('language_id')->addOption('','')
 | 
			
		||||
                ->fromQuery($languages, 'name', 'id') !!}           
 | 
			
		||||
            {!! Former::select('timezone_id')->addOption('','')
 | 
			
		||||
                ->fromQuery($timezones, 'location', 'id') !!}
 | 
			
		||||
            {!! Former::select('date_format_id')->addOption('','')
 | 
			
		||||
                ->fromQuery($dateFormats, 'label', 'id') !!}
 | 
			
		||||
            {!! Former::select('datetime_format_id')->addOption('','')
 | 
			
		||||
                ->fromQuery($datetimeFormats, 'label', 'id') !!}
 | 
			
		||||
            {!! Former::checkbox('military_time')->text(trans('texts.enable')) !!}
 | 
			
		||||
            {{-- Former::checkbox('show_currency_code')->text(trans('texts.enable')) --}}
 | 
			
		||||
                {!! Former::select('currency_id')->addOption('','')
 | 
			
		||||
                    ->fromQuery($currencies, 'name', 'id') !!}          
 | 
			
		||||
                {!! Former::select('language_id')->addOption('','')
 | 
			
		||||
                    ->fromQuery($languages, 'name', 'id') !!}           
 | 
			
		||||
                {!! Former::select('timezone_id')->addOption('','')
 | 
			
		||||
                    ->fromQuery($timezones, 'location', 'id') !!}
 | 
			
		||||
                {!! Former::select('date_format_id')->addOption('','')
 | 
			
		||||
                    ->fromQuery($dateFormats, 'label', 'id') !!}
 | 
			
		||||
                {!! Former::select('datetime_format_id')->addOption('','')
 | 
			
		||||
                    ->fromQuery($datetimeFormats, 'label', 'id') !!}
 | 
			
		||||
                {!! Former::checkbox('military_time')->text(trans('texts.enable')) !!}
 | 
			
		||||
                {{-- Former::checkbox('show_currency_code')->text(trans('texts.enable')) --}}
 | 
			
		||||
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
@ -6,22 +6,23 @@
 | 
			
		||||
    @include('accounts.nav', ['selected' => ACCOUNT_SYSTEM_SETTINGS])
 | 
			
		||||
 | 
			
		||||
    <div class="row">
 | 
			
		||||
 | 
			
		||||
        {!! Former::open('/update_setup')
 | 
			
		||||
            ->addClass('warn-on-exit')
 | 
			
		||||
            ->autocomplete('off')
 | 
			
		||||
            ->rules([
 | 
			
		||||
                'app[url]' => 'required',
 | 
			
		||||
                //'database[default]' => 'required',
 | 
			
		||||
                'database[type][host]' => 'required',
 | 
			
		||||
                'database[type][database]' => 'required',
 | 
			
		||||
                'database[type][username]' => 'required',
 | 
			
		||||
                'database[type][password]' => 'required',
 | 
			
		||||
              ]) !!}
 | 
			
		||||
        <div class="col-md-12">
 | 
			
		||||
            {!! Former::open('/update_setup')
 | 
			
		||||
                ->addClass('warn-on-exit')
 | 
			
		||||
                ->autocomplete('off')
 | 
			
		||||
                ->rules([
 | 
			
		||||
                    'app[url]' => 'required',
 | 
			
		||||
                    //'database[default]' => 'required',
 | 
			
		||||
                    'database[type][host]' => 'required',
 | 
			
		||||
                    'database[type][database]' => 'required',
 | 
			
		||||
                    'database[type][username]' => 'required',
 | 
			
		||||
                    'database[type][password]' => 'required',
 | 
			
		||||
                ]) !!}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        @include('partials.system_settings')
 | 
			
		||||
            @include('partials.system_settings')
 | 
			
		||||
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <center>
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@
 | 
			
		||||
          }
 | 
			
		||||
        </style>
 | 
			
		||||
 | 
			
		||||
        <script src="https://maps.googleapis.com/maps/api/js"></script>
 | 
			
		||||
        <script src="https://maps.googleapis.com/maps/api/js?key={{ env('GOOGLE_MAPS_API_KEY') }}"></script>
 | 
			
		||||
    @endif
 | 
			
		||||
@stop
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -401,6 +401,7 @@
 | 
			
		||||
        <span class="icon-bar"></span>
 | 
			
		||||
      </button>
 | 
			
		||||
      <a href="{{ URL::to(NINJA_WEB_URL) }}" class='navbar-brand' target="_blank">
 | 
			
		||||
        {{-- Per our license, please do not remove or modify this link. --}}
 | 
			
		||||
        <img src="{{ asset('images/invoiceninja-logo.png') }}" style="height:20px;width:auto;padding-right:10px"/>
 | 
			
		||||
      </a>	    
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
@ -196,10 +196,10 @@
 | 
			
		||||
				<th style="min-width:32px;" class="hide-border"></th>
 | 
			
		||||
				<th style="min-width:160px">{{ $invoiceLabels['item'] }}</th>
 | 
			
		||||
				<th style="width:100%">{{ $invoiceLabels['description'] }}</th>
 | 
			
		||||
                @if ($account->custom_invoice_item_label1)
 | 
			
		||||
                @if ($account->showCustomField('custom_invoice_item_label1'))
 | 
			
		||||
                    <th style="min-width:120px">{{ $account->custom_invoice_item_label1 }}</th>
 | 
			
		||||
                @endif
 | 
			
		||||
                @if ($account->custom_invoice_item_label2)
 | 
			
		||||
                @if ($account->showCustomField('custom_invoice_item_label2'))
 | 
			
		||||
                    <th style="min-width:120px">{{ $account->custom_invoice_item_label2 }}</th>
 | 
			
		||||
                @endif
 | 
			
		||||
				<th style="min-width:120px" data-bind="text: costLabel">{{ $invoiceLabels['unit_cost'] }}</th>
 | 
			
		||||
@ -224,12 +224,12 @@
 | 
			
		||||
                        <input type="text" data-bind="value: task_public_id, attr: {name: 'invoice_items[' + $index() + '][task_public_id]'}" style="display: none"/>
 | 
			
		||||
						<input type="text" data-bind="value: expense_public_id, attr: {name: 'invoice_items[' + $index() + '][expense_public_id]'}" style="display: none"/>
 | 
			
		||||
				</td>
 | 
			
		||||
                @if ($account->custom_invoice_item_label1)
 | 
			
		||||
                @if ($account->showCustomField('custom_invoice_item_label1'))
 | 
			
		||||
                    <td>
 | 
			
		||||
                        <input data-bind="value: custom_value1, valueUpdate: 'afterkeydown', attr: {name: 'invoice_items[' + $index() + '][custom_value1]'}" class="form-control invoice-item"/>
 | 
			
		||||
                    </td>
 | 
			
		||||
                @endif
 | 
			
		||||
                @if ($account->custom_invoice_item_label2)
 | 
			
		||||
                @if ($account->showCustomField('custom_invoice_item_label2'))
 | 
			
		||||
                    <td>
 | 
			
		||||
                        <input data-bind="value: custom_value2, valueUpdate: 'afterkeydown', attr: {name: 'invoice_items[' + $index() + '][custom_value2]'}" class="form-control invoice-item"/>
 | 
			
		||||
                    </td>
 | 
			
		||||
@ -262,7 +262,7 @@
 | 
			
		||||
		<tfoot>
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td class="hide-border"/>
 | 
			
		||||
				<td class="hide-border" colspan="{{ 2 + ($account->custom_invoice_item_label1 ? 1 : 0) + ($account->custom_invoice_item_label2 ? 1 : 0) }}" rowspan="6" style="vertical-align:top">
 | 
			
		||||
				<td class="hide-border" colspan="{{ 2 + ($account->showCustomField('custom_invoice_item_label1') ? 1 : 0) + ($account->showCustomField('custom_invoice_item_label2') ? 1 : 0) }}" rowspan="6" style="vertical-align:top">
 | 
			
		||||
					<br/>
 | 
			
		||||
                    <div role="tabpanel">
 | 
			
		||||
 | 
			
		||||
@ -385,11 +385,18 @@
 | 
			
		||||
				</tr>
 | 
			
		||||
			@endif
 | 
			
		||||
 | 
			
		||||
			<tr style="font-size:1.05em">
 | 
			
		||||
			<tr data-bind="style: { 'font-weight': partial() ? 'normal' : 'bold', 'font-size': partial() ? '1em' : '1.05em' }">
 | 
			
		||||
				<td class="hide-border" colspan="3"/>
 | 
			
		||||
				<td class="hide-border" style="display:none" data-bind="visible: $root.invoice_item_taxes.show"/>
 | 
			
		||||
				<td class="hide-border" colspan="{{ $account->hide_quantity ? 1 : 2 }}"><b>{{ trans($entityType == ENTITY_INVOICE ? 'texts.balance_due' : 'texts.total') }}</b></td>
 | 
			
		||||
				<td class="hide-border" style="text-align: right"><span data-bind="text: totals.total"></span></td>
 | 
			
		||||
				<td class="hide-border" data-bind="css: {'hide-border': !partial()}" colspan="{{ $account->hide_quantity ? 1 : 2 }}">{{ $entityType == ENTITY_INVOICE ? $invoiceLabels['balance_due'] : trans('texts.total') }}</td>
 | 
			
		||||
				<td class="hide-border" data-bind="css: {'hide-border': !partial()}" style="text-align: right"><span data-bind="text: totals.total"></span></td>
 | 
			
		||||
			</tr>
 | 
			
		||||
 | 
			
		||||
			<tr style="font-size:1.05em; display:none; font-weight:bold" data-bind="visible: partial">
 | 
			
		||||
				<td class="hide-border" colspan="3"/>
 | 
			
		||||
				<td class="hide-border" style="display:none" data-bind="visible: $root.invoice_item_taxes.show"/>
 | 
			
		||||
				<td class="hide-border" colspan="{{ $account->hide_quantity ? 1 : 2 }}">{{ $invoiceLabels['partial_due'] }}</td>
 | 
			
		||||
				<td class="hide-border" style="text-align: right"><span data-bind="text: totals.partial"></span></td>
 | 
			
		||||
			</tr>
 | 
			
		||||
 | 
			
		||||
		</tfoot>
 | 
			
		||||
 | 
			
		||||
@ -512,7 +512,11 @@ function InvoiceModel(data) {
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    self.totals.total = ko.computed(function() {
 | 
			
		||||
        return self.formatMoney(self.partial() ? self.partial() : self.totals.rawTotal());
 | 
			
		||||
        return self.formatMoney(self.totals.rawTotal());
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    self.totals.partial = ko.computed(function() {
 | 
			
		||||
        return self.formatMoney(self.partial());
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    self.onDragged = function(item) {
 | 
			
		||||
 | 
			
		||||
@ -70,7 +70,7 @@
 | 
			
		||||
            </button>
 | 
			
		||||
            @if (!isset($hideLogo) || !$hideLogo)
 | 
			
		||||
                {{-- Per our license, please do not remove or modify this link. --}}
 | 
			
		||||
                <a class="navbar-brand" href="{{ URL::to(NINJA_WEB_URL) }}" target="_blank"><img src="{{ asset('images/invoiceninja-logo.png') }}"></a>
 | 
			
		||||
                <a class="navbar-brand" href="{{ URL::to(NINJA_WEB_URL) }}" target="_blank"><img src="{{ asset('images/invoiceninja-logo.png') }}" style="height:20px"></a>
 | 
			
		||||
            @endif            
 | 
			
		||||
        </div>
 | 
			
		||||
        <div id="navbar" class="collapse navbar-collapse">
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,7 @@
 | 
			
		||||
		</div>
 | 
			
		||||
		-->
 | 
			
		||||
 | 
			
		||||
		<h2>{{ $title }}</h2>
 | 
			
		||||
		<h3>{{ $title }}</h3>
 | 
			
		||||
 | 
			
		||||
		{!! Datatable::table()
 | 
			
		||||
	    	->addColumn($columns)
 | 
			
		||||
 | 
			
		||||
@ -16,13 +16,24 @@
 | 
			
		||||
 | 
			
		||||
<div class="panel panel-default">
 | 
			
		||||
<div class="panel-heading">
 | 
			
		||||
    <h3 class="panel-title">{!! $title !!}</h3>
 | 
			
		||||
    <h3 class="panel-title">{!! trans('texts.user_details') !!}</h3>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="panel-body form-padding-right">
 | 
			
		||||
 | 
			
		||||
  {!! Former::text('first_name') !!}
 | 
			
		||||
  {!! Former::text('last_name') !!}
 | 
			
		||||
  {!! Former::text('email') !!}
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="panel panel-default">
 | 
			
		||||
<div class="panel-heading">
 | 
			
		||||
    <h3 class="panel-title">{!! trans('texts.permissions') !!}</h3>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="panel-body form-padding-right">
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  {!! Former::checkbox('is_admin')
 | 
			
		||||
      ->label(' ')
 | 
			
		||||
      ->text(trans('texts.administrator'))
 | 
			
		||||
@ -31,17 +42,20 @@
 | 
			
		||||
      ->value('create_all')
 | 
			
		||||
      ->label(' ')
 | 
			
		||||
      ->id('permissions_create_all')
 | 
			
		||||
      ->text(trans('texts.user_create_all')) !!}
 | 
			
		||||
      ->text(trans('texts.user_create_all'))
 | 
			
		||||
      ->help(trans('texts.create_all_help')) !!}
 | 
			
		||||
  {!! Former::checkbox('permissions[view_all]')
 | 
			
		||||
      ->value('view_all')
 | 
			
		||||
      ->label(' ')
 | 
			
		||||
      ->id('permissions_view_all')
 | 
			
		||||
      ->text(trans('texts.user_view_all')) !!}
 | 
			
		||||
      ->text(trans('texts.user_view_all'))
 | 
			
		||||
      ->help(trans('texts.view_all_help')) !!}
 | 
			
		||||
  {!! Former::checkbox('permissions[edit_all]')
 | 
			
		||||
      ->value('edit_all')
 | 
			
		||||
      ->label(' ')
 | 
			
		||||
      ->id('permissions_edit_all')
 | 
			
		||||
      ->text(trans('texts.user_edit_all')) !!}
 | 
			
		||||
      ->text(trans('texts.user_edit_all'))
 | 
			
		||||
      ->help(trans('texts.edit_all_help')) !!}
 | 
			
		||||
    
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								resources/views/vendors/show.blade.php
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								resources/views/vendors/show.blade.php
									
									
									
									
										vendored
									
									
								
							@ -14,7 +14,7 @@
 | 
			
		||||
          }
 | 
			
		||||
        </style>
 | 
			
		||||
 | 
			
		||||
        <script src="https://maps.googleapis.com/maps/api/js"></script>
 | 
			
		||||
        <script src="https://maps.googleapis.com/maps/api/js?key={{ env('GOOGLE_MAPS_API_KEY') }}"></script>
 | 
			
		||||
    @endif
 | 
			
		||||
@stop
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -80,9 +80,9 @@ $I->amOnPage('/settings/user_management');
 | 
			
		||||
$I->see('Add User');
 | 
			
		||||
 | 
			
		||||
//try to logout
 | 
			
		||||
$I->click('#myAccountButton');
 | 
			
		||||
$I->see('Log Out');
 | 
			
		||||
$I->click('Log Out');
 | 
			
		||||
//$I->click('#myAccountButton');
 | 
			
		||||
//$I->see('Log Out');
 | 
			
		||||
//$I->click('Log Out');
 | 
			
		||||
 | 
			
		||||
// Miscellaneous pages
 | 
			
		||||
$I->amOnPage('/terms');
 | 
			
		||||
 | 
			
		||||
@ -67,6 +67,7 @@ class OnlinePaymentCest
 | 
			
		||||
            $I->amOnPage('/view/' . $invitationKey);
 | 
			
		||||
            $I->click('Pay Now');
 | 
			
		||||
 | 
			
		||||
            /*
 | 
			
		||||
            $I->fillField(['name' => 'first_name'], $this->faker->firstName);
 | 
			
		||||
            $I->fillField(['name' => 'last_name'], $this->faker->lastName);
 | 
			
		||||
            $I->fillField(['name' => 'address1'], $this->faker->streetAddress);
 | 
			
		||||
@ -75,6 +76,8 @@ class OnlinePaymentCest
 | 
			
		||||
            $I->fillField(['name' => 'state'], $this->faker->state);
 | 
			
		||||
            $I->fillField(['name' => 'postal_code'], $this->faker->postcode);
 | 
			
		||||
            $I->selectDropdown($I, 'United States', '.country-select .dropdown-toggle');
 | 
			
		||||
            */
 | 
			
		||||
            
 | 
			
		||||
            $I->fillField('#card_number', '4242424242424242');
 | 
			
		||||
            $I->fillField('#cvv', '1234');
 | 
			
		||||
            $I->selectOption('#expiration_month', 12);
 | 
			
		||||
 | 
			
		||||
@ -30,8 +30,8 @@ class TaxRatesCest
 | 
			
		||||
        $total += round($itemCost * $itemTaxRate / 100, 2);
 | 
			
		||||
        $total += round($itemCost * $invoiceTaxRate / 100, 2);
 | 
			
		||||
        
 | 
			
		||||
        $itemTaxRate = number_format($itemTaxRate, 2);
 | 
			
		||||
        $invoiceTaxRate = number_format($invoiceTaxRate, 2);
 | 
			
		||||
        $itemTaxRate = number_format($itemTaxRate, 3);
 | 
			
		||||
        $invoiceTaxRate = number_format($invoiceTaxRate, 3);
 | 
			
		||||
 | 
			
		||||
        // create tax rates
 | 
			
		||||
        $I->amOnPage('/tax_rates/create');
 | 
			
		||||
@ -72,7 +72,7 @@ class TaxRatesCest
 | 
			
		||||
        $I->selectDropdown($I, $clientEmail, '.client_select .dropdown-toggle');
 | 
			
		||||
        $I->fillField('table.invoice-table tbody tr:nth-child(1) #product_key', $productKey);
 | 
			
		||||
        $I->click('table.invoice-table tbody tr:nth-child(1) .tt-selectable');
 | 
			
		||||
        $I->selectOption('#taxRateSelect', $invoiceTaxName . ' ' . $invoiceTaxRate . '%');
 | 
			
		||||
        $I->selectOption('#taxRateSelect', $invoiceTaxName . ' ' . floatval($invoiceTaxRate) . '%');
 | 
			
		||||
        $I->wait(2);
 | 
			
		||||
 | 
			
		||||
        // check total is right before saving
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user