1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-05 18:52:44 +01:00
* Performance improvements moving from str_replace to strtr

* Remove legacy docs

* Clean up credit transformer

* Working on invoice emails

* Clean up for invoice designs

* Tests for light and dark theme emails

* Working on reminder scheduling

* Reminder Job Class

* Fixes for github actions

* PHP CS

* Test for reminders

* Test for reminders
This commit is contained in:
David Bomba 2020-04-15 10:30:52 +10:00 committed by GitHub
parent a785329965
commit 74a6c4f2ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
117 changed files with 629 additions and 4045 deletions

View File

@ -22,6 +22,7 @@ jobs:
SESSION_DRIVER: file
NINJA_ENVIRONMENT: development
MULTI_DB_ENABLED: false
NINJA_LICENSE: 123456
TRAVIS: true
MAIL_DRIVER: log

View File

@ -64,7 +64,7 @@ class ArtisanUpgrade extends Command
->setUpdate(true)
->run();
\Log::error(print_r($output,1));
\Log::error(print_r($output, 1));

View File

@ -452,7 +452,7 @@ class CreateTestData extends Command
}
$invoice->custom_value1 = $faker->date;
$invoice->custom_value2 = rand(0,1) ? 'yes' : 'no';
$invoice->custom_value2 = rand(0, 1) ? 'yes' : 'no';
$invoice->save();

View File

@ -12,6 +12,7 @@
namespace App\Console;
use App\Jobs\Cron\RecurringInvoicesCron;
use App\Jobs\Util\ReminderJob;
use App\Jobs\Util\VersionCheck;
use App\Utils\Ninja;
use Illuminate\Console\Scheduling\Schedule;
@ -40,6 +41,8 @@ class Kernel extends ConsoleKernel
//$schedule->job(new RecurringInvoicesCron)->hourly();
$schedule->job(new VersionCheck)->daily();
$schedule->job(new ReminderJob)->daily();
/* Run queue's in shared hosting with this*/
if (Ninja::isSelfHost()) {
$schedule->command('queue:work')->everyMinute()->withoutOverlapping();

View File

@ -135,7 +135,8 @@ class Designer
*/
public function getSection($section):string
{
return str_replace(array_keys($this->exported_variables), array_values($this->exported_variables), $this->design->{$section});
return strtr($this->design->{$section}, $this->exported_variables);
// return str_replace(array_keys($this->exported_variables), array_values($this->exported_variables), $this->design->{$section});
}
private function exportVariables()
@ -197,8 +198,8 @@ class Designer
foreach (array_keys($input_variables) as $value) {
if (array_key_exists($value, $variables)) {
$tmp = str_replace("</span>", "_label</span>", $variables[$value]);
//$tmp = str_replace("</span>", "_label</span>", $variables[$value]);
$tmp = strtr($variables[$value], "</span>", "_label</span>");
$output .= $tmp;
}
}

View File

@ -18,7 +18,6 @@ class CompanyTokenFactory
{
public static function create(int $company_id, int $user_id, int $account_id) :CompanyToken
{
$token = new CompanyToken;
$token->user_id = $user_id;
$token->account_id = $account_id;
@ -28,4 +27,4 @@ class CompanyTokenFactory
return $token;
}
}
}

View File

@ -17,6 +17,8 @@ class EmailBuilder
protected $template_style;
protected $variables = [];
protected $contact = null;
protected $view_link;
protected $view_text;
private function parseTemplate(string $data, bool $is_markdown = true, $contact = null): string
{
@ -27,8 +29,6 @@ class EmailBuilder
//process markdown
if ($is_markdown) {
//$data = Parsedown::instance()->line($data);
$converter = new CommonMarkConverter([
'html_input' => 'allow',
'allow_unsafe_links' => true,
@ -72,7 +72,13 @@ class EmailBuilder
*/
public function setSubject($subject)
{
$this->subject = $this->parseTemplate($subject, false, $this->contact);
//$this->subject = $this->parseTemplate($subject, false, $this->contact);
if (!empty($this->variables)) {
$subject = str_replace(array_keys($this->variables), array_values($this->variables), $subject);
}
$this->subject = $subject;
return $this;
}
@ -82,7 +88,14 @@ class EmailBuilder
*/
public function setBody($body)
{
$this->body = $this->parseTemplate($body, true);
//$this->body = $this->parseTemplate($body, true);
if (!empty($this->variables)) {
$body = str_replace(array_keys($this->variables), array_values($this->variables), $body);
}
$this->body = $body;
return $this;
}
@ -99,8 +112,20 @@ class EmailBuilder
public function setAttachments($attachments)
{
$this->attachments[] = $attachments;
return $this;
}
public function setViewLink($link)
{
$this->view_link = $link;
return $this;
}
public function setViewText($text)
{
$this->view_text = $text;
return $this;
}
/**
* @return mixed
@ -149,4 +174,14 @@ class EmailBuilder
{
return $this->template_style;
}
public function getViewLink()
{
return $this->view_link;
}
public function getViewText()
{
return $this->view_text;
}
}

View File

@ -14,7 +14,7 @@ use App\Utils\Number;
class InvoiceEmail extends EmailBuilder
{
public function build(InvoiceInvitation $invitation, $reminder_template)
public function build(InvoiceInvitation $invitation, $reminder_template = null)
{
$client = $invitation->contact->client;
$invoice = $invitation->invoice;
@ -67,12 +67,14 @@ class InvoiceEmail extends EmailBuilder
}
}
$this->setTemplate($invoice->client->getSetting('email_style'))
$this->setTemplate($client->getSetting('email_style'))
->setContact($contact)
->setVariables($invoice->makeValues($contact))
->setSubject($subject_template)
->setBody($body_template)
->setFooter("<a href='{$invitation->getLink()}'>{$invitation->getLink()}</a>");
->setFooter("<a href='{$invitation->getLink()}'>".ctrans('texts.view_invoice')."</a>")
->setViewLink($invitation->getLink())
->setViewText(ctrans('texts.view_invoice'));
if ($client->getSetting('pdf_email_attachment') !== false) {
$this->setAttachments($invoice->pdf_file_path());

View File

@ -157,5 +157,4 @@ class AccountController extends BaseController
return $this->listResponse($ct);
}
}

View File

@ -23,6 +23,7 @@ use Cache;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Yajra\DataTables\Facades\DataTables;
/**
* Class PaymentController
* @package App\Http\Controllers\ClientPortal\PaymentController

View File

@ -19,7 +19,6 @@ use Illuminate\Http\Request;
class CompanyLedgerController extends BaseController
{
protected $entity_type = CompanyLedger::class;
protected $entity_transformer = CompanyLedgerTransformer::class;
@ -68,10 +67,8 @@ class CompanyLedgerController extends BaseController
*/
public function index(ShowCompanyLedgerRequest $request)
{
$company_ledger = CompanyLedger::whereCompanyId(auth()->user()->company()->id)->orderBy('id', 'ASC');
$company_ledger = CompanyLedger::whereCompanyId(auth()->user()->company()->id)->orderBy('id', 'ASC');
return $this->listResponse($company_ledger);
return $this->listResponse($company_ledger);
}
}

View File

@ -766,6 +766,6 @@ class InvoiceController extends BaseController
$file_path = $invoice->service()->getInvoicePdf($contact);
return response()->download($file_path);
return response()->download($file_path, basename($file_path));
}
}

View File

@ -10,4 +10,4 @@
* @OA\Property(property="updated_at", type="number", format="integer", example="1434342123", description="Timestamp"),
* @OA\Property(property="created_at", type="number", format="integer", example="1434342123", description="Timestamp"),
* )
*/
*/

View File

@ -348,7 +348,6 @@ class SubscriptionController extends BaseController
*/
public function store(StoreSubscriptionRequest $request)
{
$subscription = SubscriptionFactory::create(auth()->user()->company()->id, auth()->user()->id);
$subscription->fill($request->all());
$subscription->save();

View File

@ -359,7 +359,6 @@ class TokenController extends BaseController
*/
public function store(StoreTokenRequest $request)
{
$company_token = CompanyTokenFactory::create(auth()->user()->company()->id, auth()->user()->id, auth()->user()->account_id);
$token = $this->token_repo->save($request->all(), $company_token);
@ -491,5 +490,4 @@ class TokenController extends BaseController
return $this->listResponse(CompanyToken::withTrashed()->whereIn('id', $this->transformKeys($ids)));
}
}

View File

@ -30,7 +30,6 @@ trait VerifiesUserEmail
public function confirm()
{
if ($user = User::whereRaw("BINARY `confirmation_code`= ?", request()->route('confirmation_code'))->first()) {
$user->email_verified_at = now();
$user->confirmation_code = null;
$user->save();

View File

@ -54,8 +54,9 @@ class StoreCompanyRequest extends Request
{
$input = $this->all();
if(array_key_exists('google_analytics_url', $input))
if (array_key_exists('google_analytics_url', $input)) {
$input['google_analytics_key'] = $input['google_analytics_url'];
}
$company_settings = CompanySettings::defaults();

View File

@ -26,5 +26,4 @@ class ShowCompanyLedgerRequest extends Request
{
return auth()->user()->isAdmin();
}
}

View File

@ -29,11 +29,21 @@ class StoreCreditRequest extends FormRequest
*/
public function rules()
{
return [
'client_id' => 'required|exists:clients,id',
// 'invoice_type_id' => 'integer',
// 'documents' => 'mimes:png,ai,svg,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx',
];
$rules = [];
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
foreach (range(0, $documents) as $index) {
$rules['documents.' . $index] = 'file|mimes:png,ai,svg,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,svg,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
$rules['client_id'] = 'required|exists:clients,id,company_id,'.auth()->user()->company()->id;
return $rules;
}
protected function prepareForValidation()
@ -44,7 +54,7 @@ class StoreCreditRequest extends FormRequest
$input['design_id'] = $this->decodePrimaryKey($input['design_id']);
}
if ($input['client_id']) {
if (array_key_exists('client_id', $input) && is_string($input['client_id'])) {
$input['client_id'] = $this->decodePrimaryKey($input['client_id']);
}

View File

@ -30,11 +30,19 @@ class UpdateCreditRequest extends FormRequest
*/
public function rules()
{
return [
'documents' => 'mimes:png,ai,svg,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx',
//'client_id' => 'required|integer',
//'invoice_type_id' => 'integer',
];
$rules = [];
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
foreach (range(0, $documents) as $index) {
$rules['documents.' . $index] = 'file|mimes:png,ai,svg,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,svg,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
return $rules;
}
@ -45,7 +53,7 @@ class UpdateCreditRequest extends FormRequest
if (array_key_exists('design_id', $input) && is_string($input['design_id'])) {
$input['design_id'] = $this->decodePrimaryKey($input['design_id']);
}
if (isset($input['client_id'])) {
$input['client_id'] = $this->decodePrimaryKey($input['client_id']);
}

View File

@ -35,24 +35,21 @@ class StoreInvoiceRequest extends Request
public function rules()
{
$rules = [];
if($this->input('documents') && is_array($this->input('documents'))) {
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
foreach(range(0, $documents) as $index) {
foreach (range(0, $documents) as $index) {
$rules['documents.' . $index] = 'file|mimes:png,ai,svg,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
}
elseif($this->input('documents')){
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,svg,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
$rules['client_id'] = 'required|exists:clients,id,company_id,'.auth()->user()->company()->id;
$rules['client_id'] = 'required|exists:clients,id,company_id,'.auth()->user()->company()->id;
return $rules;
}
protected function prepareForValidation()

View File

@ -40,14 +40,13 @@ class UpdateInvoiceRequest extends Request
{
$rules = [];
if($this->input('documents') && is_array($this->input('documents'))) {
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
foreach(range(0, $documents) as $index) {
foreach (range(0, $documents) as $index) {
$rules['documents.' . $index] = 'file|mimes:png,ai,svg,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
}
elseif($this->input('documents')){
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,svg,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}

View File

@ -26,6 +26,4 @@ class DestroySubscriptionRequest extends Request
{
return auth()->user()->isAdmin();
}
}

View File

@ -26,5 +26,4 @@ class EditSubscriptionRequest extends Request
{
return auth()->user()->isAdmin();
}
}

View File

@ -25,5 +25,4 @@ class EditTokenRequest extends Request
{
return auth()->user()->isAdmin();
}
}

View File

@ -29,10 +29,8 @@ class StoreTokenRequest extends Request
public function rules()
{
return [
'name' => 'required',
];
}
}

View File

@ -14,7 +14,6 @@ namespace App\Http\Requests\Token;
use App\Http\Requests\Request;
use App\Utils\Traits\ChecksEntityStatus;
class UpdateTokenRequest extends Request
{
use ChecksEntityStatus;
@ -29,6 +28,4 @@ class UpdateTokenRequest extends Request
{
return auth()->user()->isAdmin();
}
}

View File

@ -44,9 +44,9 @@ class ValidRefundableRequest implements Rule
public function passes($attribute, $value)
{
if(!array_key_exists('id', $this->input)){
if (!array_key_exists('id', $this->input)) {
$this->error_msg = "Payment `id` required.";
return false;
return false;
}
$payment = Payment::whereId($this->input['id'])->first();

View File

@ -48,9 +48,7 @@ class ValidCreditsPresentRule implements Rule
//todo need to ensure the clients credits are here not random ones!
if (request()->input('credits') && is_array(request()->input('credits'))) {
foreach (request()->input('credits') as $credit) {
$cred = Credit::find($this->decodePrimaryKey($credit['credit_id']));
if (!$cred || $cred->balance == 0) {

View File

@ -43,10 +43,9 @@ class ValidRefundableInvoices implements Rule
public function passes($attribute, $value)
{
if(!array_key_exists('id', $this->input)){
if (!array_key_exists('id', $this->input)) {
$this->error_msg = "Payment `id` required.";
return false;
return false;
}
$payment = Payment::whereId($this->input['id'])->first();
@ -72,7 +71,6 @@ class ValidRefundableInvoices implements Rule
}
foreach ($invoices as $invoice) {
if (! $invoice->isRefundable()) {
$this->error_msg = "Invoice id ".$invoice->hashed_id ." cannot be refunded";
return false;

View File

@ -52,7 +52,7 @@ class CreateUbl implements ShouldQueue
* @return void
*/
public function handle()
public function handle()
{
$invoice = $this->invoice;
$company = $invoice->company;
@ -100,7 +100,7 @@ class CreateUbl implements ShouldQueue
try {
return Generator::invoice($ubl_invoice, $invoice->client->getCurrencyCode());
} catch (\Exception $exception) {
info(print_r($exception,1));
info(print_r($exception, 1));
return false;
}
}
@ -140,7 +140,7 @@ class CreateUbl implements ShouldQueue
->setItem((new Item())
->setName($item->product_key)
->setDescription($item->notes));
//->setSellersItemIdentification("1ABCD"));
//->setSellersItemIdentification("1ABCD"));
$taxtotal = new TaxTotal();
$itemTaxAmount1 = $itemTaxAmount2 = $itemTaxAmount3 = 0;
@ -151,7 +151,7 @@ class CreateUbl implements ShouldQueue
$itemTaxAmount2 = $this->createTaxRate($taxtotal, $taxable, $item->tax_rate2, $item->tax_name2);
}
if($item->tax_name3 || floatval($item->tax_rate3)){
if ($item->tax_name3 || floatval($item->tax_rate3)) {
$itemTaxAmount3 = $this->createTaxRate($taxtotal, $taxable, $item->tax_rate3, $item->tax_name3);
}
@ -267,20 +267,24 @@ class CreateUbl implements ShouldQueue
}
}
if ($this->invoice->custom_surcharge1 && $this->invoice->custom_surcharge_tax1)
if ($this->invoice->custom_surcharge1 && $this->invoice->custom_surcharge_tax1) {
$total += $this->invoice->custom_surcharge1;
}
if ($this->invoice->custom_surcharge2 && $this->invoice->custom_surcharge_tax2)
if ($this->invoice->custom_surcharge2 && $this->invoice->custom_surcharge_tax2) {
$total += $this->invoice->custom_surcharge2;
}
if ($this->invoice->custom_surcharge3 && $this->invoice->custom_surcharge_tax3)
if ($this->invoice->custom_surcharge3 && $this->invoice->custom_surcharge_tax3) {
$total += $this->invoice->custom_surcharge3;
}
if ($this->invoice->custom_surcharge4 && $this->invoice->custom_surcharge_tax4)
if ($this->invoice->custom_surcharge4 && $this->invoice->custom_surcharge_tax4) {
$total += $this->invoice->custom_surcharge4;
}
return $total;
@ -309,10 +313,4 @@ class CreateUbl implements ShouldQueue
return round($taxable * ($rate / 100), 2);
}
}
}
}

View File

@ -32,7 +32,7 @@ class EmailInvoice implements ShouldQueue
/**
*
* EmailInvoice constructor.
* @param BuildEmail $email_builder
* @param InvoiceEmail $email_builder
* @param InvoiceInvitation $quote_invitation
*/
@ -54,6 +54,8 @@ class EmailInvoice implements ShouldQueue
public function handle()
{
MultiDB::setDB($this->company->db);
Mail::to($this->invoice_invitation->contact->email, $this->invoice_invitation->contact->present()->name())
->send(
new TemplateEmail(

View File

@ -84,16 +84,16 @@ class CreateQuotePdf implements ShouldQueue
Storage::makeDirectory($path, 0755);
$quote_number = $this->quote->number;
//$start = microtime(true);
$design_body = $designer->build()->getHtml();
$html = $this->generateEntityHtml($designer, $this->quote, $this->contact);
//$start = microtime(true);
$pdf = $this->makePdf(null, null, $html);
//\Log::error("PDF Build time = ". (microtime(true) - $start));
//\Log::error("PDF Build time = ". (microtime(true) - $start));
$file_path = $path . $quote_number . '.pdf';

View File

@ -72,7 +72,7 @@ class SendRecurring implements ShouldQueue
$this->recurring_invoice->last_sent_date = date('Y-m-d');
if ($this->recurring_invoice->remaining_cycles != 0) {
$this->recurring_invoice->next_send_date = $this->recurring_invoice->nextSendDate();
$this->recurring_invoice->next_send_date = $this->recurring_invoice->nextSendDate()->format('Y-m-d');
} else {
$this->recurring_invoice->setCompleted();
}

View File

@ -0,0 +1,81 @@
<?php
namespace App\Jobs\Util;
use App\Events\Invoice\InvoiceWasEmailed;
use App\Helpers\Email\InvoiceEmail;
use App\Jobs\Invoice\EmailInvoice;
use App\Libraries\MultiDB;
use App\Models\Account;
use App\Models\Invoice;
use App\Utils\ClientPortal\CustomMessage\invitation;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Storage;
class ReminderJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct()
{
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//always make sure you have set the company as this command is being
//run from the console so we have no awareness of the DB.
if (! config('ninja.db.multi_db_enabled')) {
$this->processReminders();
} else {
//multiDB environment, need to
foreach (MultiDB::$dbs as $db) {
MultiDB::setDB($db);
$this->processReminders($db);
}
}
}
private function processReminders($db = null)
{
$invoices = Invoice::where('next_send_date', Carbon::today()->format('Y-m-d'))->get();
$invoices->each(function ($invoice) {
if ($invoice->isPayable()) {
$invoice->invitations->each(function ($invitation) use ($invoice) {
$email_builder = (new InvoiceEmail())->build($invitation);
EmailInvoice::dispatch($email_builder, $invitation, $invoice->company);
info("Firing email for invoice {$invoice->number}");
});
if ($invoice->invitations->count() > 0) {
event(new InvoiceWasEmailed($invoice->invitations->first()));
}
} else {
$invoice->next_send_date = null;
$invoice->save();
}
});
}
}

View File

@ -1,4 +1,4 @@
<?php
<?php
namespace App\Libraries\OAuth\Providers;

View File

@ -1,4 +1,4 @@
<?php
<?php
namespace App\Libraries\OAuth\Providers;

View File

@ -46,7 +46,6 @@ class PaymentNotification implements ShouldQueue
/*User notifications*/
foreach ($payment->company->company_users as $company_user) {
$user = $company_user->user;
$notification = new NewPaymentNotification($payment, $payment->company);
@ -55,7 +54,6 @@ class PaymentNotification implements ShouldQueue
if ($user) {
$user->notify($notification);
}
}
/*Company Notifications*/
@ -66,9 +64,9 @@ class PaymentNotification implements ShouldQueue
/*Google Analytics Track Revenue*/
if (isset($payment->company->google_analytics_key))
if (isset($payment->company->google_analytics_key)) {
$this->trackRevenue($event);
}
}
private function trackRevenue($event)
@ -82,12 +80,11 @@ class PaymentNotification implements ShouldQueue
$client = $payment->client;
$amount = $payment->amount;
if($invoice){
if ($invoice) {
$items = $invoice->line_items;
$item = end($items)->product_key;
$entity_number = $invoice->number;
}
else{
} else {
$item = $payment->number;
$entity_number = $item;
}

View File

@ -54,6 +54,8 @@ class TemplateEmail extends Mailable
->view($template_name, [
'body' => $this->build_email->getBody(),
'footer' => $this->build_email->getFooter(),
'view_link' => $this->build_email->getViewLink(),
'view_text' => $this->build_email->getViewText(),
'title' => $this->build_email->getSubject(),
'settings' => $settings,
'company' => $company

View File

@ -465,7 +465,7 @@ class Client extends BaseModel implements HasLocalePreference
public function document_filepath()
{
return $this->company->company_key . '/documents/';
return $this->company->company_key . '/documents/';
}
public function setCompanyDefaults($data, $entity_name) :array

View File

@ -94,7 +94,7 @@ class Document extends BaseModel
return $this->morphTo();
}
function generateUrl($absolute = false)
public function generateUrl($absolute = false)
{
$url = Storage::disk($this->disk)->url($this->path);
@ -108,6 +108,4 @@ class Document extends BaseModel
return null;
}
}

View File

@ -16,7 +16,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
class Subscription extends BaseModel
{
use SoftDeletes;
use SoftDeletes;
use Filterable;
const EVENT_CREATE_CLIENT = 1;
@ -42,13 +42,13 @@ class Subscription extends BaseModel
const EVENT_APPROVE_QUOTE = 21;
public static $valid_events = [
self::EVENT_CREATE_CLIENT,
self::EVENT_CREATE_PAYMENT,
self::EVENT_CREATE_QUOTE,
self::EVENT_CREATE_INVOICE,
self::EVENT_CREATE_VENDOR,
self::EVENT_CREATE_EXPENSE,
self::EVENT_CREATE_TASK,
self::EVENT_CREATE_CLIENT,
self::EVENT_CREATE_PAYMENT,
self::EVENT_CREATE_QUOTE,
self::EVENT_CREATE_INVOICE,
self::EVENT_CREATE_VENDOR,
self::EVENT_CREATE_EXPENSE,
self::EVENT_CREATE_TASK,
];
protected $fillable = [
@ -64,6 +64,6 @@ class Subscription extends BaseModel
public function company()
{
return $this->belongsTo(Company::class);
return $this->belongsTo(Company::class);
}
}

View File

@ -65,20 +65,23 @@ class BaseNotification extends Notification implements ShouldQueue
{
$mail_message->subject($this->generateEmailEntityHtml($this->entity, $this->subject, $this->contact));
if(strlen($this->settings->reply_to_email) > 1)
if (strlen($this->settings->reply_to_email) > 1) {
$mail_message->replyTo($this->settings->reply_to_email);
}
if(strlen($this->settings->bcc_email) > 1)
if (strlen($this->settings->bcc_email) > 1) {
$mail_message->bcc($this->settings->bcc_email);
}
if($this->settings->pdf_email_attachment)
if ($this->settings->pdf_email_attachment) {
$mail_message->attach(public_path($this->entity->pdf_file_path()));
}
foreach($this->entity->documents as $document){
foreach ($this->entity->documents as $document) {
$mail_message->attach($document->generateUrl(), ['as' => $document->name]);
}
if($this->entity instanceof Invoice && $this->settings->ubl_email_attachment){
if ($this->entity instanceof Invoice && $this->settings->ubl_email_attachment) {
$ubl_string = CreateUbl::dispatchNow($this->entity);
$mail_message->attachData($ubl_string, $this->entity->getFileName('xml'));
}
@ -89,14 +92,14 @@ class BaseNotification extends Notification implements ShouldQueue
public function buildMailMessageData() :array
{
$body = $this->generateEmailEntityHtml($this->entity, $this->body, $this->contact);
$design_style = $this->settings->email_style;
if ($design_style == 'custom') {
$email_style_custom = $this->settings->email_style_custom;
$body = str_replace("$body", $body, $email_style_custom);
//$body = str_replace("$body", $body, $email_style_custom);
$body = strtr($email_style_custom, "$body", $body);
}
$data = [
@ -112,6 +115,5 @@ class BaseNotification extends Notification implements ShouldQueue
];
return $data;
}
}

View File

@ -37,7 +37,7 @@ class SendGenericNotification extends BaseNotification implements ShouldQueue
protected $settings;
public $is_system;
public $is_system;
protected $body;
@ -71,14 +71,12 @@ class SendGenericNotification extends BaseNotification implements ShouldQueue
*/
public function toMail($notifiable)
{
$mail_message = (new MailMessage)
->markdown('email.admin.generic_email', $this->buildMailMessageData());
$mail_message = $this->buildMailMessageSettings($mail_message);
return $mail_message;
}
/**

View File

@ -227,8 +227,9 @@ class BaseRepository
$model->fill($tmp_data);
$model->save();
if(array_key_exists('documents', $data))
if (array_key_exists('documents', $data)) {
$this->saveDocuments($data['documents'], $model);
}
$invitation_factory_class = sprintf("App\\Factory\\%sInvitationFactory", $resource);

View File

@ -74,11 +74,11 @@ class InvoiceRepository extends BaseRepository
* to hitting this method.
*
* ie. invoice can be deleted from a business logic perspective.
*
* @param Invoice $invoice
* @return Invoice $invoice
*
* @param Invoice $invoice
* @return Invoice $invoice
*/
public function delete($invoice)
public function delete($invoice)
{
if ($invoice->is_deleted) {
return;
@ -96,11 +96,9 @@ class InvoiceRepository extends BaseRepository
public function reverse()
{
}
public function cancel()
{
}
}

View File

@ -33,15 +33,16 @@ class HandleCancellation extends AbstractService
private $invoice;
public function __construct(Invoice $invoice)
{
{
$this->invoice = $invoice;
}
public function run()
{
/* Check again!! */
if(!$this->invoice->invoiceCancellable($this->invoice))
if (!$this->invoice->invoiceCancellable($this->invoice)) {
return $this->invoice;
}
$adjustment = $this->invoice->balance*-1;
//set invoice balance to 0
@ -57,6 +58,4 @@ class HandleCancellation extends AbstractService
return $this->invoice;
}
}

View File

@ -33,15 +33,16 @@ class HandleReversal extends AbstractService
private $invoice;
public function __construct(Invoice $invoice)
{
{
$this->invoice = $invoice;
}
public function run()
{
/* Check again!! */
if(!$this->invoice->invoiceReversable($this->invoice))
if (!$this->invoice->invoiceReversable($this->invoice)) {
return $this->invoice;
}
$balance_remaining = $this->invoice->balance;
@ -53,31 +54,28 @@ class HandleReversal extends AbstractService
->wherePaymentableId($this->invoice->id)
->get();
$paymentables->each(function ($paymentable) use($total_paid){
$paymentables->each(function ($paymentable) use ($total_paid) {
$reversable_amount = $paymentable->amount - $paymentable->refunded;
$total_paid -= $reversable_amount;
$paymentable->amount = $paymentable->refunded;
$paymentable->save();
});
/* Generate a credit for the $total_paid amount */
$notes = "Credit for reversal of ".$this->invoice->number;
if($total_paid > 0)
{
if ($total_paid > 0) {
$credit = CreditFactory::create($this->invoice->company_id, $this->invoice->user_id);
$credit->client_id = $this->invoice->client_id;
$item = InvoiceItemFactory::create();
$item->quantity = 1;
$item->cost = (float)$total_paid;
$item->notes = $notes;
$item = InvoiceItemFactory::create();
$item->quantity = 1;
$item->cost = (float)$total_paid;
$item->notes = $notes;
$line_items[] = $item;
$line_items[] = $item;
$credit->line_items = $line_items;
@ -93,7 +91,7 @@ class HandleReversal extends AbstractService
/* Set invoice balance to 0 */
$this->invoice->ledger()->updateInvoiceBalance($balance_remaining*-1, $notes)->save();
$this->invoice->balance= 0;
$this->invoice->balance= 0;
/* Set invoice status to reversed... somehow*/
$this->invoice->service()->setStatus(Invoice::STATUS_REVERSED)->save();
@ -110,7 +108,6 @@ class HandleReversal extends AbstractService
return $this->invoice;
//create a ledger row for this with the resulting Credit ( also include an explanation in the notes section )
}
}

View File

@ -97,9 +97,9 @@ class InvoiceService
public function markSent()
{
$this->invoice = (new MarkSent($this->invoice->client, $this->invoice))->run();
$this->invoice = (new MarkSent($this->invoice->client, $this->invoice))->run();
return $this;
return $this;
}
@ -131,7 +131,6 @@ class InvoiceService
return $this;
}
public function markViewed()
{
$this->invoice->last_viewed = Carbon::now()->format('Y-m-d H:i');

View File

@ -41,7 +41,11 @@ class MarkSent extends AbstractService
event(new InvoiceWasMarkedSent($this->invoice, $this->invoice->company));
$this->invoice->service()->setStatus(Invoice::STATUS_SENT)->applyNumber()->save();
$this->invoice
->service()
->setStatus(Invoice::STATUS_SENT)
->applyNumber()
->save();
$this->client->service()->updateBalance($this->invoice->balance)->save();

View File

@ -85,7 +85,6 @@ class LedgerService
$this->entity->company_ledger()->save($company_ledger);
return $this;
}
private function ledger() :?CompanyLedger

View File

@ -114,7 +114,7 @@ class CompanyTransformer extends EntityTransformer
'created_at' =>(int)$company->created_at,
'slack_webhook_url' => (string)$company->slack_webhook_url,
'google_analytics_url' => (string)$company->google_analytics_key, //@deprecate
'google_analytics_key' => (string)$company->google_analytics_key,
'google_analytics_key' => (string)$company->google_analytics_key,
];
}

View File

@ -13,7 +13,9 @@ namespace App\Transformers;
use App\Models\Credit;
use App\Models\CreditInvitation;
use App\Models\Document;
use App\Transformers\CreditInvitationTransformer;
use App\Transformers\DocumentTransformer;
use App\Utils\Traits\MakesHash;
class CreditTransformer extends EntityTransformer
@ -58,18 +60,13 @@ class CreditTransformer extends EntityTransformer
return $this->includeCollection($credit->expenses, $transformer, ENTITY_EXPENSE);
}
*/
public function includeDocuments(Credit $credit)
{
$transformer = new DocumentTransformer($this->serializer);
return $this->includeCollection($credit->documents, $transformer, Document::class);
}
public function includeDocuments(quote $credit)
{
$transformer = new DocumentTransformer($this->account, $this->serializer);
$credit->documents->each(function ($document) use ($credit) {
$document->setRelation('quote', $credit);
});
return $this->includeCollection($credit->documents, $transformer, ENTITY_DOCUMENT);
}
*/
public function transform(Credit $credit)
{
return [
@ -79,12 +76,13 @@ class CreditTransformer extends EntityTransformer
'amount' => (float) $credit->amount,
'balance' => (float) $credit->balance,
'client_id' => (string) $this->encodePrimaryKey($credit->client_id),
'vendor_id' => (string) $this->encodePrimaryKey($credit->vendor_id),
'status_id' => (string) ($credit->status_id ?: 1),
'design_id' => (string) $this->encodePrimaryKey($credit->design_id),
'invoice_id' => (string) ($credit->invoice_id ?: 1),
'created_at' => (int)$credit->created_at,
'updated_at' => (int)$credit->updated_at,
'archived_at' => (int)$credit->deleted_at,
'created_at' => (int)$credit->created_at,
'is_deleted' => (bool) $credit->is_deleted,
'number' => $credit->number ?: '',
'discount' => (float) $credit->discount,
'po_number' => $credit->po_number ?: '',
@ -95,7 +93,6 @@ class CreditTransformer extends EntityTransformer
'terms' => $credit->terms ?: '',
'public_notes' => $credit->public_notes ?: '',
'private_notes' => $credit->private_notes ?: '',
'is_deleted' => (bool) $credit->is_deleted,
'uses_inclusive_taxes' => (bool) $credit->uses_inclusive_taxes,
'tax_name1' => $credit->tax_name1 ? $credit->tax_name1 : '',
'tax_rate1' => (float) $credit->tax_rate1,
@ -118,10 +115,12 @@ class CreditTransformer extends EntityTransformer
'custom_surcharge2' => (float)$credit->custom_surcharge2,
'custom_surcharge3' => (float)$credit->custom_surcharge3,
'custom_surcharge4' => (float)$credit->custom_surcharge4,
'custom_surcharge_taxes' => (bool) $credit->custom_surcharge_taxes,
'custom_surcharge_tax1' => (bool) $credit->custom_surcharge_tax1,
'custom_surcharge_tax2' => (bool) $credit->custom_surcharge_tax2,
'custom_surcharge_tax3' => (bool) $credit->custom_surcharge_tax3,
'custom_surcharge_tax4' => (bool) $credit->custom_surcharge_tax4,
'line_items' => $credit->line_items ?: (array)[],
'entity_type' => 'credit',
];
}
}

View File

@ -4,7 +4,7 @@ namespace App\Utils\ClientPortal\CustomMessage;
use Illuminate\Support\Facades\Facade;
class ClientPortalFacade extends Facade
class CustomMessageFacade extends Facade
{
protected static function getFacadeAccessor()
{

View File

@ -115,11 +115,16 @@ class TemplateEngine
$labels = $this->makeFakerLabels();
$values = $this->makeFakerValues();
$this->body = str_replace(array_keys($labels), array_values($labels), $this->body);
$this->body = str_replace(array_keys($values), array_values($values), $this->body);
// $this->body = str_replace(array_keys($labels), array_values($labels), $this->body);
// $this->body = str_replace(array_keys($values), array_values($values), $this->body);
// $this->subject = str_replace(array_keys($labels), array_values($labels), $this->subject);
// $this->subject = str_replace(array_keys($values), array_values($values), $this->subject);
$this->subject = str_replace(array_keys($labels), array_values($labels), $this->subject);
$this->subject = str_replace(array_keys($values), array_values($values), $this->subject);
$this->body = strtr($this->body, $labels);
$this->body = strtr($this->body, $values);
$this->subject = strtr($this->subject, $labels);
$this->subject = strtr($this->subject, $values);
$converter = new CommonMarkConverter([
'allow_unsafe_links' => false,
@ -133,11 +138,11 @@ class TemplateEngine
$labels = $this->entity_obj->makeLabels();
$values = $this->entity_obj->makeValues();
$this->body = str_replace(array_keys($labels), array_values($labels), $this->body);
$this->body = str_replace(array_keys($values), array_values($values), $this->body);
$this->body = strtr($this->body, $labels);
$this->body = strtr($this->body, $values);
$this->subject = str_replace(array_keys($labels), array_values($labels), $this->subject);
$this->subject = str_replace(array_keys($values), array_values($values), $this->subject);
$this->subject = strtr($this->subject, $labels);
$this->subject = strtr($this->subject, $values);
$converter = new CommonMarkConverter([
'allow_unsafe_links' => false,

View File

@ -13,33 +13,32 @@ namespace App\Utils\Traits\Invoice;
use App\Models\Invoice;
trait ActionsInvoice
{
public function invoiceDeletable($invoice) :bool
{
if ($invoice->status_id <= Invoice::STATUS_SENT && $invoice->is_deleted == false && $invoice->deleted_at == null) {
return true;
}
if($invoice->status_id <= Invoice::STATUS_SENT && $invoice->is_deleted == false && $invoice->deleted_at == NULL)
return true;
return false;
return false;
}
public function invoiceCancellable($invoice) :bool
{
if (($invoice->status_id == Invoice::STATUS_SENT || $invoice->status_id == Invoice::STATUS_PARTIAL) && $invoice->is_deleted == false && $invoice->deleted_at == null) {
return true;
}
if(($invoice->status_id == Invoice::STATUS_SENT || $invoice->status_id == Invoice::STATUS_PARTIAL) && $invoice->is_deleted == false && $invoice->deleted_at == NULL)
return true;
return false;
return false;
}
public function invoiceReversable($invoice) :bool
{
if (($invoice->status_id == Invoice::STATUS_SENT || $invoice->status_id == Invoice::STATUS_PARTIAL || $invoice->status_id == Invoice::STATUS_PAID) && $invoice->is_deleted == false && $invoice->deleted_at == null) {
return true;
}
if(($invoice->status_id == Invoice::STATUS_SENT || $invoice->status_id == Invoice::STATUS_PARTIAL || $invoice->status_id == Invoice::STATUS_PAID) && $invoice->is_deleted == false && $invoice->deleted_at == NULL)
return true;
return false;
return false;
}
}

View File

@ -82,7 +82,8 @@ trait InvoiceEmailBuilder
$invoice_variables = $this->makeValues($contact);
//process variables
$data = str_replace(array_keys($invoice_variables), array_values($invoice_variables), $template_data);
// $data = str_replace(array_keys($invoice_variables), array_values($invoice_variables), $template_data);
$data = strtr($template_data, $invoice_variables);
//process markdown
if ($is_markdown) {

View File

@ -80,8 +80,13 @@ trait MakesInvoiceHtml
private function parseLabelsAndValues($labels, $values, $section) :string
{
$section = str_replace(array_keys($labels), array_values($labels), $section);
$section = str_replace(array_keys($values), array_values($values), $section);
// $section = str_replace(array_keys($labels), array_values($labels), $section);
// $section = str_replace(array_keys($values), array_values($values), $section);
$section = strtr($section, $labels);
$section = strtr($section, $values);
return $section;
}

View File

@ -106,20 +106,22 @@ trait MakesInvoiceValues
* and the second is the field _type_
*
* We transform the $value depending the $field type
*
*
* @param string $field The full field name
* @param string $value The custom value
* @return array The key value pair
*/
private function makeCustomFieldKeyValuePair($field, $value)
{
if($this->findCustomType($field) == 'date')
if ($this->findCustomType($field) == 'date') {
$value = $this->formatDate($value, $this->client->date_format());
elseif($this->findCustomType($field) == 'switch')
} elseif ($this->findCustomType($field) == 'switch') {
$value = ctrans('texts.'.$value);
}
if(!$value)
if (!$value) {
$value = '';
}
return ['value' => $value, 'field' => $this->makeCustomField($field)];
}
@ -454,8 +456,10 @@ trait MakesInvoiceValues
if (strlen($user_columns) > 1) {
foreach ($items as $key => $item) {
$tmp = str_replace(array_keys($data), array_values($data), $user_columns);
$tmp = str_replace(array_keys($item), array_values($item), $tmp);
// $tmp = str_replace(array_keys($data), array_values($data), $user_columns);
// $tmp = str_replace(array_keys($item), array_values($item), $tmp);
$tmp = strtr($user_columns, $data);
$tmp = strtr($tmp, $item);
$output .= $tmp;
}
@ -469,8 +473,10 @@ trait MakesInvoiceValues
$table_row .= '</tr>';
foreach ($items as $key => $item) {
$tmp = str_replace(array_keys($item), array_values($item), $table_row);
$tmp = str_replace(array_keys($data), array_values($data), $tmp);
// $tmp = str_replace(array_keys($item), array_values($item), $table_row);
// $tmp = str_replace(array_keys($data), array_values($data), $tmp);
$tmp = strtr($table_row, $item);
$tmp = strtr($tmp, $data);
$output .= $tmp;
}
@ -767,7 +773,7 @@ trait MakesInvoiceValues
tfoot {display: table-footer-group;}
button {display: none;}
body {margin: 0;}
}';
}';
$header = '
.header, .header-space {
@ -784,7 +790,7 @@ trait MakesInvoiceValues
thead {display: table-header-group;}
button {display: none;}
body {margin: 0;}
}';
}';
$footer = '
@ -802,15 +808,16 @@ trait MakesInvoiceValues
tfoot {display: table-footer-group;}
button {display: none;}
body {margin: 0;}
}';
}';
$css = '';
if($settings->all_pages_header && $settings->all_pages_footer)
if ($settings->all_pages_header && $settings->all_pages_footer) {
$css .= $header_and_footer;
elseif($settings->all_pages_header && !$settings->all_pages_footer)
} elseif ($settings->all_pages_header && !$settings->all_pages_footer) {
$css .= $header;
elseif(!$settings->all_pages_header && $settings->all_pages_footer)
} elseif (!$settings->all_pages_header && $settings->all_pages_footer) {
$css .= $footer;
}
$css .= '
.page {
@ -830,6 +837,5 @@ html {
$css .= '}';
return $css;
}
}

View File

@ -30,7 +30,7 @@ trait MakesReminders
return; //exit early
}
$nsd = null;
$nsd = null; //abbreviation for next_send_date
if ($settings->enable_reminder1 !== false &&
$settings->schedule_reminder1 == 'after_invoice_date' &&
@ -38,11 +38,11 @@ trait MakesReminders
$reminder_date = Carbon::parse($this->date)->addDays($settings->num_days_reminder1);
if (!$nsd) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
if ($reminder_date->lt($nsd)) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
}
@ -52,11 +52,11 @@ trait MakesReminders
$reminder_date = Carbon::parse($this->due_date)->subDays($settings->num_days_reminder1);
if (!$nsd) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
if ($reminder_date->lt($nsd)) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
}
@ -67,11 +67,11 @@ trait MakesReminders
$reminder_date = Carbon::parse($this->due_date)->addDays($settings->num_days_reminder1);
if (!$nsd) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
if ($reminder_date->lt($nsd)) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
}
@ -81,11 +81,11 @@ trait MakesReminders
$reminder_date = Carbon::parse($this->date)->addDays($settings->num_days_reminder2);
if (!$nsd) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
if ($reminder_date->lt($nsd)) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
}
@ -95,11 +95,11 @@ trait MakesReminders
$reminder_date = Carbon::parse($this->due_date)->subDays($settings->num_days_reminder2);
if (!$nsd) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
if ($reminder_date->lt($nsd)) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
}
@ -110,11 +110,11 @@ trait MakesReminders
$reminder_date = Carbon::parse($this->due_date)->addDays($settings->num_days_reminder2);
if (!$nsd) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
if ($reminder_date->lt($nsd)) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
}
@ -124,11 +124,11 @@ trait MakesReminders
$reminder_date = Carbon::parse($this->date)->addDays($settings->num_days_reminder3);
if (!$nsd) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
if ($reminder_date->lt($nsd)) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
}
@ -138,11 +138,11 @@ trait MakesReminders
$reminder_date = Carbon::parse($this->due_date)->subDays($settings->num_days_reminder3);
if (!$nsd) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
if ($reminder_date->lt($nsd)) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
}
@ -153,11 +153,11 @@ trait MakesReminders
$reminder_date = Carbon::parse($this->due_date)->addDays($settings->num_days_reminder3);
if (!$nsd) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
if ($reminder_date->lt($nsd)) {
$nsd = $reminder_date;
$nsd = $reminder_date->format('Y-m-d');
}
}
@ -178,7 +178,7 @@ trait MakesReminders
return Carbon::parse($this->due_date)->addDays($num_days_reminder)->startOfDay()->eq(Carbon::now()->startOfDay());
break;
default:
# code...
return null;
break;
}
}

View File

@ -222,7 +222,7 @@ trait Refundable
return $credit_note;
}
private function adjustInvoices(array $data)
private function adjustInvoices(array $data)
{
$adjustment_amount = 0;

View File

@ -75,7 +75,9 @@ trait PaymentEmailBuilder
$invoice_variables = $this->makeValues($contact);
//process variables
$data = str_replace(array_keys($invoice_variables), array_values($invoice_variables), $template_data);
//$data = str_replace(array_keys($invoice_variables), array_values($invoice_variables), $template_data);
$data = strtr($template_data, $invoice_variables);
//process markdown
if ($is_markdown) {

View File

@ -81,7 +81,8 @@ trait QuoteEmailBuilder
$quote_variables = $this->makeValues($contact);
//process variables
$data = str_replace(array_keys($quote_variables), array_values($quote_variables), $template_data);
// $data = str_replace(array_keys($quote_variables), array_values($quote_variables), $template_data);
$data = strtr($template_data, $quote_variables);
//process markdown
if ($is_markdown) {

View File

@ -17,33 +17,28 @@ use App\Models\Company;
trait SavesDocuments
{
public function saveDocuments($document_array, $entity)
{
if ($entity instanceof Company) {
$account = $entity->account;
$company = $entity;
} else {
$account = $entity->company->account;
$company = $entity->company;
}
if($entity instanceof Company){
$account = $entity->account;
$company = $entity;
}
else{
$account = $entity->company->account;
$company = $entity->company;
}
if(!$account->hasFeature(Account::FEATURE_DOCUMENTS))
return false;
foreach($document_array as $document) {
$document = UploadFile::dispatchNow(
$document,
UploadFile::DOCUMENT,
$entity->user,
$entity->company,
$entity
);
}
if (!$account->hasFeature(Account::FEATURE_DOCUMENTS)) {
return false;
}
foreach ($document_array as $document) {
$document = UploadFile::dispatchNow(
$document,
UploadFile::DOCUMENT,
$entity->user,
$entity->company,
$entity
);
}
}
}

View File

@ -235,7 +235,7 @@ return [
*/
'Countries' => 'Webpatser\Countries\CountriesFacade',
'CustomMessage' => App\Utils\ClientPortal\CustomMessage\ClientPortalFacade::class,
'CustomMessage' => App\Utils\ClientPortal\CustomMessage\CustomMessageFacade::class,
],
];

View File

@ -11,10 +11,10 @@ $factory->define(App\Models\Company::class, function (Faker $faker) {
'db' => config('database.default'),
'settings' => CompanySettings::defaults(),
'custom_fields' => (object) [
'invoice1' => '1|date',
// 'invoice2' => '2|switch',
// 'invoice3' => '3|',
// 'invoice4' => '4',
'invoice1' => '1|date',
// 'invoice2' => '2|switch',
// 'invoice3' => '3|',
// 'invoice4' => '4',
// 'client1'=>'1',
// 'client2'=>'2',
// 'client3'=>'3|date',

View File

@ -18,7 +18,7 @@ $factory->define(App\Models\Invoice::class, function (Faker $faker) {
//'tax_name3' => 'THIRDTAX',
//'tax_rate3' => 5,
'custom_value1' => $faker->date,
'custom_value2' => rand(0,1) ? 'yes' : 'no',
'custom_value2' => rand(0, 1) ? 'yes' : 'no',
// 'custom_value3' => $faker->numberBetween(1,4),
// 'custom_value4' => $faker->numberBetween(1,4),
'is_deleted' => false,

View File

@ -45,6 +45,5 @@ class AddIsDeletedColumnToCompanyTokensTable extends Migration
*/
public function down()
{
}
}

View File

@ -1,225 +0,0 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " epub3 to make an epub3"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
@echo " dummy to check syntax errors of document sources"
.PHONY: clean
clean:
rm -rf $(BUILDDIR)/*
.PHONY: html
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
.PHONY: dirhtml
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
.PHONY: singlehtml
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
.PHONY: pickle
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
.PHONY: json
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
.PHONY: htmlhelp
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
.PHONY: qthelp
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/InvoiceName.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/InvoiceName.qhc"
.PHONY: applehelp
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
.PHONY: devhelp
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/InvoiceName"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/InvoiceName"
@echo "# devhelp"
.PHONY: epub
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
.PHONY: epub3
epub3:
$(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3
@echo
@echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3."
.PHONY: latex
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
.PHONY: latexpdf
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
.PHONY: latexpdfja
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
.PHONY: text
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
.PHONY: man
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
.PHONY: texinfo
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
.PHONY: info
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
.PHONY: gettext
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
.PHONY: changes
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
.PHONY: linkcheck
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
.PHONY: doctest
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
.PHONY: coverage
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
.PHONY: xml
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
.PHONY: pseudoxml
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
.PHONY: dummy
dummy:
$(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy
@echo
@echo "Build finished. Dummy builder generates no files."

View File

@ -1,134 +0,0 @@
API
===
Invoice Ninja provides a RESTful API, `click here <https://app.invoiceninja.com/api-docs#/>`_ to see the full list of methods available.
To access the API you first need to create a token using the "API Tokens” page under "Advanced Settings”.
.. NOTE:: Replace ninja.test with https://admin.invoiceninja.com to access a hosted account.
Reading Data
""""""""""""
Heres an example of reading the list of clients using cURL from the command line.
.. code-block:: shell
curl -X GET ninja.test/api/v1/clients -H "X-Ninja-Token: TOKEN"
For invoices, quotes, tasks and payments simply change the object type.
.. code-block:: shell
curl -X GET ninja.test/api/v1/invoices -H "X-Ninja-Token: TOKEN"
You can search clients by their email address or id number and invoices by their invoice number.
.. code-block:: shell
curl -X GET ninja.test/api/v1/clients?email=<value> -H "X-Ninja-Token: TOKEN"
curl -X GET ninja.test/api/v1/clients?id_number=<value> -H "X-Ninja-Token: TOKEN"
curl -X GET ninja.test/api/v1/invoices?invoice_number=<value> -H "X-Ninja-Token: TOKEN"
To load a single record specify the Id in the URL.
.. code-block:: shell
curl -X GET ninja.test/api/v1/invoices/1 -H "X-Ninja-Token: TOKEN"
You can specify additional relationships to load using the ``include`` parameter.
.. code-block:: shell
curl -X GET ninja.test/api/v1/clients/1?include=invoices.invitations -H "X-Ninja-Token: TOKEN"
You can download a PDF using the following URL
.. code-block:: shell
curl -X GET ninja.test/api/v1/download/1 -H "X-Ninja-Token: TOKEN"
Optional Settings
"""""""""""""""""
The following are optional query parameter settings:
- ``serializer``: Either array (the default) or `JSON <http://jsonapi.org/>`_.
- ``include``: A comma-separated list of nested relationships to include.
- ``client_id``: If set the results will be filtered by the client.
- ``page``: The page number of results to return when the results are paginated.
- ``per_page``: The number of results to return per page.
- ``updated_at``: Timestamp used as a filter to only show recently updated records.
Creating Data
"""""""""""""
.. TIP:: Add ``-H "X-Requested-With: XMLHttpRequest"`` to see validation errors in the response.
Heres an example of creating a client. Note that email address is a property of the clients contact not the client itself.
.. code-block:: shell
curl -X POST ninja.test/api/v1/clients -H "Content-Type:application/json" \
-d '{"name":"Client","contact":{"email":"test@example.com"}}' \
-H "X-API-TOKEN: TOKEN" \
-H "X-API-SECRET: SECRET"
You can also update a client by specifying a value for id. Next, heres an example of creating an invoice.
.. code-block:: shell
curl -X POST ninja.test/api/v1/invoices -H "Content-Type:application/json" \
-d '{"client_id":"1", "invoice_items":[{"product_key": "ITEM", "notes":"Test", "cost":10, "quantity":1}]}' \
-H "X-Ninja-Token: TOKEN" \
-H "X-API-SECRET: SECRET"
If the email field is set well search for a matching client, if no matches are found a new client will be created.
If the product_key is set and matches an existing record the product fields will be auto-populated. You can use a comma-separated value to create an invoice with multiple products.
Options
^^^^^^^
The following options are available when creating an invoice.
- ``email_invoice``: Email the invoice to the client.
- ``email_type``: Set to reminder1, reminder2 or reminder3 to use the reminder template.
- ``auto_bill``: Attempt to auto-bill the invoice using stored payment methods or credits.
- ``paid``: Create a payment for the defined amount.
Updating Data
"""""""""""""
.. NOTE:: When updating a client it's important to include the contact ids.
.. code-block:: shell
curl -X PUT ninja.test/api/v1/clients/1 -H "Content-Type:application/json" \
-d '{"name":"test", "contacts":[{"id": 1, "first_name": "test"}]}' \
-H "X-Ninja-Token: TOKEN" \
-H "X-API-SECRET: SECRET"
You can archive, delete or restore an entity by setting ``action`` in the request
.. code-block:: shell
curl -X PUT ninja.test/api/v1/invoices/1?action=archive \
-H "X-Ninja-Token: TOKEN" \
-H "X-API-SECRET: SECRET"
.. TIP:: For invoices use `mark_sent` to manually mark the invoice as sent
Emailing Invoices
"""""""""""""""""
To email an invoice use the email_invoice command passing the id of the invoice.
.. code-block:: shell
curl -X POST ninja.test/api/v1/email_invoice -d '{"id":1}' \
-H "Content-Type:application/json" \
-H "X-Ninja-Token: TOKEN" \
-H "X-API-SECRET: SECRET"

View File

@ -1,38 +0,0 @@
API Tokens
==========
Invoice Ninja uses API tokens to enable access to third party providers, so you can streamline many of your invoicing and payments functions with our partners.
Tokens
""""""
The API Tokens page displays a table listing your current API tokens.
To add a new API token, click the blue Add Token + button at the top right of the page. The Tokens/ Create page will open.
Create Token
^^^^^^^^^^^^
Enter the token name in the field and click the green Save button. A new token number will be automatically generated. You will then be redirected to the API Tokens page, where the new token will display in the table next to the relevant Name entry.
If you want to cancel the new entry before saving it, click the gray Cancel button.
Edit Token
^^^^^^^^^^
To edit an existing token, click on the gray Select button in the Action column of the API Tokens table, and a drop down menu will open. Select Edit Token from the menu, and the Tokens/ Edit page will open. You can now edit the token name. Click Save to apply the changes, or Cancel.
Archive Token
^^^^^^^^^^^^^
To archive an existing token, click on the gray Select button in the Action column of the API Tokens table, and a drop down menu will open. Select Archive Token from the menu, and the token will automatically be sent to archives. It will no longer be viewable in the API Tokens table.
Documentation
^^^^^^^^^^^^^
Need some extra help? Click on the gray Documentation button directly above the API Tokens table, and you'll be redirected to https://www.invoiceninja.com/api-documentation/. Here, you can read all about using API documentation in your Invoice Ninja account.
Zapier
""""""
Invoice Ninja proudly partners with https://zapier.com/ to provide seamless app connections for your Invoice Ninja activity. Check out various Zaps that deliver integrated functionality between Invoice Ninja and other apps to help you streamline your accounting. Click on the gray Zapier button, just to the right of the Documentation button, to find out more.

View File

@ -1,84 +0,0 @@
Client Portal
=============
The invoicing process is a two-way street. You bill the client; the client views and pays the invoice. Why not make it as easy as possible for you and for your clients? This is the purpose of Invoice Ninja's Client Portal. With Invoice Ninja, you can choose to provide a portal for your clients where they can open and view your invoices, and even make payments, all via the Invoice Ninja website.
You can modify the Client Portal with a range of settings. To modify the client portal, go to Advanced Settings > Client Portal.
The Client Portal page is divided into three boxes: Settings, Authorization and Buy Now Buttons. Let's go through them one by one.
Settings
""""""""
The Settings box has three sections Link, Navigation and Custom CSS. Click on the tab to open the section you need.
Link
^^^^
- **Domain**: Select your preferred domain name for the client portal and invoice emails.
- **Customize**: Customize the portal URL with a subdomain name or display the invoice on your own website. To add a subdomain, check Subdomain and enter the name in the field. To add your own website, check Website and enter the URL of your website in the field.
- **Preview**: This is a preview display of your portal URL. It will adjust automatically according to the text you enter in the Customize section.
Navigation
^^^^^^^^^^
- **Client Portal**: You can choose whether or not you want to provide a portal for your clients. To show the portal, check Enable. To hide the portal from your clients' view, uncheck Enable.
- **Dashboard**: The Dashboard is a summary page of the client portal that displays all the client's invoicing activity with you. You can choose to show or hide the dashboard. Check the Enable box to show the dashboard. Uncheck to hide the dashboard.
Custom CSS
^^^^^^^^^^
Do you have some experience in web design? Want to put your individual fingerprint on your client portal? You can control the look and feel of your client portal by entering custom CSS in your portal layout. Enter the CSS in the Custom CSS field.
Custom JavaScript
^^^^^^^^^^^^^^^^^
Want to include some custom JavaScript on the client portal, e.g. for a chat client, etc? Enter the JavaScript in the Custom JS field.
.. NOTE:: This feature is only available for self-hosted installations.
Authorization
"""""""""""""
The Authorization box has three sections Password, Checkbox and Signature. Click on the tab to open the section you need.
Password
^^^^^^^^
- **Password protect invoices**: If you're concerned about privacy, you can choose to set a password for clients to access their portal and invoices. To enable password protection, check the Enable box. To set a password for a specific client, go to the Client / Edit page. If you don't want to use passwords for client portals and invoices, uncheck the Enable box.
- **Generate password automatically**: If your client does not already have a password for the portal, you can ensure they get one by enabling the system to automatically generate a password. The password will be sent to the client together with the first invoice. To enable this function, check the box.
Checkbox
^^^^^^^^
Want to streamline communication with your clients? Add a confirmation checkbox to your quotes and invoices so your clients can accept the terms of the quote or invoice directly on the page.
- **Invoice Terms Checkbox**: Check Enable to require clients to confirm they accept your invoice terms.
- **Quote Terms Checkbox**: Check Enable to require clients to confirm they accept your quote terms.
Signature
^^^^^^^^^
You can require clients to accept a quote or invoice by providing a signature.
- **Invoice Signature**: Check Enable to require clients to provide a signature on invoices.
- **Quote Signature**: Check Enable to require clients to provide a signature on quotes.
Custom CSS
""""""""""
Do you have some experience in web design? Want to put your individual fingerprint on your client portal? You can control the look and feel of your client portal by entering custom CSS in your portal layout. Enter the CSS is the Custom CSS field.
Buy Now Buttons
"""""""""""""""
Streamline the purchase payment process by adding a Buy Now button to the client portals. Clients can click the button to pay the invoice instantly online.
To enable support for Buy Now buttons in your client portals, check Enable.
To apply all changes to the Client Portal, click the green Save button at the bottom of the page.

View File

@ -1,216 +0,0 @@
Clients
=======
They come in all shapes and sizes. Theyre the reason you go to work in the morning. There are new ones coming up, and old ones coming back. What you need is a well-maintained, up-to-date, comprehensive client list to keep your invoicing in order.
Your clients are the core of your freelance business, and your Clients page is the core of your activity on Invoice Ninja.
List Clients
""""""""""""
The Clients page is a list page that presents a summary of all your clients in a user-friendly table. Think of your Clients page as the “central station” of your client activity. Most of your day-to-day invoicing actions can be taken from the various links and buttons that appear on the Clients list page. And you can use the Clients list page as your starting point to explore more in-depth client information, edit client information, view current client statements, and more. Now, well take a closer look at the setup of the Clients page, and the range of actions available to you on the Clients page.
To view your client list page, go to the main sidebar and click the Clients tab.
Overview
^^^^^^^^
The Clients page presents a list summary of all your current clients in a table format. The main elements of the table include:
- **Client:** The name of the client
- **Contact:** The name of the primary contact person
- **Email:** The client email address
- **Date Created:** The date the client was created
- **Last Login:** The date the client last logged in to the system
- **Balance:** The clients payment balance
- **Action:** A range of actions you can take to manage activity relating to the selected client
Actions
^^^^^^^
To select an action for a particular client, hover with your mouse anywhere in the row entry of the client. A gray Select button will appear. Click on the Select arrow and a drop-down list will open.
When you click on an action, you will be automatically redirected to the relevant action page for the selected client. Here are the available actions in the drop-down list of the Action button, and the corresponding action pages that will open:
- **Edit Client** Edit the clients details on the Clients / Edit page
- **New Task** Enter a new task on the Tasks / Create page
- **New Invoice** Enter a new invoice on the Invoices / Create page
- **New Quote** Enter a new quote on the Quotes / Create page
- **Enter Payment** Enter a new payment on the Payments / Create page
- **Enter Credit** Enter a new credit on the Credits / Create page
- **Enter Expense** Enter a new expense on the Expenses / Create page
- **Archive Client** Click to archive the client
- **Delete Client** Click to delete the client
Sorting & Filtering Clients
The sort and filter functions make it easy for you to manage and view your client information.
Sort the clients table via any of the following data columns: Client, Contact, Email, Date Created, Last Login, or Balance. To sort, click on the tab of your choice. A small arrow will appear. If the arrow is pointing up, data is sorted from lowest to highest value. If the arrow is pointing down, data is sorted from highest to lowest value. Click to change the arrow direction. (If you click on the Client, Contact or Email arrow, the data will be displayed in alphabetical or reverse alphabetical order.)
Filter the clients list by completing the Filter field, situated at the top right of the page, to the left of the gray Credits button. Clients can be filtered according to the client name, contact person name, or elements of the client name or contact person name. Heres an example: Lets filter the table for a client named “Joe Smith” of “Best Ninja” company. You can type “best ninja”, or “best” or “ninja”, or even “bes”, or “nin”, or “ja”, or “Joe”, “Smith”, “Jo” “oe”, “th” or any other grouping of letters in the client name or contact person name. The filter function will automatically locate and present all the relevant entries. This function makes it easy to find clients with even minimal input of information.
.. Tip: Need to search for a specific client in your Clients list? Start typing the first letters of the client's name and the filter will automatically present the relevant listings.
Archiving/Deleting
^^^^^^^^^^^^^^^^^^
To archive or delete a specific client, hover over the client entry row, and open the Action drop-down list. Select Archive client or Delete client from the list. The Clients table will automatically refresh.
- **Deleted clients** are displayed with a strike through and a red Deleted label in the Action column.
- **Archived clients** are displayed with an orange Archived label in the Action column.
Note: You can also archive or delete one or more clients via the gray Archive button that appears at the top left side of the Clients table. To archive or delete clients, check the relevant clients in the check boxes that appear in the far left column next to the client name. Then click on the Archive button, open the drop-down list and select the desired action.
Want to view archived or deleted clients?
Click on the tag field located on the left top side of the screen, to the right of the gray Archive button. When you click on the field, a drop down menu will open, displaying all the filter tags: Active, Archived and Deleted. Select the tags you want, and the table will update automatically to display the filtered client list.
You can choose to restore or delete the archived client. To restore an archived client, hover with your mouse over the Action area for the relevant archived client. A gray Select button will appear. Click on the Select arrow, and choose Restore client from the drop-down list. To delete an archived client, select Delete client from the drop-down list of the Select button.
To restore a deleted client, hover with your mouse over the Action area for the relevant deleted client. A gray Select button will appear. Click on the Select arrow, and choose Restore client from the drop-down list.
Create Client
"""""""""""""
So, youve taken on a new client? Congratulations!
Your Clients list is at the heart of your invoicing activity, so it's really important to maintain current information on all your clients. When you start working with a new client, the first thing youll need to do is to add the new client by entering their contact information and business details.
When creating and saving a new client to your Clients list, make sure to have the relevant, up-to-date information at hand. You are only required to enter the information one time. Invoice Ninja automatically tracks all invoicing activity for each client.
**Lets Begin**
To enter a new client, go to the Clients tab on the main sidebar, and click the + sign on the tab. This will open the Create Client page. Or, you can go to the Clients list page and click the blue New Client button at the top right side of the page.
The Create Client page is divided into four sections. Enter the information in the relevant fields.
.. Note: You dont have to complete every field. Enter the information that is important or necessary for your needs.
Lets take a closer look at each section:
- **Organization**: Enter details about your clients business/company/organization, including the company name, ID number, VAT number, website address and telephone number.
- **Contacts**: Enter the name, email address and phone number of your contact person for this client. You can enter as many contact people as you like. To add more contact people, click +Add Contact.
- **Address**: Enter the street address of your client. This will be of particular importance if you need to send hard-copy invoices or payment receipts.
- **Additional Info**: Enter the payment currency, language, payment terms, company size (no. of employees), the relevant industry sector, public notes (these will appear on the invoice by default) and private notes (dont worry - no one can see them but you.)
TIP: Understanding the Payment terms field You may have different payment terms and agreements for various clients. Here, you can select the default due date for the specific client via the drop-down menu of the Payment terms field. The default due date is calculated according to the date on the invoice. For example, Net 0 means the payment is due on the date of the invoice; Net 7 means the payment is due 7 days after the date of the invoice, and so on. Note: Even if you choose default payment terms, you can always manually adjust an invoice payment due date for a specific invoice, via the Edit Invoice page.
Once you have filled in the page, click Save to save the new client information. From now on, when you click the Client field, the clients name will appear in the drop down menu. Simply select the client you need and let the invoicing begin!
Client Overview Page
""""""""""""""""""""
Each client has its own Client Overview page. The overview page provides a complete summary of all your client details and activity in one page. From here, you can access everything you need about the specific client, including the client's general contact information, total standing payments and balance, and a detailed list of the client Activity, Invoices, Payments and Credits. You can also Edit, Archive or Delete the client, view the Client Statement and view the Client Portal, all directly from the Client Overview page. Let's explore:
How to view the Client Overview page
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
To view the Client Overview page of a specific client, click on the client name in the Clients list page.
Understanding the Client Overview page
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The top section of the Client Overview page displays general business and contact information that you entered when creating the client, including contact name, street address, payment terms, email address, as well as standing payment and balance data. You can also view the client portal from here, by clicking on the View client portal link that appears below the client's email address.
.. TIP:: If you entered the client's street address, a Google map appears below the information box displaying the client's location.
Client Data Table
^^^^^^^^^^^^^^^^^
Just below the client information box or Google map, you'll find the client's data table. The table displays a summary of your client's activity, invoices, payments and credits, in a simple accessible table format. It provides a fast summary of the data for the specific client only.
To access the various data tables, choose from the menu bar: Activity, Invoices, Payments or Credits.
Activity Table
**************
The Activity table shows all the past activity with the client, in chronological order, with the most recent actions at the top. The table has 4 columns:
- **Date**: The date the action was taken
- **Message**: The action that occurred
- **Balance**: The client's current balance
- **Adjustment**: The adjusted amount
Invoices Table
**************
The Invoices table shows a list of all the client's invoices and accompanying information. The table has 5 columns:
- **Invoice**: The invoice number
- **Date**: The date the invoice was created
- **Amount**: The invoice amount
- **Balance**: The invoice balance
- **Due Date**: The date the payment is due
- **Status**: The status of the invoice (Draft, Sent, Viewed, Paid, Overdue)
.. TIP:: You can also create a new invoice for this client via the blue New Invoice button that appears at the top right of the Invoices table.
Payments Table
**************
The Payments table shows a list of all the client's payments and accompanying information. The table has 7 columns:
- **Invoice**: The invoice number
- **Transaction reference**: The reference number of the transaction
- **Method**: The payment method (ie. Paypal, manual entry, Amex, etc)
- **Source**: The source of the payment
- **Amount**: The payment amount
- **Date**: The date the payment was made
- **Status**: The status of the payment (ie. Pending, Completed, etc)
.. TIP:: You can also enter a payment for this client via the blue Enter Payment button that appears at the top right of the Payments table.
Credits Table
*************
The Credits table shows a list of all the client's credits and accompanying information. The table has 5 columns:
- **Amount**: The credit amount
- **Balance**: The current balance
- **Credit Date**: The date the credit was issued
- **Public Notes**: Comments entered by you (these will appear on the invoice)
- **Private Notes**: Notes added by you (for your eyes only; the client cannot see these notes)
.. TIP:: You can also enter a credit for this client via the blue Enter Credit button that appears at the top right of the Credits table.
Clickable Links on the Client Overview Page
*******************************************
The Client Overview page is rich in clickable links to the client's invoices, payments, credits and any other data pages relating to the client. So you can quickly look up any information with a simple click of an IP link. Take for example the Activity table: if you recently updated the client's invoice, an entry will appear on the Activity table, with a Message of: "You Updated Invoice 53". "Invoice 53" will appear as a clickable link that takes you directly to the invoice. So you have fast access to every relevant invoice, quote, task, expense and more, directly from every listing on the Activity table. This also applies to the Invoices, Payments and Credit tables. TIP: Any invoicing action you need to take for the client can be done from the Client Overview page.
Note: All the tables on the Client Overview page have Sort and Filter functions. You can filter by entering text into the filter field that appears above and to the right of the table. Also, each column can be sorted highest to lowest, or lowest to highest. Simply click on the small arrow that appears when you hover in the column heading field.
Client Statement
^^^^^^^^^^^^^^^^
The client statement is a downloadable PDF document that provides a full and current statement of your client's balance.
**View Statement**: To view the client statement, click the blue View Statement button that appears at the top right side of the Client Overview page. This will automatically generate the PDF statement.
**Download Statement**: To download the PDF statement, click on the gray Download PDF button at the top right of the statement screen.
**Return to Client Overview**: To return to the client overview page, click the blue View Client button at the top right of the statement screen.
Actions on the View Statement Button
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You can do all invoicing actions for the specific client with a click of the mouse, directly from the Client Overview page. Simply click on the arrow at the right hand side of the View Statement button. A drop-down menu will open, giving you quick access to all the actions: New Invoice, New Task, New Quote, New Recurring Invoice, Enter Payment, Enter Credit, Enter Expense.
How to Edit Client Information
******************************
The information you enter on the Create Client page acts as your default settings for this client. You can change these settings at any time. How? By clicking on the gray Edit Client button on the Client Overview page.
Edit Client
***********
Click on the gray Edit Client button, at the top right corner of the page. You will now be taken to the Clients/Edit page, where you can edit any of the fields.
Archiving or Deleting the Client
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You can also archive or delete the specific client directly from their Client Overview page.
Click on the arrow at the right hand side of the Edit Client button. A drop-down menu will open, giving you the option to Archive Client or Delete Client.

View File

@ -1,338 +0,0 @@
# -*- coding: utf-8 -*-
#
# Invoice Ninja documentation build configuration file, created by
# sphinx-quickstart on Fri Aug 19 12:02:54 2016.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = []
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The encoding of source files.
#
# source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'Invoice Ninja'
copyright = u'2017, Invoice Ninja'
author = u'Invoice Ninja'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = u'4.5'
# The full version, including alpha/beta/rc tags.
release = u'4.5.9'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#
# today = ''
#
# Else, today_fmt is used as the format for a strftime call.
#
# today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# The reST default role (used for this markup: `text`) to use for all
# documents.
#
# default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#
# add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#
# add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#
# show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
# keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
# html_theme_path = []
# The name for this set of Sphinx documents.
# "<project> v<release> documentation" by default.
#
# html_title = u'Invoice Ninja v2.6.10'
# A shorter title for the navigation bar. Default is the same as html_title.
#
# html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#
# html_logo = None
# The name of an image file (relative to this directory) to use as a favicon of
# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#
# html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#
# html_extra_path = []
# If not None, a 'Last updated on:' timestamp is inserted at every page
# bottom, using the given strftime format.
# The empty string is equivalent to '%b %d, %Y'.
#
# html_last_updated_fmt = None
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#
# html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#
# html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#
# html_additional_pages = {}
# If false, no module index is generated.
#
# html_domain_indices = True
# If false, no index is generated.
#
# html_use_index = True
# If true, the index is split into individual pages for each letter.
#
# html_split_index = False
# If true, links to the reST sources are added to the pages.
#
# html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#
# html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#
# html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#
# html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh'
#
# html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# 'ja' uses this config value.
# 'zh' user can custom change `jieba` dictionary path.
#
# html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#
# html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'InvoiceNamedoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'InvoiceName.tex', u'Invoice Ninja Documentation',
u'Hillel Coren', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#
# latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#
# latex_use_parts = False
# If true, show page references after internal links.
#
# latex_show_pagerefs = False
# If true, show URL addresses after external links.
#
# latex_show_urls = False
# Documents to append as an appendix to all manuals.
#
# latex_appendices = []
# It false, will not define \strong, \code, itleref, \crossref ... but only
# \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added
# packages.
#
# latex_keep_old_macro_names = True
# If false, no module index is generated.
#
# latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'invoicename', u'Invoice Ninja Documentation',
[author], 1)
]
# If true, show URL addresses after external links.
#
# man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'InvoiceName', u'Invoice Ninja Documentation',
author, 'InvoiceName', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#
# texinfo_appendices = []
# If false, no module index is generated.
#
# texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#
# texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#
# texinfo_no_detailmenu = False

View File

@ -1,150 +0,0 @@
Configure
=========
Review the `.env.example <https://github.com/invoiceninja/invoiceninja/blob/master/.env.example>`_ file to see additional settings.
Recurring invoices and reminder emails
""""""""""""""""""""""""""""""""""""""
Create a cron to call the ``ninja:send-invoices`` and ``ninja:send-reminders`` commands **once daily**.
.. code-block:: shell
0 8 * * * /usr/local/bin/php /path/to/ninja/artisan ninja:send-invoices
0 8 * * * /usr/local/bin/php /path/to/ninja/artisan ninja:send-reminders
If you server doesn't support crons commands can be run by setting a value for COMMAND_SECRET in the .env file and then loading ``/run_command?command=<command>&secret=<secret>``. The following commands are supported: send-invoices, send-reminders and update-key.
Email Queues
""""""""""""
When sending an email in the app the default behavior is to wait for the response, you can use queues to improve the perceived performance. To enable the feature add ``QUEUE_DRIVER=database`` or ``QUEUE_DRIVER=redis`` to the .env file.
.. Note:: You can process the jobs by running ``php artisan queue:listen`` or ``php artisan queue:work --daemon``.
Postmark bounce and open notifications
""""""""""""""""""""""""""""""""""""""
Include the following two setting in the .env file, the rest of the email settings can be commented out.
.. code-block:: shell
POSTMARK_API_TOKEN=
MAIL_FROM_ADDRESS=
In your Postmark account settings make sure Open tracking is enabled and enter the following values under Settings > Outbound.
- Bounce webhook: https://invoices.example.com/hook/email_bounced
- Open webhook: https://invoices.example.com/hook/email_opened
Social/One-Click Login
""""""""""""""""""""""
Create an application in either Google, Facebook, GitHub or LinkedIn and then set the client id, secret and redirect URL in the .env file. For example:
.. code-block:: shell
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_OAUTH_REDIRECT=http://ninja.test/auth/google
PhantomJS
"""""""""
There are two methods to attach PDFs to emails sent by background processes: phantomjscloud.com or local PhantomJS install.
To use phantomjscloud.com check for the following line in the .env file.
.. code-block:: shell
PHANTOMJS_CLOUD_KEY='a-demo-key-with-low-quota-per-ip-address'
To use a local PhantomJS install add ``PHANTOMJS_BIN_PATH=/usr/local/bin/phantomjs``.
Troubleshooting
---------------
- Check storage/logs/laravel-error.log for relevant errors.
- To determine the path you can run ``which phantomjs`` from the command line.
- We suggest using PhantomJS version >= 2.1.1, users have reported seeing 'Error: 0' with older versions.
- You can use `this script <https://raw.githubusercontent.com/invoiceninja/invoiceninja/develop/resources/test.pjs>`_ to test from the command line, change ``__YOUR_LINK_HERE__`` to the link in the error and then run ``phantomjs test.pjs``.
- It may help to test with HTTP to check the problem isn't related to the SSL certificate.
- You may need to add an entry in the /etc/hosts file to resolve the domain name.
- If you require contacts to enter a password to see their invoice you'll need to set a random value for ``PHANTOMJS_SECRET``.
- If you're using a proxy and/or self-signed certificate `this comment <https://github.com/invoiceninja/dockerfiles/issues/39#issuecomment-282489039>`_ may help.
- If you're using a custom design try using a standard one, if the PDF is outside the printable area it can fail.
- If you're using a non-English language try changing to English.
Custom Fonts
""""""""""""
Follow these steps to add custom ttf fonts: ie, `Google fonts <https://www.google.com/get/noto/>`_
- Create a new folder in ``public/fonts/invoice-fonts/`` and copy over the ttf files
- Run ``grunt dump_dir``
- Add the font to ``database/seeds/FontsSeeder.php``
- Run ``php artisan db:seed --class=FontsSeeder``
- Clear the cache by adding ``?clear_cache=true`` to the end of the URL
Omnipay
"""""""
We use `Omnipay <https://github.com/thephpleague/omnipay#payment-gateways>`_ to support our payment gateway integrations.
Follow these steps to add a custom driver.
- Run ``composer require <package_name>``
- Add a row to the gateways table. ``name`` is used in the gateway select, ``provider`` needs to match the Omnipay driver name
- Clear the cache by adding ``?clear_cache=true`` to the end of the URL
.. NOTE:: Most drivers also require `code changes <https://github.com/invoiceninja/invoiceninja/tree/master/app/Ninja/PaymentDrivers>`_ to work correctly.
Security
""""""""
To require a password to update the app add ``UPDATE_SECRET=random_value`` to the .env file and then use /update?secret=random_value to update.
By default the app clears the session when the browser is closed and automatically logs the user out after 8 hours. This can be modified by setting ``REMEMBER_ME_ENABLED`` and ``AUTO_LOGOUT_SECONDS`` in the .env file.
To include a secret when notifying subscriptions add ``SUBSCRIPTION_SECRET=random_value`` to the .env file.
Google Map
""""""""""
You need to create a `Google Maps API <https://developers.google.com/maps/documentation/javascript/get-api-key>`_ key for the Javascript, Geocoding and Embed APIs and then add ``GOOGLE_MAPS_API_KEY=your_key`` to the .env file.
You can disable the feature by adding ``GOOGLE_MAPS_ENABLED=false`` to the .env file.
Voice Commands
""""""""""""""
Supporting voice commands requires creating a `LUIS.ai subscription key <https://docs.microsoft.com/en-us/azure/cognitive-services/luis/azureibizasubscription>`_, then set the following values in the .env file.
.. code-block:: shell
SPEECH_ENABLED=true
MSBOT_LUIS_SUBSCRIPTION_KEY=...
Lock Invoices
"""""""""""""
Adding ``LOCK_SENT_INVOICES=true`` to the .env file will prevent changing an invoice once it has been sent.
Using a (Reverse) Proxy
"""""""""""""
If you need to set a list of trusted (reverse) proxies you can add a TRUSTED_PROXIES value in the .env file. ie,
.. code-block:: shell
TRUSTED_PROXIES='10.0.0.0/8,172.16.0.0/12,192.168.0.0/16'
Customizations
""""""""""""""
Our `developer guide <https://www.invoiceninja.com/knowledgebase/developer-guide/>`_ has more details about our applications codebase.
You can add currencies and date/time formats by adding records to their respective tables in the database. This data is cached, to clear it load any page with ``?clear_cache=true`` added to the end of the URL.
The JavaScript and CSS files are compiled to built files, you can recompile them by running bower install and then ``gulp``.

View File

@ -1,84 +0,0 @@
Credits
=======
List Credits
""""""""""""
Your workload and fee structure vary from client to client. Whats more, your work schedule may change from one month to the next, or even from week to week and often for the same client.
At times, payments can get really tricky. Perhaps youve been paid in advance for work that has been delayed, or maybe the scope of work changed and you were overpaid. Whatever the reason, there will come a time when you will need to issue a credit to your clients account. This is where the Credits function comes in handy.
Overview
^^^^^^^^
The Credits list page is a summary of all credits issued to all clients.
To open the Credits page, click on the Clients tab, open the drop-down menu, and click on Credits.
On the Credits page, credit information is presented in a simple, user-friendly table. Lets take a closer look at the table elements:
- **Client**: The clients name
- **Credit**: Amount The amount of the individual credit
- **Credit Balance**: The balance of the individual credit
- **Date of Issue**: The date the individual credit was issued
- **Private Notes**: Comments or reminders that you included FYI
- **Action**: Option to archive or delete the credit
Archiving/Deleting
^^^^^^^^^^^^^^^^^^
To archive or delete a credit, hover over the credit entry row, and open the Action drop-down list. Select Archive credit or Delete credit from the list. The Credits table will automatically refresh, and archived or deleted credits will no longer appear in the list.
You can also archive or delete one or more credit via the gray Archive button that appears at the top left side of the Credits list page. To archive or delete credits, check the relevant credits in the check boxes that appear in the far left column next to the client field. The number of credits selected for archiving/deleting will automatically update and show on the Archive button. Then click on the Archive button, open the drop-down list and select the desired action.
Want to view archived or deleted credits? Check the box marked Show archived/deleted credits, situated to the right of the Archive button. The table will automatically refresh, and will now feature the full list of credits, including current, archived and deleted credits. The status of the archived or deleted credits will appear in the column at the far right of the table.
- Deleted credits are displayed with a red Deleted button. To restore deleted credits, hover on the red Deleted button. A gray Select button will appear. Click on the Select arrow, and select Restore credit in the drop-down list.
- Archived credits are displayed with an orange Archived button. To restore or delete the archived credit, hover on the orange Archived button. A gray Select button will appear. Click on the Select arrow, and choose Restore credit from the drop-down list. To delete an archived credit, select Delete credit from the drop-down list of the Select button.
Sorting & Filtering
^^^^^^^^^^^^^^^^^^^
The sort and filter functions make it easy for you to manage and analyze your credits.
- Sort the credits table via any of the following data columns: Client, Credit Amount, Credit Balance, Credit Date and Private Notes. To sort, click on the tab of your choice. A small arrow will appear. If the arrow is pointing up, data is sorted from lowest to highest value. If the arrow is pointing down, data is sorted from highest to lowest value. Click to change the arrow direction. (If you click on the Client or Private Notes arrow, the data will be displayed in alphabetical or /reverse alphabetical order.)
- Filter the credits table by completing the Filter field, situated on the top right of the page, to the left of the blue Enter Credit button. Credits can be filtered according to the client name, or elements of the client name. Heres an example: Lets filter the table for credits issued to “Best Ninja”. You can type “best ninja”, or “best” or “ninja”, or even “bes”, or “nin”, or “ja”, or any other grouping of letters in the client name. The filter function will automatically locate and present all the relevant entries. This function makes it easy to find credit entries with even minimal input of information.
.. TIP:: Need to search for a specific client in your Credits list? Start typing the first letters of the client's name and the filter will automatically present the relevant listings.
Enter Credit
""""""""""""
Creating a new credit is fast and simple. Remember, all credits you create will appear in the Credits list page.
**Lets Begin**
To issue a credit, youll need to open the Credits / Create page.
There are three ways to open this page:
1. Go to the Clients tab, open the drop-down menu, and click on Enter Credit. This will open the Credits / Create page. TIP: This is the quickest way to reach the Enter Credit page.
2. Go to the Clients tab, open the drop-down menu, and click on Credits. This will open the Credits list page, which displays a summary of all your clients credits. To issue a new credit, click the blue Enter Credit + button in the upper right corner, above the orange bar.
3. Go to the Client's summary page. Locate the blue New Invoice button at the top right of the page. Click on the arrow at the right side of the button. A drop-down list will open. Select Enter Credit. This will open the Credits / Create page. TIP: This method will automatically pre-select the client's name in the Client field of the Enter Credit page.
Ok, so youve successfully landed on the Credits / Create page.
Overview
^^^^^^^^
The Credits / Create page has four fields for you to complete. Lets take a closer look at each field:
- **Client**: Click on the arrow at the right end of the Client field. Select the relevant client from the client list.
- **Amount**: Enter the credit amount. The currency is determined by the currency setting for the specific client.
- **Credit Date**: Select the appropriate date of issue for the credit. It may be todays date or any other date.
- **Private Notes**: [Optional] Enter any private comments or reminders (dont worry - no one can see them but you.)
Saving the Credit
^^^^^^^^^^^^^^^^^
To save your new credit, click Save.
Youve now completed the process of issuing a credit to your clients account.
When you click Save, youll be automatically redirected to the clients summary page. The credit balance will appear in the Standing column, under Credit.
If you wish to view the clients credit details in full, click on the gray Credits tab at the right side of the clients summary page. This will open a table displaying information about all credits issued to the client, including amount, balance, date of issue and private notes.

View File

@ -1,146 +0,0 @@
Custom Modules
==============
Invoice Ninja support customs modules using https://github.com/nWidart/laravel-modules
You can watch this `short video <https://www.youtube.com/watch?v=8jJ-PYuq85k>`_ for a quick overview of the feature.
Install Module
""""""""""""""
To install a module run:
.. code-block:: php
php artisan module:install <vendor/module> --type=github
For example:
.. code-block:: php
php artisan module:install invoiceninja/sprockets --type=github
.. TIP:: One a module is installed it can enabled/disabled on Settings > Account Management
Create Module
"""""""""""""
Run the following command to create a CRUD module:
.. code-block:: php
php artisan ninja:make-module <module> <fields>
For example:
.. code-block:: php
php artisan ninja:make-module Inventory 'name:string,description:text'
To run the database migration use:
.. code-block:: php
php artisan module:migrate <module>
.. Tip:: You can specify the module icon by setting a value from http://fontawesome.io/icons/ for "icon" in module.json.
There are two types of modules: you can either create a standard module which displays a list of a new entity type or you can create a blank module which adds functionality. For example, a custom integration with a third-party app. If you do not want an entry in the application navigation sidebar, add "no-sidebar": 1 to the custom module's module.json.
If you're looking for a module to work on you can see suggested issues `listed here <https://github.com/invoiceninja/invoiceninja/issues?q=is%3Aissue+is%3Aopen+label%3A%22custom+module%22>`_.
.. NOTE:: Our module implemention is currenty being actively worked on, you can join the discussion on our Slack group: http://slack.invoiceninja.com/
Extending Core Views
""""""""""""""""""""
You can extend base views in various ways. Currently, you can:
- dynamically include views on main entity pages by defining a view in the proper namespace and also defining the relation(s) needed on the core entity.
For example, to add fields to the Product model, you define a view in your module at Resources/views/products/edit.blade.php that displays the fields. You then create a new configuration file under Config/ called relations.php with content such as:
.. code-block:: php
<?php
return [
'product' => [
'MyProductExtras' => function ($self) {
return $self->hasOne('Modules\MyProductExtras\Models\MyProductExtras');
}
],
];
The inverse relationship is defined locally in the module entity, e.g. MyProductExtras in the above example.
Settings
""""""""
If your module has settings, you can have them automatically added to the main settings page. To do so, you need to:
- create a Blade template named 'settings.blade.php' under the /Resources folder;
- add whatever routes are needed to implement/save your settings.
.. Tip:: You can run the Artisan command ``ninja:make-module-settings`` to generate a stub settings template, and optionally add routes to your module routes.php.
Components
""""""""""
There are UI widgets that can be re-used as part of a custom module implementation.
To render the widget, use the fully-qualified class name anywhere above the @stack declaration:
.. code-block:: php
@render('App\Http\ViewComponents\ComponentName', [$variables])
Depending on the widget, certain variables will need to be passed via the second parameter of the @render statement.
.. NOTE:: Any data required by the widget must be passed in @render statement. This means the module developer must ensure to perform any data access in the controller and pass it into the enclosing view.
Currently, the following widgets exist:
**SimpleSelectComponent** ``App\Http\ViewComponents\SimpleSelectComponent``
*Displays a select box for an entity*
================== ===========================================================
Parameter Parameter Details
================== ===========================================================
entityType * entity type
items * list of entities
itemLabel * attribute of item to use as primary field value
fieldLabel * label for the field
secondaryItemLabel * attribute of item to display in conjunction with itemLabel;
* can be a reference to a JavaScript function;
* field name must begin with 'entity', e.g. 'entity.notes';
* defaults to null
module * name of module, if applicable;
* used to perform translation for localization;
* defaults to null
selectId * ID of the input;
* defaults to fieldLabel appended with '_id'
================== ===========================================================
Share Module
""""""""""""
To share your module create a new project on GitHub and then run the following code:
.. code-block:: php
cd Modules/<module>
git init
git add .
git commit -m "Initial commit"
git remote add origin git@github.com:<vendor/module>.git
git push -f origin master
.. Tip:: Add ``"type": "invoiceninja-module"`` to the composer.json file to help people find your module.
Finally, submit the project to https://packagist.org.

View File

@ -1,10 +0,0 @@
Data Visualizations
===================
Who says analyzing your invoicing data can't be fun? Data Visualizations is an interactive, intuitive and practical feature that helps you understand exactly what is going on with your invoicing numbers. The visualization function takes your data, according to the data group you select, and creates a visual pattern that demonstrates your income proportions according to various parameters. What's more, it's not just a graphical display; it also links to the various data in the illustration, making it easy for you to dig deeper into your numbers, simply by hovering your mouse.
- **Group by**: To generate a Data Visualization, select the required data group (Clients, Invoices, Products). The visualization will be automatically generated below.
To view particular data, hover your mouse over the circles within the illustration. Text boxes will automatically appear displaying information about the data grouping.
.. TIP:: For the Invoices and Clients data visualizations, each display box includes a View link at the top right. To view the specific client or invoice, click on the View link. The Edit Invoice or View Client page will open in another window.

View File

@ -1,74 +0,0 @@
Developer Guide
===============
This guide will provide an overview of Invoice Ninja. If anythings unclear please send us an email, were always working to improve it.
The application is written in PHP using the `Laravel <http://laravel.com/>`_ framework, the full list of libraries can be found on our `GitHub <https://github.com/invoiceninja/invoiceninja>`_ page.
If youre running the app for your own use you can white label the client portal and emails by purchasing an annual white label license from within the application. If youd like to white label the admin pages to re-sell the application please send us an email to learn about our `affiliate program <https://github.com/invoiceninja/invoiceninja#affiliates-programs>`_.
We try to follow the `PSR-2 <http://www.php-fig.org/psr/psr-2/>`_ style guidelines and are using the `Git-Flow <http://nvie.com/posts/a-successful-git-branching-model/>`_ model of branching and releasing, please create pull requests against the develop branch.
Code
""""
When setting up the app you can choose to either use the self hosted zip or checkout the code from GitHub. The zip includes all third party libraries, whereas checking out the code from GitHub requires using Composer.
We use Gulp to concatenate the JavasScript and CSS files. You can download the source files with Bower. After making any changes you need to run ``gulp`` to re-generate the built files.
Most of the system tables are cached (ie, currencies, languages, etc). If you make any changes you need to run ``php artisan db:seed --class=UpdateSeeder`` and then load any page with ?clear_cache=true added at the end of the URL.
Custom Localization
"""""""""""""""""""
Invoice Ninja has many translations built-in. Many of them are contributed by users via `Transifex <https://www.transifex.com/invoice-ninja/invoice-ninja/>`_. But not every translation can be sent upstream.
It is possible to selectively override text strings as required. Any text that is not overridden is taken from the default locale file.
By default the locale override folder ``storage/lang`` does not exist. You have to create it when you want to use this feature. The layout of this folder is the same as the main translation folder, which is located at ``resources/lang``.
**Example**
To override the string *Organization* from the English translation you need to override the locale file ``texts.php``.
Create both ``lang`` and ``lang/en`` folders inside of your installations storage folder, then create the file ``texts.php`` in that last folder with the following contents;
.. code-block:: php
<?php
return $LANG = [
'organization' => 'Company',
];
Database
""""""""
The following are the main entities, you can browse the `app/Models <https://github.com/invoiceninja/invoiceninja/tree/master/app/Models>`_ folder for the complete list.
- Accounts +users
- Clients +contacts
- Invoices +invoice_items
- Payments
- Credits
The best places to start when reviewing the code are `app/Http/routes.php <https://github.com/invoiceninja/invoiceninja/blob/master/app/Http/routes.php>`_ and `app/Providers/EventServiceProvider.php <https://github.com/invoiceninja/invoiceninja/blob/master/app/Providers/EventServiceProvider.php>`_.
To enable each account to have its own incrementing Ids (ie, /clients/1) all account entity classes extend the custom EntityModel.php class. This gives each entity a public_id field. You can read more about it in `this post <http://hillelcoren.com/2014/02/11/friendly-urls-with-per-account-incrementing-ids-in-laravel/>`_.
All actions are tracked in the activities table. Example of actions are creating a client, viewing an invoice or entering a payment. This is implemented using Laravel model events. An example can be seen at the bottom of `app/Models/Invoice.php <https://github.com/invoiceninja/invoiceninja/blob/master/app/Models/Invoice.php>`_.
Laravel supplies `soft delete <http://laravel.com/docs/4.2/eloquent#soft-deleting>`_ functionality, however in order to ensure referential integrity records are only deleted when a user cancels their account. To support this weve added an is_deleted field. When the deleted_at field is set the entity has been archived, when is_deleted is true the entity has been deleted.
Automated Tests
"""""""""""""""
To run the `Codeception <http://codeception.com/>`_ tests youll need to install `PhantomJS <http://phantomjs.org/>`_.
- Create config file: ``cp tests/_bootstrap.php.default tests/_bootstrap.php``
- Create test user: ``php artisan db:seed --class=UserTableSeeder``
- edit the following files, replacing ``www.ninja.test:8000`` with your local test domain:
- /.travis.ylm
- /app/Libraries/Utils.php
- /tests/acceptance.suite.yml
- /tests/functional.suite.yml
- Start the PhantomJS web server: ``phantomjs --webdriver=4444``
- Run the tests: ``sudo ./vendor/codeception/codeception/codecept run --debug``

View File

@ -1,34 +0,0 @@
Email Settings
==============
Email communication with your clients is an important part of the Invoice Ninja invoicing process sending invoices via email, notifying clients that an invoice is due, reminding clients about overdue payments, and more.
With the Email Settings feature, you can specify certain settings and designs for the notification emails your clients receive from your Invoice Ninja account.
The Email Settings page includes three sections: Email Settings, Email Designs and Email Signature.
Email Settings
""""""""""""""
Reply-To Email: Specify the email address your clients will reply to. (This is the email address that will automatically come up when your clients click "Reply" to your Invoice Ninja emails.)
BCC Email: If you want to send a copy of your client emails privately to another email address, enter it here. (Your clients won't see it).
- **Attach PDFs**: Want the capability to attach PDF files to your emails? Check the Enable box.
- **Attach documents**: Want the capability to attach documents to your emails? Check the Enable box.
Email Design
""""""""""""
- **Email Style**: You can make your emails look more professional by choosing a design layout. Select the desired style by opening the drop-down menu. Available styles are Plain (regular email layout), Light (graphical layout featuring light border) and Dark (graphical layout featuring dark border). To preview the different styles, click the question mark icon at the right end of the field.
- **Enable markup**: Want to give your clients the convenient option to pay you online with a direct link from the invoice notification email? Check Enable markup to add a payment link, or any other call to action, to the invoice email. Then, your clients can click through to submit an online payment.
Email Signature
"""""""""""""""
Customize your email signature by entering free text in the box. Then format and customize the design of your email signature with the formatting toolbar. You can change the font, size or emphasis, underline, add bullets, hyperlinks and much more.
Prefer to design your own email signature in raw HTML? Click the gray Raw button at the bottom right of the free text box. Then enter your HTML and click Update.
Finished customizing your email settings? Click the green Save button to apply the new settings.

View File

@ -1,115 +0,0 @@
Expenses
========
Running a freelance business isn't just about the money that's coming in. You also need to take care of the money going out. With Invoice Ninja, all your earnings, expenses, clients and vendors are stored and managed in one, smart system designed to keep you on top of things. What's more, the Expenses part of your Invoice Ninja account streamlines with your invoicing via a click of the mouse, across multiples currencies, so you get the complete bigger picture of your business expenses - with simplicity and ease.
List Expenses
"""""""""""""
To view the Expenses list page, click on the Expenses tab on the main taskbar.
Overview
^^^^^^^^
The Expenses list page displays a summary of all business expenses that you choose to enter. Apart from giving an overview of all your recorded expenses in a table format, you can also carry out a number of important actions from the Expenses page. First, let's take a look at the various columns in the Expenses table from left to right:
- **Vendor**: The name of the vendor
- **Client**: The name of the client for whom the expense is relevant
- **Expense**: Date The date the expense occurred
- **Amount**: The expense amount
- **Category**: The assigned category of the expense
- **Public Notes**: The notes entered when creating the expense (this becomes the item description if the expense is converted to an invoice)
- **Status**: The current status of the expense: Logged (blue), Pending (orange), Invoiced (gray), Paid (green)
The final column to the right is the Action column. To view the actions, hover your mouse over the Action area of the relevant expense entry and a gray Select button will appear. Click on the arrow at the right side of the button to open a drop-down list. These are the action options:
- **Edit Expense**: Edit the expense information on the Edit Expenses page.
- **Invoice Expense**: Convert the expense to a client invoice.
- **Archive Expense**: Click here to archive the expense. It will be archived and removed from the Expenses list page.
- **Delete Expense**: Click here to delete the expense. It will be deleted and removed from the Expenses list page.
.. TIP:: To sort the Expenses list according to any of the columns, click on the orange column tab of your choice. A small arrow will appear. If the arrow is pointing up, data is sorted from lowest to highest value. If the arrow is pointing down, data is sorted from highest to lowest value. Click to change the arrow direction.
Expense Categories
""""""""""""""""""
In order to better manage your business expenses, you can create custom categories and assign them to various expenses. For example, you may decide to create a category for "Office Supplies", or "Events" or perhaps "Salaries". Whichever categories you decide you need, creating them is super simple. First, you'll need to open the Expense Categories page.
To open the Expense Categories page:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Click on the gray Categories button that appears above the Expenses table. The page features a list of all existing categories.
To create a new Expense Category:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Click on the blue New Expense Category + button located at the top right of the Expense Categories page. On the Expense Categories/ Create page, enter the name of the category, and click Save. The new category will now appear in the list on the Expense Categories page. When you create a new expense, you can apply a category from your list to the expense.
To edit an Expense Category:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
On the Expense Categories page, click on the gray Select button in the far right column of the category entry, and select Edit Category.
To archive an Expense Category:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
On the Expense Categories page, select the relevant category, and click the gray Archive button above left of the Expense Categories table. The category will be permanently removed from the Categories list. To view archived categories, check the Show archived/deleted box next to the Archive button. The category will now be viewable again in the Expense category table, marked with an orange Archived status. To restore the archived category, click on the gray Select button in the far right column of the category entry, and select Restore expense category.
.. TIP:: There's another fast way to archive an Expense Category. Click on the gray Select button in the far right column of the category entry, and select Archive Category.
Here's a fast, easy way to get to the Vendors page from the Expenses list page. Click the gray Vendors button located at the top right of the page, to the right of the Categories button.
Filter
^^^^^^
To filter the Expenses list, enter the filter data in the Filter field, situated at the top right of the page, to the left of the gray Categories button. Expenses can be filtered according to Vendor name. Enter the name or parts of the name, and the filter function will automatically locate and present the relevant entries.
Archiving/Deleting Expenses
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
To archive or delete an expense, hover over the expense entry row, and open the Action drop-down list. Select Archive Expense or Delete Expense from the list. The Expenses table will automatically refresh, and archived or deleted expenses will no longer appear in the list.
You can also archive or delete one or more expense via the gray Archive button that appears at the top left side of the Expenses list page. To archive or delete expenses, check the relevant expenses in the check boxes that appear in the far left column next to the vendor name. The number of expenses selected for archiving/deleting will automatically update and show on the Archive button. Then click on the Archive button, open the drop-down list and select the desired action.
.. NOTE:: Want to view archived or deleted expenses? Check the box marked Show archived/deleted, situated to the right of the Archive button. The table will automatically refresh, and will now feature the full list of expenses, including current, archived and deleted expenses. The status of the archived and deleted expenses will be displayed in the far right column.
- Deleted expenses are displayed with a strikethrough line and a red Deleted button in the right hand column of the expense entry. To restore deleted expenses, hover on the red Deleted button. A gray Select button will appear. Click on the Select arrow, and select Restore expense in the drop-down list.
- Archived expenses are displayed with an orange Archived button. To restore the archived expense, hover on the orange Archived button. A gray Select button will appear. Click on the Select arrow, and choose Restore expense from the drop-down list. To delete an archived expense, select Delete expense from the drop-down list of the Select button.
Invoice
^^^^^^^
Are you billing a client directly for an expense? With the Invoice button on the Expenses list page, you can automatically convert an expense to an invoice in one simple click. To create an invoice for an expense, first you'll need to select the expense in question. Select an expense by checking the box located in the far left column of the relevant entry. Then click the blue Invoice button located at the top left of the Expenses table. The expense will be converted automatically to a new invoice.
.. TIP:: If you want to invoice an expense, you need to enable the invoicing function when you create the expense, or later by editing the expense. To enable the invoicing function, check the Should be invoiced box that appears on the Expenses/ Create or Expenses/ Edit page.
Create Expense
""""""""""""""
You can create a new expense directly from the Expenses list page by clicking on the blue New Expense + button located at the top right side of the page. The Expenses / Create page will open.
To ensure your business records are meticulous and organized, enter all your expenses in to your Invoice Ninja account. It's the perfect way to keep track, keep up to date and even invoice clients directly for expenses you've accrued while on the job. Managing and invoicing expenses on Invoice Ninja is so easy but the first step is logging the expense. Here's how to do it.
To create an expense, click on the Expenses tab on the main taskbar. Select New Expense from the drop-down menu and the Expenses / Create page will open.
Overview
^^^^^^^^
The Expenses / Create page features a range of fields and checkboxes for you to complete.
- **Vendor**: Click on the arrow on the right side of the Vendor field and select the vendor from the drop-down list.
- **Category**: Click on the arrow on the right side of the Category field and select the category from the drop-down list. Note: you don't have to apply a category. This is totally optional.
- **Date**: Enter the relevant date of the expense.
- **Currency**: Select the currency of the expense. This is a fantastic feature for complicated cross-border invoicing of overseas clients and/or vendors.
- **Amount**: The amount of the expense.
- **Client**: Click on the arrow on the right side of the Client field and select the relevant client from the drop-down list. TIP: Selecting a client is optional. If the expense is not attached to a particular client, leave this field blank.
- **Should be invoiced**: Do you need to invoice a particular client for this expense? If yes, check the Should be invoiced box to enable invoicing later.
- **Convert currency**: If the expense was paid in a different currency, check the Convert currency box. Then, when the expense is converted to an invoice, you can convert the amount to the currency with which you normally invoice the client.
- **Apply taxes**: If you need to apply taxes to the expense when invoicing the client, check the Apply taxes box. Then, when you create the invoice for the expense, the taxes feature will be enabled.
- **Public Notes**: Enter a description of the expense. When the expense is converted to an invoice, the text you enter here will feature as the line item description for the expense on the invoice. TIP: This is the description of the expense that your client will see on the invoice. Make sure to include the relevant details.
- **Private Notes**: Enter comments or notes that you wish to include about the expense as a personal reminder. Remember, the Private Notes section is for your eyes only, so feel free to enter anything you like.
- **Attached documents**: If you need to provide documentation relevant to the expense, such as receipts, stubs or other items, you can attach as many documents as you need here. File types can include Word documents, Excel spreadsheets, scanned PDF files and more. Click on the Attached documents box to open the Browse window, and select the relevant files.
To save the new expense, click the green Save button at the bottom of the page. Then, the expense you created will appear as an entry in the Expenses list page.
.. TIP:: After you click Save, the Expenses/ Create page will automatically refresh, and you'll see a gray More Actions button featured to the right of the Save button. Click on the More Actions button, and you can take any of three actions directly from the new expense page: Invoice Expense, Archive Expense or Delete Expense.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 263 KiB

View File

@ -1,54 +0,0 @@
Invoice Ninja User Guide
========================
Want to find out everything there is to know about how to use your Invoice Ninja account? Look no further than our User Guide, where youll learn all about creating and sending invoices, receiving payments, creating tasks, converting quotes to invoices, recurring invoices, entering credits and much, much more.
.. _basic-features:
.. toctree::
:maxdepth: 1
:caption: Basic Features
introduction
clients
invoices
payments
recurring_invoices
credits
quotes
proposals
tasks
expenses
vendors
reports
tickets
settings
.. _advanced-settings:
.. toctree::
:maxdepth: 1
:caption: Advanced Settings
invoice_settings
invoice_design
client_portal
email_settings
templates_and_reminders
data_visualizations
api_tokens
user_management
.. _self_host:
.. toctree::
:maxdepth: 1
:caption: Self Host
install
configure
update
mobile_apps
api
developer_guide
custom_modules

View File

@ -1,109 +0,0 @@
Install
=======
Thanks for taking the time to setup Invoice Ninja.
.. Note:: The applications requires PHP >= 7.0.0 and MySQL.
Detailed Guides
^^^^^^^^^^^^^^^
- Ubuntu and Nginx: `websiteforstudents.com <https://websiteforstudents.com/install-invoice-ninja-on-ubuntu-16-04-18-04-lts-with-nginx-mariadb-and-php-7-2-fpm/>`_
- Ubuntu and Apache: `websiteforstudents.com <https://websiteforstudents.com/install-invoiceninja-on-ubuntu-16-04-18-04-with-apache2-mariadb-and-php-7-2//>`_
- Debian and Nginx: `rosehosting.com <https://www.rosehosting.com/blog/how-to-install-invoice-ninja-on-debian-9/>`_
- CentOS and Nginx: `rosehosting.com <https://www.rosehosting.com/blog/how-to-install-invoice-ninja-on-centos-7/>`_
- HostGator: `catsinja.com <http://blog.catsinja.com/2018/10/setup-invoice-ninja-on-hostgator-shared/>`_
Automatic Install/Update
^^^^^^^^^^^^^^^^^^^^^^^^
- Ansible: `github.com <https://github.com/invoiceninja/ansible-installer>`_
- Dockerfile: `docker.com <https://hub.docker.com/r/invoiceninja/invoiceninja/>`_
- Cloudron: `cloudron.io <https://cloudron.io/store/com.invoiceninja.cloudronapp.html>`_
- Softaculous: `softaculous.com <https://www.softaculous.com/apps/ecommerce/Invoice_Ninja>`_
.. Tip:: You can use `github.com/turbo124/Plane2Ninja <https://github.com/turbo124/Plane2Ninja>`_ to migrate your data from InvoicePlane.
Manual Install
^^^^^^^^^^^^^^
Step 1: Download the code
"""""""""""""""""""""""""
You can either download the zip file below or checkout the code from our GitHub repository. The zip includes all third party libraries whereas using GitHub requires you to use Composer to install the dependencies.
https://download.invoiceninja.com
.. Note:: All Pro and Enterprise features from our hosted app are included in both the zip file and the GitHub repository. We offer a $20 per year white-label license to remove our branding.
- Release Notes: `github.com/invoiceninja/invoiceninja/releases <https://github.com/invoiceninja/invoiceninja/releases>`_
Step 2: Upload the code to your server
""""""""""""""""""""""""""""""""""""""
Copy the ZIP file to your server and then check that the storage folder has 755 permissions and is owned by the webserver user.
.. code-block:: shell
cd /path/to/ninja/code
chmod -R 755 storage
sudo chown -R www-data:www-data storage bootstrap public/logo
Step 3: Setup the database
""""""""""""""""""""""""""
Youll need to create a new database along with a user to access it. Most hosting companies provide an interface to handle this or you can run the SQL statements below.
.. code-block:: shell
CREATE DATABASE ninja;
CREATE USER 'ninja'@'localhost' IDENTIFIED BY 'ninja';
GRANT ALL PRIVILEGES ON ninja.* TO 'ninja'@'localhost';
Step 4: Configure the web server
""""""""""""""""""""""""""""""""
See the guides listed above for detailed information on configuring Apache or Nginx.
Once you can access the site the initial setup screen will enable you to configure the database and email settings as well as create the initial admin user.
.. Tip:: To remove public/ from the URL map the webroot to the /public folder, alternatively you can uncomment ``RewriteRule ^(.*)$ public/$1 [L]`` in the .htaccess file. There is more info `here <https://www.invoiceninja.com/forums/topic/clean-4-4-3-self-hosted-install-url-configuration-clarification/#post-14186>`_.
Step 5: Configure the application
"""""""""""""""""""""""""""""""""
See the `details here <https://invoice-ninja.readthedocs.io/en/latest/configure.html>`_ for additional configuration options.
Step 6: Enable auto updates
"""""""""""""""""""""""""""
Use this `shell script <https://pastebin.com/j657uv9A>`_ to automate the update process.
You can run it as a daily cron to automatically keep your app up to date.
Troubleshooting
^^^^^^^^^^^^^^^
- Check your webserver log (ie, /var/log/apache2/error.log) and the application logs (storage/logs/laravel-error.log) for more details or set ``APP_DEBUG=true`` in .env
- To resolve ``[Symfony\Component\Debug\Exception\FatalErrorException] Class 'SomeClass' not found`` try running php artisan optimize
- To resolve ``file_put_contents(...): failed to open stream: Permission denied`` run ``chmod -R 777 storage`` then ``chmod -R 755 storage``
- If index.php is in the URL it likely means that mod_rewrite needs to be enabled.
- Running ``composer install`` and ``composer dump-autoload`` can sometimes help with composer problems.
- If youre using a subdomain. ie, invoice.mycompany.com You will need to add ``RewriteBase /`` to public/.htaccess otherwise it may fail with ``Request exceeded the limit of 10 internal redirects due to probable configuration error.`` messages in the logs.
- Composer install error: ``Fatal error: Allowed memory size of...`` Try the following: ``php -d memory_limit=-1 /usr/local/bin/composer install``
- PHP Fatal error: ``Call to undefined method Illuminate\Support\Facades\Session::get()`` try deleting bootstrap/cache/services.php. If the file doesn't exist the steps `here <https://stackoverflow.com/a/37266353/497368>`_ may help.
- Some webservers run filtering software which can cause errors, you can test adding this code to your .htaccess file to test if it's related.
.. code-block:: shell
<IfModule mod_security.c>
SecFilterEngine Off
SecFilterScanPOST Off
</IfModule>

View File

@ -1,162 +0,0 @@
Introduction
============
Lets get acquainted with a basic overview of the structure of the Invoice Ninja website. Once youve wrapped your mind around a few central concepts, its as easy as ABC to effectively manage your freelance business accounts.
The Invoice Ninja system is based on two main pillars:
- **List pages** are summary pages of the various activities in your account. These include the Clients list page, Tasks list page, Invoices list page, Payments list page and more. List pages are located in the main sidebar of the Invoice Ninja site. The list pages provide a centralized overview and management station for the particular component of your account. For example, the Clients list page is a list of all your clients, with accompanying information and handy links, so you can manage all your clients on one page.
- **Action pages** are pages dedicated to a specific action you can take in your Invoice Ninja account. Examples include Create New Client, Enter Credit, Create New Invoice, Create Recurring Invoice, Enter Credit, Enter Payment and Create New Task. All actions you take will be recorded in the List pages, updated in real time to reflect your invoicing activity from minute to minute.
So remember the ninja rule: **list pages provide a summary overview**, and **action pages facilitate your invoicing activity**.
Youre invited to browse the user guide for more detailed information. Were always looking to take Invoice Ninja one step ahead, so if you have any comments, queries or suggestions, wed love to hear from you.
Dashboard
^^^^^^^^^
Welcome to the Dashboard page of your Invoice Ninja account. This is the first page youll see when you login. It provides a general overview of the invoicing status of your freelance business. It is easy on the eye, and easy to digest. When you arrive at the Dashboard page, youll glimpse a comprehensive and user-friendly snapshot of whats going on right now in your invoicing world.
So lets jump right in and take a look at the different elements that make up your invoicing dashboard.
When you login to your Invoice Ninja account, youll automatically arrive on the Dashboard page. To go to the Dashboard page from anywhere in the site, click the Dashboard tab on the main sidebar at the left of your screen.
Sidebar Navigating Your Invoice Ninja Account
"""""""""""""""""""""""""""""""""""""""""""""""
The Sidebar, at the left of your screen, is always visible, no matter where you are in your Invoice Ninja account. Use the sidebar to get where you want to go, quickly and easily.
When you click on a specific tab, you'll go to the list page. So, if you click on Invoices, you'll navigate to the Invoices list page. Same for Quotes, Payments, Products, Recurring, Credits and many others.
Want to create a new invoice, quote, task, list, payment, or any other new item? Hover on the relevant tab, and click the blue plus sign that appears on the right hand side of the tab. You'll be automatically redirected to the "Create New…" page.
The last two tabs on the list are Reports and Settings. Click on Reports to navigate to the reporting page of your account. Here you can create all types of reports about your invoicing.
To manage any of your account settings, click on the Settings tab. Then you can work on the full range of account settings via the taskbar of the Settings page.
Data Boxes Your Instant Invoicing Overview
""""""""""""""""""""""""""""""""""""""""""""
One of the first things youll notice about the Dashboard page is the three large data boxes at the top of the screen. These are designed to offer a simple yet powerful overview of your total business accounts:
- **Total Revenue**: The total amount that your business has brought in to date.
- **Average Invoice**: The amount of the current average invoice. Note this will change over time, depending upon your income.
- **Outstanding**: The total amount of all unpaid invoices.
.. TIP:: If you are being paid in a range of currencies, the three data boxes on your dashboard will display the relevant amounts in all currencies.
Chart
Below the three main data boxes, you'll see a chart presenting your invoicing data in an easy-to-understand graphical format. The data presented in the chart will be based upon the filters you select. Let's check out how the filters work.
Filter
""""""
The Dashboard page gives you a summary overview of your invoicing activity and the filter option enables you to control exactly what data you are seeing. There are three filter options:
1. Currency: If you are working in various currencies, you can filter according to each currency to view your invoicing activity in only that currency.
2. Day/Week/Month: For an overview of the past day, week or month, select the time period you prefer.
3. Custom dates: Select any time period you want by filtering according to dates. Click on the custom date field, and you'll see a drop down menu with a range of pre-set options, such as "Last month", "This year", etc. To create a custom time frame, select "Custom range", choose your dates and click Apply.
When you apply the filter, the data presented in the boxes and chart will update automatically.
Below the chart, there are four windows summarizing different aspects of your invoicing activity.
Window 1: Activity
"""""""""""""""""""""""
The Activity list is incredibly useful as it presents an up-to-date, action-packed summary of what is happening across your entire invoicing account. Every action taken, whether by you or by one of your clients, is listed in chronological order, together with the date the action occurred. The list is updated in real time, with more recent actions showing first, so you get a minute-to-minute understanding of your invoicing activity.
The Activity list includes all possible actions occurring within your Invoice Ninja account, including:
- Creating an invoice
- Sending an invoice
- Creating a new client
- Archiving/deleting a client
- Creating a credit
- Your client viewing your invoice
- Your client sending a payment
- And many, many more
.. TIP:: You can view a real-time tally of the number of invoices sent, displayed at the top right side of the blue Activity header bar.
Window 2: Recent Payments
"""""""""""""""""""""""""
The Recent Payments list provides a summary of your clients payments, with the most recent payments showing at the top of the list. The Recent Payments list presents an overview of the following key information:
- **Invoice #**: The invoice reference number
- **Client**: The clients name
- **Payment Date**: The date the payment was made
- **Amount**: The amount of the payment. Note that the amount will be displayed in the currency in which it was paid.
.. NOTE:: In order for Invoices or Quotes to appear on the Dashboard page, the Due Date and Valid Until fields must be completed. Invoices or Quotes lacking this information will not be viewable on the Dashboard.
Window 3: Upcoming Invoices
"""""""""""""""""""""""""""
The Upcoming Invoices list provides a summary of all invoices with due dates approaching. The Upcoming Invoices list presents an overview of the following key information:
- **Invoice #**: The invoice reference number
- **Client**: The clients name
- **Due Date**: The due date of the payment
- **Balance Due**: The amount due
Window 4: Invoices Past Due
"""""""""""""""""""""""""""
The Invoices Past Due list provides a summary of all unpaid invoices. The Invoices Past Due list presents an overview of the following key information:
- **Invoice #**: The invoice reference number
- **Client**: The clients name
- **Due Date**: The original due date of the overdue payment
- **Balance Due**: The amount overdue
.. NOTE:: Archived invoices, payments and quotes will appear on the dashboard, and their amounts will be included in the account totals at the top of the page. Deleted invoices, payments and quotes will not appear, nor will their amounts be included on the Dashboard page.
Window 5: Upcoming Quotes
"""""""""""""""""""""""""
If you have a Pro account, the Dashboard will also include two extra windows displaying your Upcoming Quotes and Expired Quotes.
The Upcoming Quotes list provides a summary of all quotes with "Valid Until" dates approaching. The Upcoming Quotes list presents an overview of the following key information:
- **Quote**: # The quote reference number
- **Client**: The clients name
- **Due Date**: The valid until date
- **Balance Due**: The amount of the quote
Window 6: Expired Quotes
""""""""""""""""""""""""
The Expired Quotes list provides a summary of all quotes that have already passed their "Valid Until" date. The Expired Quotes list presents an overview of the following key information:
- **Quote #**: The quote reference number
- **Client**: The clients name
- **Due Date**: The valid until date
- **Balance Due**: The amount of the quote
.. TIP:: In addition to displaying a helpful overview of your invoicing activity, the Dashboard page is rich in clickable links, providing you with a shortcut to relevant pages you may wish to view. For example, all invoice numbers are clickable, taking you directly to the specific invoice page, and all client names are clickable, taking you directly to the specific client summary page.
History Sidebar
"""""""""""""""
At the right hand side of your Dashboard screen you'll find the History sidebar, which displays all your recent invoices in a chronological list according to invoice number, together with the name of the client.
.. TIP:: You can create a new invoice for a particular client by hovering on the right hand side of the tab featuring the client's name. It's just another way to create a new invoice, fast.
Hide/Show History Sidebar
*************************
You can choose to hide or show the history sidebar at any time by clicking on the Toggle History button, located at the top right corner of the screen. The Toggle History button appears as three horizontal lines in the shape of a button. Click once to close the history sidebar; click again to open.
Need Help? Feel like Sharing? Introducing Quick Links
"""""""""""""""""""""""""""""""""""""""""""""""""""""
At the bottom left of the sidebar menu, you'll find a few quick links to make your Invoice Ninja experience even better.
- **Email**: Click on the email icon to contact us.
- **Support**: Click on the support icon to visit our Support Forum.
- **Help**: Click on the question mark icon to view Keyboard Shortcuts and Voice Demand libraries.
- **Social media**: Click on the social media links to visit our Facebook, Twitter and Github pages.

View File

@ -1,68 +0,0 @@
Invoice Design
==============
Whether you're a design novice or programming pro, Invoice Ninja gives you the power to customize your invoice design, to give your invoices the exact look you want. The design tool is the perfect way to match your invoices to your company's graphical look and feel, including colors, fonts, logos, margin sizes, column names, headers, footers and much more.
You can design you invoice using the simple selection tools, or go deeper and customize it from the foundations with our customization feature.
The Invoice Design page is divided into two sections. The top section presents the various options for customization and the bottom section displays a real time PDF sample of your invoice, so you can see your changes as you go along.
To customize the invoice design, there are five tabs to choose from. Let's go through them one by one:
General Settings
""""""""""""""""
Standard Design: Invoice Ninja provides a selection of design templates. Examples include 'Bold', 'Elegant', 'Hipster' and 'Business'. The default template setting is 'Clean'. To change the template setting, select a design from the drop down menu. The PDF invoice display below will automatically update to show you a preview of the design template.
Quote Design: You can also select a design template for your quotes. Choose from the available options in the drop down menu.
.. TIP:: Your chosen design will only apply after you click the Save button. Feel free to play with the various designs and explore your options before saving.
- **Body Font**: Select the desired font for the body text of the invoice.
- **Header Font**: Select the desired font for the header text of the invoice.
- **Page Size**: Select the desired page size, from among the dozens available.
- **Font Size**: Select the desired font size for the text that appears in the invoice.
- **Primary Color**: Select the desired primary color of the invoice design.
- **Secondary Color**: Select the desired secondary color of the invoice design.
.. TIP: The invoice design templates are based on a two-tone color scheme. Make sure to select primary and secondary colors that are complementary and reflect your design taste and your company's design theme.
Invoice Labels
""""""""""""""
Want to change the column names or field names on your invoice template? To customize any field name on your invoice, choose the relevant label from the drop down menu, and enter the new name in the empty field. After you click the green Save button, the new field name(s) will appear on the live PDF of the invoice template.
Invoice Fields
"""""""""""""""
You can change the order and location of any fields on your invoice template by using the 'drop and drag' feature. The fields are coordinated in groups: Invoice Fields, Client Fields and Company Fields. Use your mouse to drag and drop the fields in the order and location you prefer.
Product Fields
""""""""""""""
You can change the order and location of any product or task fields on your invoice template by using the 'drop and drag' feature. Use your mouse to drag and drop the fields in the order and location you prefer.
Invoice Options
"""""""""""""""
Hide Paid to Date If you wish to hide the Paid to Date column until payment has been made, check the box. Then, your invoices won't ever display 'Paid to Date 0.00'.
Embed documents You can choose to attach documents to your invoice, such as samples, testimonials, etc. Check the box to enable embedding of documents to your invoices.
Show Header on / Show Footer on Want your header and footer to appear on all pages of the invoice, or the first/last page only? Select the desired setting here.
Want your header and footer to appear on all pages of the invoice, or the first page only? Select the desired setting here.
Once you've selected all your settings, click the green Save button and the new settings will apply.
Customize
"""""""""
If you have design experience, you can customize the invoice exactly as you want, beyond the options provided by Invoice Ninja. To work on the invoice document, click the blue Customize button. You'll be redirected to the programming page, where you'll have the option of working on the invoice Content, Styles, Defaults, Margins, Header and Footer layout. Simply click on the relevant tab and work away. The design changes you make will be reflected in the sample PDF invoice on the right side of the page.
To change the invoice design template, select the desired design from the drop down menu at the bottom left of the page.
To save your customized changes, click the green Save button at the bottom of the page.
To cancel your customized changes, click the gray Cancel button at the bottom of the page.
Need help with your customized coding? Click the gray Help button at the bottom of the page.

View File

@ -1,132 +0,0 @@
Invoice Settings
================
You can customize your invoice template by pre-defining the various numbering formats, adding new fields for client, contact, company or invoice information, and adding default text to invoice terms, invoice footer, and more. Any changes you make to the Invoice Settings will apply to all your invoices.
The Invoice Settings page has four sections:
- Generated Numbers
- Custom Fields
- Quote Settings
- Defaults
Generated Numbers
"""""""""""""""""
Your invoice and quote numbers are generated automatically. You can adjust the automated numbering system in this section.
The Generated Numbers section contains five tabs. Let's go through them:
Invoice Number
^^^^^^^^^^^^^^
To customize your invoice numbering system, click on the Invoice Number tab.
There are two ways to customize the invoice number: by adding a prefix or creating a pattern.
To add a prefix, select the Prefix button. In the field immediately below, add your chosen prefix. For example, you may choose to add your company initials, such as M&D. The current invoice number appears in the Counter field.
All your invoices will automatically include the numbering change. So if you chose the prefix M&D, your invoice numbers will appear as M&D001, and so on.
To create a pattern, select the Pattern button. In the pattern field, enter the custom variable of your choice. For example, if you create a pattern of {$year}-{$counter}, then your invoices will be numbered with the current year and latest invoice number. To view available options for custom patterns, click on the question mark icon at the right end of the Pattern field.
All your invoices will automatically display invoice numbers according to your customized pattern.
Quote Number
^^^^^^^^^^^^
To customize your quote numbering system, click on the Quote Number tab.
There are two ways to customize the quote number: by adding a prefix or creating a pattern.
- To add a prefix, select the Prefix button. In the field immediately below, add your chosen prefix. The prefix will appear before the quote number on all your quotes.
- To create a pattern, select the Pattern button. In the pattern field, enter the custom variable of your choice. To view available options for custom patterns, click on the question mark icon at the right end of the Pattern field.
All your quotes will automatically display quote numbers according to your customized pattern.
.. TIP:: You can choose to integrate your quote numbers with the invoice number counter. This is an important feature as it allows you to keep the same number when converting a quote to an invoice. So, Quote-001 will automatically become Invoice-001. To number your quotes with your invoice numbering system, check the Share invoice counter button. To number your quotes separately, uncheck the Share invoice counter button.
Client Number
^^^^^^^^^^^^^
If you wish to use a numbering system for your clients, check the Enable box.
You can then define your client numbering system according to the Prefix or Pattern function.
- To add a prefix, select the Prefix button. In the field immediately below, add your chosen prefix. The prefix will appear before the client number on all your invoices.
- To create a pattern, select the Pattern button. In the pattern field, enter the custom variable of your choice. To view available options for custom patterns, click on the question mark icon at the right end of the Pattern field.
Credit Number
^^^^^^^^^^^^^
If you wish to use a numbering system for your credits, check the Enable box.
You can then define your credit numbering system according to the Prefix or Pattern function.
- To add a prefix, select the Prefix button. In the field immediately below, add your chosen prefix. The prefix will appear before the credit number on all your invoices.
- To create a pattern, select the Pattern button. In the pattern field, enter the custom variable of your choice. To view available options for custom patterns, click on the question mark icon at the right end of the Pattern field.
Options
^^^^^^^
There are a few extra options provided to manage the generated numbering systems for your invoices. Click the Options tab to open them. Let's go through the options available:
- Padding: You can 'pad' your invoice numbers by adding as many zeros as you want before the invoice number. This gives you greater flexibility in your future invoicing numbers. To pad your invoice number, enter the amount of zeros you want to add before the invoice number. So if you want to add three zeros, enter the number 3.
- Recurring Prefix: You can choose to add a prefix to all your recurring invoice numbers. This can help you distinguish and organize your recurring invoices separately from your regular invoices. To add a prefix to recurring invoices, enter the prefix in the field.
- Reset Counter: If you want to define a time frame to periodically reset your invoice and quote number counters, you can do so by adjusting the frequency in the Reset Counter field. TIP: The default setting for your Reset Counter is set to Never. To change the setting, click the drop down menu and select a frequency from the list.
Custom Fields
"""""""""""""
You can create new fields for information that appears on your invoices by assigning new field values and labels in the Custom Fields section. All field changes will automatically appear in the PDF invoice.
Client Fields
^^^^^^^^^^^^^
To add fields to your client entries, click on the Client Fields tab.
You have the option of adding up to two new fields for client information. These will appear on the Client/Create and Client/Edit pages. When creating an invoice, the field name and information you entered for the client will be displayed in the Client details section of the PDF invoice.
Contact Fields
^^^^^^^^^^^^^^
To add fields to your contact entries, click on the Contact Fields tab.
You have the option of adding up to two new fields for contact information about your client. These will appear on the Client/Create and Client/Edit pages. When creating an invoice, the field name and information you entered for the contact will be displayed in the Client details section of the PDF invoice.
Company Fields
^^^^^^^^^^^^^^
To add fields to your company details, click on the Company Fields tab. Enter the Field Label and Field Value information in the relevant fields. The information you entered will automatically appear in the Company details section of the PDF invoice.
Product Fields
^^^^^^^^^^^^^^
To add fields to your product entries, click on the Product Fields tab.
You have the option of adding up to two new fields for product information. These will appear on the Product/Create and Product/Edit pages. When creating an invoice, the field name and information you entered for the product will appear in the Item section of the PDF invoice.
Invoice Fields
^^^^^^^^^^^^^^
Want to include customized information in your invoices? To add fields to your invoice entry, click on the Invoice Fields tab. Enter the new field name in the Field Label field. You can add one or two new invoice fields. The new fields will appear in the top part of the Create/Invoice page, and will automatically be included in the PDF invoice.
To add new invoice charge fields, go to the Surcharge Labels section. Enter the new charge in the fields provided. You can add one or two new surcharge fields. The new charge field/s will appear in the Invoice Subtotals section. Amounts entered into these fields during the Create or Edit Invoice process will automatically appear in the PDF invoice. To apply the Tax feature for the new charge, check the Charge taxes button.
Quote Settings
""""""""""""""
Want to convert accepted quotes into invoices at a click of a button? Check the Enable button and the auto convert function will apply. So, when a client approves a quote, it will automatically convert into a quote, saving you time and hassle.
.. TIP:: This feature is extra-helpful if you linked your quote and invoice number counters in the Invoice and Quote Numbers section of the Invoice Settings page.
To disable the auto convert function, uncheck the Enable button.
Defaults
""""""""
Set any customized default text you want to Invoice Terms, Invoice Footer, Quote Terms and Documents. The text you enter will appear in the relevant sections on all future invoices.
Completed all your Invoice Settings? Click the green Save button at the bottom of the page, and your customized changes will appear on all your invoices.

View File

@ -1,169 +0,0 @@
Invoices
========
Well, its time to bill, and the Invoices function of Invoice Ninja lets you get the job done fast and with perfect accuracy.
With a bustling freelance business, youre going to be sending out a lot of invoices. Creating an invoice is simple with the New Invoice page. Once youve entered the client, job and rates information, youll see a live PDF preview of your invoice, and youll have a range of actions at your fingertips from saving a draft, to sending the invoice to the client via email, to printing a PDF hard copy.
Invoices List page
"""""""""""""
With numerous invoices to keep track of, the Invoices list page is your go-to guide for the entire history and status of all your invoices including those that have been paid, those sent but unpaid, and those still in the drafting and editing stage.
Overview
^^^^^^^^
The life of an invoice in the Invoice Ninja system is made up of a number of stages:
- **Draft**: When youve created an invoice, but have not yet sent it. You may still need to edit.
- **Sent**: Youve sent the invoice, but the client has not yet paid.
- **Viewed**: The client has opened the invoice email and viewed the invoice.
- **Partial**: The invoice has been partially paid.
- **Paid**: Congratulations! The client has paid the full invoice amount.
- **Unpaid**: The invoice remains unpaid.
- **Overdue**: The invoice has passed its due date.
In order to understand exactly how the Invoices list page works, well take you through it step by step.
To view your Invoices list page, click the Invoices tab on the main sidebar. This will open the Invoices list page.
The Invoices list page displays a table of all your active invoices, at every stage, from the moment you create a new invoice, to the moment you archive or delete an invoice.
Let's explore the invoices list according to the tabs on the main header bar of the table from left to right:
- **Invoice #**: The number of the invoice
- **Client Name**: The name of the client
- **Date**: The date the invoice was issued
- **Amount**: The total amount of the invoice
- **Balance**: The amount owed by the client (after credits and other adjustments are calculated)
- **Due Date**: The date the payment is due
- **Status**: The current status of the invoice (Draft, Sent, Viewed, Partial, Paid, Unpaid, Overdue)
- **Action**: The Action button provides a range of possible actions, depending upon the status of the invoice.
To view the actions, hover your mouse over the Action area of the relevant invoice entry and a gray Select button will appear. Click on the arrow at the right side of the button to open a drop-down list. For invoices with “Draft” status, the drop-down list presents the following action items:
- **Edit Invoice**: Edit the invoice information on the Edit Invoice page.
- **Clone Invoice**: Duplicate the invoice. Then you can make minor adjustments. This is a fast way to create a new invoice that is identical or similar to this invoice.
- **View History**: You'll be redirected to the Invoices / History page, where you can view a history of all the actions taken from the time the invoice was created. The Invoices / History page displays a copy of the latest version of the invoice and a drop-down list of all actions and the corresponding version of the invoice. Select the version you wish to view. Click on the blue Edit Invoice button at the top right of the page to edit the invoice.
- **Mark Sent**: When you mark an invoice as sent, only then is the invoice viewable to the client in the client portal, and the client balance is updated to reflect the invoice amount.
- **Mark Paid**: Manually mark the invoice as paid. You may want to do this if you are not entering the payment directly into the system.
- **Enter Payment**: Enter the payment relevant to this invoice. You'll be redirected to the Payments / Create page.
- **Archive Invoice**: Click here to archive the invoice. It will be archived and removed from the Invoices list page.
- **Delete Invoice**: Click here to delete the invoice. It will be deleted and removed from the Invoices list page.
.. TIP:: For invoices with a status other than "Draft", only the relevant and applicable options from the above list will show in the Action drop-down list.
.. TIP:: To sort the invoices list according to any of the columns, click on the column tab of your choice. A small arrow will appear. If the arrow is pointing up, data is sorted from lowest to highest value. If the arrow is pointing down, data is sorted from highest to lowest value. Click to change the arrow direction.
Filtering Invoices
^^^^^^^^^^^^^^^^^^
You can easily filter your invoices list according to any state or status - Archived, Deleted, Draft, Viewed, Partial, Paid, Unpaid, Overdue. Go to the Filter field, located at the top left of the Invoices list page. Click inside the field. A drop down menu will open, displaying all the filter options. Click on the filter option or multiple options you want. The list will refresh automatically to display your chosen filters.
.. TIP:: The default filter is Active, so all your current active invoices will be displayed in the list, no matter the status. Remove the Active filter by clicking on the X.
Bulk Actions
^^^^^^^^^^^^
If you need to perform an action for a number of invoices, you can do it in one click with the bulk action feature. To use the bulk action feature, mark the relevant invoices in their checkbox at the far left of the invoices list. Once you've marked the invoices, click on the arrow of the gray Archive button, which is located at the top left of the invoices list. A drop down menu will open, featuring the following options:
- **Download Invoice**: Download PDF versions of the marked invoices.
- **Email Invoice**: Send invoices by email to the client(s).
- **Mark Sent**: Mark invoices as sent. Only then are these invoices viewable to the client in the client portal, and the client's total balance updated with the amounts of these invoices.
- **Mark Paid**: Mark invoices as paid.
- **Archive Invoice**: Archive invoices.
- **Delete Invoice**: Delete invoices.
Select the relevant option. The action will be taken automatically and instantly for all the invoices you checked.
.. TIP:: The number of invoices marked for bulk action will show on the Archive button. It is updated automatically when you check each invoice. This will help you keep track.
Create Invoice
""""""""""""""
Here, were going to focus on how to create a new invoice.
**Lets Begin**
To create a new invoice, go to the Invoices tab on the main sidebar, and click on the + sign. This will open the Invoices / Create page.
When you open the Invoices / Create page, the Invoice Ninja system will automatically create a new, empty invoice for you to complete. Note that each new invoice you create will be automatically numbered in chronological order. This will ensure your records are kept logical and organized. (You have the option to change the invoice number manually. We'll discuss that a little later.)
The top section of the invoice contains a range of important information specific to the client and the work you are invoicing. Lets explore them one by one:
- **Client**: Click on the arrow at the right end of the Client field. Select the relevant client from the client list. TIP: You can create a new client while creating a new invoice. Simply click on the Create new client link, situated below the Client field on the Invoices / Create page. A pop-up window will open, enabling you to complete the new clients details. Then continue creating the invoice for this new client.
- **Invoice Date**: The date of creation of the invoice. Click the calendar icon to select the relevant date.
- **Due Date**: The date the invoice payment is due. Click the calendar icon to select the relevant date.
- **Partial/Deposit**: In the event that you need to bill the client for a partial amount of the total amount due, enter the amount in the Partial/Deposit field. This will be automatically applied to the invoice.
- **Invoice #**: The invoice number is assigned automatically when you create a new invoice, in order of chronology. TIP: You can manually override the default invoice number by entering a different number in the Invoice # field.
- **PO #**: The purchase order number. Enter the purchase order number for easy reference.
- **Discount**: If you wish to apply a discount to the invoice, you can choose one of two methods: a monetary amount, or a percentage of the total amount due. To choose a method, click on the arrow at the right side of the box next to the Discount field. Select Percent or Amount from the drop-down list. Then enter the relevant figure. For example, to apply a 20% discount, enter the number 20, and select “Percent” from the drop-down list. To apply a $50 discount, enter the number 50, and select “Amount” from the drop-down list.
.. TIP: The currency of the invoice will be set according to the default currency specified for this client when you created the client.
Now that weve completed the general invoice information, its time to finish creating your invoice by specifying the job/s youre billing for, the amounts due for each job/line item, taxes, discounts and final balance due. Let's explore the various columns of the invoice, from left to right along the header bar:
- **Item**: This is the name of the item you are billing for. You can either enter the details manually, or by selecting one of the set items created by you in the Product Library. To select an item from your product library, click on the arrow at the right side of the item bar and choose the relevant item from the drop-down list. To enter the item manually, click inside the field and enter the item. Here are some examples of an item: 1 hour programming services OR 5 pages translation OR 1 hour consulting.
- **Description**: Add more information about the item. This will help the customer better understand the job completed, and is also useful for your own reference.
- **Unit Cost**: The amount you charge per unit of items. For example, let's say your item is "1 hour consulting", and you charge $80 for an hour of consulting that is, for 1 item unit. Then you'll enter 80 in the Unit Cost field.
.. Note:: If you have selected a set item from the Product Library, the description and unit cost that you pre-defined in the Product Library will apply by default. You can manually override the default unit cost or description by clicking in field and changing the data.
- **Quantity**: The number of units being charged. Continuing the above example, let's say you need to charge for 3 hours of consulting, enter the number 3 in the Quantity field.
- **Tax**: Note: This field will only appear if you selected "Enable specifying line item taxes" in the Settings > Tax Rates section of your account. To apply tax to the line item, click on the arrow at the right side of the Tax field and select the relevant tax from the drop-down list.
- **Line Total**: This is the amount due for the particular line item. Once you have entered the Unit Cost and Quantity, this figure will be calculated automatically. If you change either value at any time during creation of the invoice, the Line Total will adjust accordingly.
.. TIP: You can enter as many line items as you need in the invoice. As soon as you enter any data in a line item, a fresh, blank line item will open in the row below.
Beneath and to the right of the line item section, you'll find the Balance Due section. It's made up of a number of figures, all leading to the golden number the final, total Balance Due.
- **Subtotal**: This is the amount due before other figures are taken into calculation, such as Tax, Partial payments, Credits, etc.
- **Tax**: The tax rate for the invoice. Note: To apply a tax rate to the entire invoice, you must enable it first. Go to Settings > Tax Rates, and check the box for "Enable specifying an invoice tax". Select the appropriate tax rate for the entire invoice by clicking the arrow at the right side of the Tax field and selecting the relevant tax from the drop-down list.
- **Paid to Date**: The amount paid to date, including partial payments and credits.
- **Balance Due**: The final balance owed to you, after taxes, partial payments and credits have been deducted from the charged amount.
Directly to the left of the Balance Due section, you'll see a text box with a number of tabs to choose from:
- **Public Notes**: Want to write a personal or explanatory note to the client? Enter it here.
- **Private Notes**: Want to include some notes or comments for your eyes only? Enter them here, and only you can see them.
- Terms: Want to set terms to the invoice? Enter them here. The terms will appear on the invoice. If you want to make these the default terms for all invoices, check the Save as default terms box. Then these terms will automatically appear on each invoice you create.
- **Footer**: Want to enter information to appear as a footer on the invoice? Enter it here. The text will appear at the bottom of the invoice. If you want to make this the default footer for all invoices, check the Save as default footer box. Then this footer will automatically appear on each invoice you create.
- **Documents**: If you have an Enterprise account, you can attach 3rd party documents to send with your invoice. Click to upload files from your computer, or use the drag and drop feature to attach them. You can attach any type of file as long as it doesn't exceed 10 MB in size. Note: You must enable this feature in order to attach 3rd party documents. To enable, go to Advanced Settings > Email Settings and check Enable for Attach PDFs and Attach Documents. 
.. TIP:: The Invoices page is rich in clickable links, providing you with a shortcut to relevant pages you may wish to view. For example, all invoice numbers are clickable, taking you directly to the specific invoice page, and all client names are clickable, taking you directly to the specific client summary page.
- **Blue button Download PDF**: Download the invoice as a PDF file. You can then print or save to your PC or mobile device.
- **Gray button Save Draft**: Save the latest version of the invoice. The data is saved in your Invoice Ninja account. You can return to the invoice at any time to continue working on it. Note: An invoice in the Draft stage is not viewable to the client in the client portal, and the amount on the invoice is not reflected in the client's invoicing balance.
- **Green button Mark Sent**: If you mark the invoice as sent, then the invoice will be viewable to your client in the client portal. The amount on the invoice will also be calculated in the client's balance data.
- **Orange button - Email Invoice**: Email the invoice directly via the Invoice Ninja system to the email address specified for the client.
- **Gray button More Actions**: Click on More Actions to open the following action list:
- **Clone Invoice**: Duplicate the current invoice. Then you can make minor adjustments. This is a fast way to create a new invoice that is identical or similar to a previous invoice.
- **View History**: You'll be redirected to the Invoices / History page, where you can view a history of all the actions taken from the time the invoice was created. The Invoices / History page displays a copy of the latest version of the invoice and a drop-down list of all actions and the corresponding version of the invoice. Select the version you wish to view. Click on the blue Edit Invoice button at the top right of the page to go back to the invoice page.
- **Mark Paid**: The invoice status is changed to Paid.
- **Enter Payment**: Enter the payment relevant to this invoice. You'll be redirected to the Payments / Create page.
- **Archive Invoice**: Want to archive the invoice? Click here. The invoice will be archived and removed from the Invoices list page.
- **Delete Invoice**: Want to delete the invoice? Click here. The invoice will be deleted and removed from the Invoices list page.
.. TIP: At the left of these colorful buttons, you'll see a field with an arrow that opens a drop-down menu. This field provides you with template options for the invoice design. Click on the arrow to select the desired template. When selected, the live PDF invoice preview will change to reflect the new template.
.. IMPORTANT: Remember to click the gray Save Draft button every time you finish working on an invoice. If you don't click Save, you will lose the changes made. (But don't worry if you forget to click Save, a dialog box with a reminder to save will open when you try to leave the page.)
Email Invoice preview
^^^^^^^^^^^^^^^^^^^^^
When you are ready to send an invoice to the client, click the orange Email Invoice button. Before the invoice email is sent, a pop-up box will open, displaying a preview of the email. Here, you can customize the email template, including the text, data fields, and formatting. You can also view the sent history of the email.
Customizing the Invoice Email Template
''''''''''''''''''''''''''''''''''''''
To customize the email template, click the Customize tab. Add text or edit the default text, and use the formatting toolbar below to adjust the layout. Once you've finished customizing, click the Preview tab to see how the email looks.
Note: The email contains variables that automatically insert the relevant data to the email, so you don't need to type it in. Examples include the client's name and invoice balance. To see a full list of the variables you can insert and how to write them, click the question mark icon at the right end of the email subject line header.
.. TIP:: You can customize any type of email template from the Email Invoice box, including Initial Email, First Reminder, Second Reminder and Third Reminder emails. Go to Email Template and click to open the drop-down menu. Select the relevant template you want to work on.
Viewing the Email History
'''''''''''''''''''''''''
To view a history of when the email invoice was last sent, click the History tab. A list of all instances the email was sent will be shown here, according to date.

View File

@ -1,51 +0,0 @@
Mobile Applications
===================
The Invoice Ninja iPhone and Android applications allows a user to connect to their self-hosted Invoice Ninja web application.
.. TIP:: If you're unable to access the Android app store you can download the APK here: https://download.invoiceninja.com/apk
Connecting your to your self-hosted invoice ninja installation requires a couple of easy steps.
Web App configuration
"""""""""""""""""""""
First, you'll need to add an additional field to your .env file which is located in the root directory of your self-hosted Invoice Ninja installation.
The additional field to add is API_SECRET, set this to your own defined alphanumeric string.
.. image:: images/env_file_api_secret.png
Save your .env file and now open Invoice Ninja on your iPhone.
Mobile App configuration
""""""""""""""""""""""""
Once you have completed the in-app purchase to unlock the mobile app to connect to your own server, you'll be presented with two fields.
The first is the Base URL of your self-hosted installation, ie http://ninja.yourapp.com
The second field is the API_SECRET, enter in the API_SECRET you used in your .env file.
.. image:: images/iphone_self_hosted.png
Click SAVE.
You should now be able to login with your username and password!
FAQ:
""""
Q: I get a HTTP 500 error.
A: Most likely you have not entered your API_SECRET in your .env file
Q: I get a HTTP 403 error when i attempt to login with the iPhone or Android device.
A: Most likely your API_SECRET on the iPhone/Android device does not match that on your self-hosted installation.
Q: Do I need to create a token on the server?
A: No, this is not required. The server will automagically create a token if one does not exist on first login.

View File

@ -1,105 +0,0 @@
Payments
========
The Invoice Ninja system handles your entire invoicing process from sending a quote (Pro Plan only), to invoicing your client, to receiving payment. Whats more, you can receive payments directly and automatically via Invoice Ninjas 45+ payment partners, enabling totally smooth management of your customer accounts using your choice of payment provider. To learn more about Invoice Ninjas payment partners, `click here <https://www.invoiceninja.com/partners>`_.
List Payments
"""""""""""""
In the meantime, were going to take you through the Payments list page to give you an idea of the complete payment picture.
To view the Payments list page, click on the Payments tab on the main sidebar. This will open the Payments list page.
Understanding the Payments List Page
Overview
^^^^^^^^
The Payments list page displays a summary of all payments once they have been received. Payments are recorded in two ways:
1. **Automatic payment**: If your client has paid you via any of Invoice Ninjas 45+ payment partners, the payment will be automatically recorded in the Payments list. You will be notified by Invoice Ninja on your Dashboard page in the Payments table, and also via email (if you have chosen the relevant notification setting on the Settings / Notifications page).
2. **Manual payment**: If your client has paid you via cash, check, bank transfer, credit card or any other payment system not linked to Invoice Ninja, you will need to enter the payment manually on the Payments / Create page.
Whether automatic or manual entry, the Payments list page presents an overview of all payments received in a user-friendly table format. Now, well take you through the various columns in the Payments table from left to right:
- **Invoice**: The invoice number for the payment
- **Client Name**: The client's name
- **Transaction Reference**: If you have been paid automatically via one of the payment partners, the payment reference number generated by the payment system will be automatically recorded here. If you have entered a manual payment, the Transaction Reference will display the information you entered in the Transaction Reference field when entering the payment. If you left the Transaction Reference field blank when entering the payment, the system will automatically display “Manual entry” as the Transaction Reference on the Payments list.
- **Method**: The method of payment used, ie. PayPal, Bank Transfer, Visa, etc
- **Source**: Additional information displayed for online payments
- **Amount**: The payment amount that was received
- **Date**: The date the payment was received
- **Status**: The payment status (ie. Overdue, Partial Completed, etc)
The final column to the right is the Action column. To view the actions, hover your mouse over the Action area of the relevant payment entry and a gray Select button will appear. Click on the arrow at the right side of the button to open a drop-down list. These are the action options:
- **Edit Payment**: Edit the payment information on the Edit Payment page.
- Email Payment: Send the payment receipt to the client by email.
- Refund Payment: Refund the payment (or part of the payment) to the client.
- **Archive Payment**: Click here to archive the payment. It will be archived and removed from the Payments list page.
- **Delete Payment**: Click here to delete the payment. It will be archived and removed from the Payments list page.
.. TIP: To sort the Payments list according to any of the columns, click on the column tab of your choice. A small arrow will appear. If the arrow is pointing up, data is sorted from lowest to highest value. If the arrow is pointing down, data is sorted from highest to lowest value. Click to change the arrow direction.
Refunding a Payment
If you need to refund a payment, or part of a payment, go to the relevant payment in the Payments list, click on the Action column at the far right, and choose Refund Payment from the drop down menu. The Refund Payment dialog box will open. Enter the amount you wish to refund, and click Refund. If you want to send an email notifying the client of the refund, make sure to check 'Send email to client'.
Archiving/Deleting
^^^^^^^^^^^^^^^^^^
To archive or delete a payment, hover over the payment entry row, and open the Action drop-down list. Select Archive Payment or Delete Payment from the list. The Payments table will automatically refresh, and archived or deleted payments will no longer appear in the list.
You can also archive or delete one or more payment via the gray Archive button that appears at the top left side of the Payments list page. To archive or delete payments, check the relevant payments in the check boxes that appear in the far left column next to the invoice number. The number of payments selected for archiving/deleting will automatically update and show on the Archive button. Then click on the Archive button, open the drop-down list and select the desired action.
Want to view archived or deleted payments? Click on heck tthe field to the right of the gray Archive button at the top left of the page. Select the 'Archived' or 'Deleted' filter from the drop down menu. The table will automatically refresh, and will now feature the payments according to the filters you selected. full list of payments, including current, archived and deleted payments. The status of the archived and deleted payments will be displayed in the far right column.
- **Deleted payments** are displayed with a red Deleted button. To restore deleted payments, hover on the red Deleted button. A gray Select button will appear. Click on the Select arrow, and select Restore payment in the drop-down list.
- **Archived payments** are displayed with an orange Archived button. To restore the archived payment, hover on the orange Archived button. A gray Select button will appear. Click on the Select arrow, and choose Restore payment from the drop-down list. To delete an archived payment, select Delete payment from the drop-down list of the Select button.
Filter
^^^^^^
To filter the Payments list, enter the filter data in the Filter field, situated at the top right of the page, to the left of the blue Enter Payment + button. Payments can be filtered according to Client name. Enter the name or parts of the name, and the filter function will automatically locate and present the relevant entries.
You can enter a new payment directly from the Payments list page by clicking on the blue Enter Payment + button located at the top right side of the page. The Payments / Create page will open.
Filter
^^^^^^
To filter the Payments list, enter the filter data in the Filter field, situated at the top right of the page, to the left of the blue Enter Payment + button. Payments can be filtered according to Client name. Enter the name or parts of the name, and the filter function will automatically locate and present the relevant entries.
Enter Payment
"""""""""""""
Once youve received payment, youll need to enter the payment toon the Invoice Ninja system. If your client paid via one of Invoice Ninjas 45+ payment partners, the system will automatically record the payment and send a downloadable PDF receipt to the clients email address. If you were paid via cash, check, bank transfer, credit card, credit or any other payment method not automatically linked to the Invoice Ninja system, you will be required to manually enter the payment. The procedure of entering a payment manually is simple and lightning fast. Now, well take you through the payment entry process, step by step.
**Lets Begin**
You can enter a new payment directly from the Payments list page by clicking on the blue Enter Payment + button located at the top right side of the page. The Payments / Create page will open.
.. TIP: You can also enter a new payment by clicking the + sign on the Payments tab in the main sidebar menu.
Manually Creating a New Payment
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The Payments / Create page features a number of fields that youll need to complete.
- **Client**: Click on the arrow on the right side of the Client field and select the client from the drop-down list.
- **Invoice**: Enter the invoice corresponding to the received payment. Click on the arrow on the right side of the Invoice field and select the invoice number from the drop-down list.
- **Amount**: The invoice amount will appear automatically by default. However, if the payment amount does not correspond to the default invoice amount, you can manually Eenter the amount of payment received.
- **Payment Type**: Select the payment method that was used. Click on the arrow on the right side of the Payment Type field, and a drop-down list featuring a range of payment methods will open. Select the appropriate method from the list. Options include Bank Transfer, Cash, Debit, all credit cards, Google Wallet, PayPal, check and more.
- **Payment Date**: The date the payment was received. Click on the calendar icon to the right side of the Payment Date field and select the appropriate date.
- **Transaction Reference**: Enter any information you wish for your future reference. This information can be useful when managing your accounts.
- **Private Notes**: Here, you can add any comments, notes or reminders. These are for your eyes only the client cannot see them.
Email payment receipt
^^^^^^^^^^^^^^^^^^^^^
If you wish to send a receipt to your client for the payment received, check the '“Email payment receipt to the client' box. A downloadable PDF receipt will be generated and automatically sent to the clients email address when you save the payment entry.
Saving the Payment
^^^^^^^^^^^^^^^^^^
Once youve completed all the payment details, click Save and the payment will be saved to the Payments list. To cancel the payment entry, click Cancel.
.. TIP: If you are paid by all, or most, of your clients with the same payment method, you may want to save it as the default setting. Then, when entering a new payment, you won't need to select the Payment Type. It will already appear as the default setting on every new payment you create. To set a default payment method, go to Settings > Company Details. Scroll down to the Defaults section at the bottom of the page. Click on the Payment Type field to open the drop down menu of payment methods. Select the default method and click Save.

View File

@ -1,243 +0,0 @@
Proposals
=========
When submitting a regular quote is not enough, the advanced Proposals feature comes to the rescue.
Proposals are a powerful sales and marketing tool to present your offer for a gig. Whether you're competing against other providers, or you want to make a fantastic impression, the proposal function is a great way to custom-create a personalized proposal containing all the information you need to convey.
The proposals feature is based on grapesjs.com, which enables HTML and CSS management. This advanced tool gives experienced programmers the freedom to create customized, professional proposals with ease, directly within Invoice Ninja, integrating your quote information with one click.
There are three key parts to creating proposals: Proposals, Templates and Snippets. Let's explore them one by one.
Proposals
"""""""""
Each proposal is based on a quote. In order to create a proposal, you'll first need to create a quote.
To create a quote, click on New Quote on the Quotes list page, or click the + sign on the Quotes tab in the main sidebar. Once you've created the quote, go to the Proposals list page by clicking on the Proposals tab in the main sidebar.
Proposals List Page
^^^^^^^^^^^^^^^^^^^
The Proposals list page features a table of all active proposals and corresponding information.
The table consists of the following data columns:
- **Quote**: Every proposal is based on a quote. This is the quote number of the corresponding quote.
- **Client**: The client's name.
- **Template**: The template assigned to the proposal.
- **Date created**: The date the proposal was created.
- **Content**: A short preview of the content/topic of the proposal.
- **Private notes**: Any notes to yourself included in the proposal (these are hidden from the client; only you can see them).
- **Action column**: The action column has a drop-down menu with the option to Edit, Archive or Delete the proposal. To select an action, hover in the action column and click to open the drop-down menu.
Archive / Delete Proposal
^^^^^^^^^^^^^^^^^^^^^^^^^
If you wish to archive or delete a proposal, select the action in the column corresponding to the relevant quote. Once you select Archive or Delete, the proposal will be removed from the table.
.. TIP:: You can also archive a proposal by checking the box to the left of the quote number of the relevant proposal. Then click the Archive button at the top left of the Proposals table.
By default, the Proposals list page will display only active proposals in the table. To view archived or deleted proposals, you need to update the list in the labels field, situated at the top left of the Proposals table, to the right of the gray Archive button.
Click inside the labels field to open the drop-down menu. Then, select Archived and/or Deleted from the menu. The table will automatically refresh to display Archived/Deleted proposals. Archived proposals will display an orange "Archived" label and Deleted proposals will display a red "Deleted" label in the action column.
**To restore an Archived or Deleted Proposal**
First, display the proposal by updating the table to view Archived or Deleted proposals. Then, open the drop-down menu in the action column of the relevant proposal. Click Restore proposal.
New Proposal
^^^^^^^^^^^^
To create a new proposal, click the blue New Proposal + button located at the top right of the Proposals list page. The Proposals/ Create page will open.
.. TIP:: You can create a new proposal from anywhere in the site by clicking the + icon on the Proposals tab on the static sidebar menu at the left of the screen.
Before beginning to work on the proposal design, you'll need to complete the fields in the top section of the page:
- **Quote**: A proposal must be based on an existing quote. To select the quote, click the arrow in the Quote field, and choose the relevant quote from the drop-down menu.
- **Template**: Select the template you wish to use for the proposal by clicking the arrow in the Template field. Choose the relevant template from the drop-down menu.
- **Private notes**: This is an optional field. You can enter notes and comments. They are for your eyes only; all private notes remain hidden from the client.
Now you're ready to design the proposal. You'll be working on the 'canvas' with the proposal editor, rich in design tools to custom create attractive, professional-looking proposals.
The proposal layout is based on the template you choose. Any information contained in the corresponding quote will be automatically embedded in the proposal.
Let's explore the proposal editor toolbar, from right to left:
- **Grid Editor**: When you create a new proposal, the toolbar will be set by default to the far-right icon the grid editor. Proposals are built on a grid-like canvas. To insert sections, text blocks, icons, links and more, drag and drop the item from the selection that appears in the grid editor, in the sidebar at the right of the canvas.
- **Options button**: Navigation menu that takes you through each design element in the proposal.
- **Component Settings**: Displays the component ID that gives identifying information about the component.
- **Style Manager**: Provides style information and editing options for each design element Dimensions, Typography and Decorations.
- **Undo/ Redo buttons**: You can undo or redo your last action by clicking on these buttons.
- **Toggle Images**: Turn images in your proposal on or off.
- **Import Template**: Import an external template to apply to the proposal.
- **View Code**: Click to open a window that displays the proposal's code.
- **FullScreen**: Click to work in full screen mode. Click again to return to normal screen.
- **View Components**: Click to display all the components of the proposal.
View Modes
^^^^^^^^^^
At the top left of the proposal canvas, there is a view mode bar that allows you to view the proposal in desktop, tablet or mobile size. Click on the desktop, tablet or mobile icon to choose the view mode.
When You Finish Working on the Proposal
When you've finished designing the proposal, you can choose from three options:
- **Cancel**: Don't like your work? Don't need the proposal after all? Click the gray Cancel button to discard the proposal.
- **Save**: Save a draft to work on or send later by clicking on the green Save button. The proposal will appear in the Proposals table on the Proposals list page.
- **Email**: If you're ready to present the proposal to your client, click the orange Email button. The proposal will be sent to the client's email address.
Templates
"""""""""
Templates enable you to quickly apply standard layout and design features, saving time and making the proposal creation process more efficient.
You can also custom design your own templates, from scratch or based on an existing template.
Templates List page
^^^^^^^^^^^^^^^^^^^
All existing templates are listed in the Templates table, on the Templates list page. To open the Templates list page, click the gray Templates button that appears on the Proposals list page at the top of the Proposals table.
The Templates list page displays a table with the following columns:
- **Name**: The name of the template.
- **Content**: A preview of the template content.
- **Private notes**: Any notes to yourself about the template (these are hidden from the client; only you can see them).
Action column: The action column has a drop-down menu with a number of options:
- **Edit Template**: Click to open the Templates/ Edit page.
- **Clone Template**: Click to duplicate the template and create a new one.
- **New Proposal**: Click to create a new proposal. You'll automatically go to the Proposals/ Create page.
Archive Template/ Delete Template: Select the relevant action to archive or delete a template. Once you select Archive or Delete, the template will be removed from the table.
.. TIP:: You can also archive a template by checking the box to the left of the relevant template name. Then click the Archive button at the top left of the Templates table.
To select an action, hover in the action column and click to open the drop-down menu.
By default, the Templates list page will display only active templates in the table. To view archived or deleted templates, you need to update the list in the labels field, situated at the top left of the Templates table, to the right of the gray Archive button.
Click inside the labels field to open the drop-down menu. Then, select Archived and/or Deleted from the menu. The table will automatically refresh to display Archived/Deleted templates. Archived templates will display an orange "Archived" label and Deleted templates will display a red "Deleted" label in the action column.
**To restore an Archived or Deleted Template**
First, display the template by updating the table to view Archived or Deleted templates. Then, open the drop-down menu of the action column of the relevant template. Click Restore template.
New Template
^^^^^^^^^^^^
To create a new template, go to the Proposals list page. Click the arrow on the gray Templates button, which is situated at the top of the Proposals table. Select New Template from the drop-down menu. The Proposals/ Templates/ Create page will open.
First, complete the fields at the top part of the page:
- **Name**: Choose a template and enter it in the name field.
- **Private notes**: This is an optional field. You can enter notes and comments. They are for your eyes only; all private notes remain hidden from the client.
Then, you can begin work designing the template on the canvas.
If you want to load an existing template to work from, click the Load Template field, located above the template canvas. A drop-down menu will open. Select the template you wish to load.
.. NOTE:: If you add a custom template, the Clean template will be removed. You can add it back by creating a custom template based on the Clean template.
- **Help**: Need help designing your template? Click the gray Help button.
- **Cancel**: To cancel your new template, click the gray Cancel button. The work you've done so far will NOT be saved.
- **Save**: To save the template, click the green Save button. The template will appear in the table on the Templates list page.
Snippets
""""""""
Snippets are pre-defined content elements that you can create and reuse in your proposals over and over. Instead of designing parts of your proposal every time from scratch, you can save snippets, which you can then insert in any proposal with just a click. This saves you tons of time and effort, so you can create proposals faster. For example, you may want to include a short bio about yourself in every proposal. Create a snippet of your bio, and add it to proposals anywhere, anytime you want.
When you create a snippet, it will appear in the right sidebar in the proposal editor.
Snippets List page
^^^^^^^^^^^^^^^^^^
All existing snippets are listed in the Snippets table, on the Snippets list page. To open the Snippets list page, click the gray Snippets button that appears on the Proposals list page at the top of the Proposals table.
The Snippets list page displays a table with the following columns:
- **Name**: The name of the snippet.
- **Category**: The category the snippet belongs to.
- **Content**: A preview of the snippet content.
- **Private notes**: Any notes to yourself about the snippet (these are hidden from the client; only you can see them).
Action column - The action column has a drop-down menu with a number of options:
- **Edit Snippet**: Click to open the Proposals/ Snippets/ Edit page.
Archive Snippet/ Delete Snippet: Select the relevant action to archive or delete a snippet. Once you select Archive or Delete, the snippet will be removed from the table.
.. TIP:: You can also archive a snippet by checking the box to the left of the relevant snippet name in the table. Then click the Archive button at the top left of the Snippets table.
To select an action, hover in the action column and click to open the drop-down menu.
By default, the Snippets list page will display only active snippets in the table. To view archived or deleted snippets, you need to update the list in the labels field, situated at the top left of the Snippets table, to the right of the gray Archive button.
Click inside the labels field to open the drop-down menu. Then, select Archived and/or Deleted from the menu. The table will automatically refresh to display Archived/Deleted snippets. Archived snippets will display an orange "Archived" label and Deleted snippets will display a red "Deleted" label in the action column.
**To restore an Archived or Deleted Snippet**
First, display the snippet by updating the table to view Archived or Deleted snippets. Then, open the drop-down menu of the action column of the relevant snippet. Click Restore snippet.
New Snippet
^^^^^^^^^^^
To create a new snippet, go to the Proposals list page. Click the arrow on the gray Snippets button, which is situated at the top of the Proposals table. Select New Snippet from the drop-down menu. The Proposals/ Snippets/ Create page will open.
First, complete the fields at the top part of the page:
- **Name**: Choose a name for the snippet and enter it in the name field.
- **Category**: Choose a category for the snippet and enter it in the category field.
- **Icon**: Choose an icon for the snippet from the selection available in the icon drop-down menu.
- **Private notes**: This is an optional field. You can enter notes and comments. They are for your eyes only; all private notes remain hidden from the client.
Then, you can begin work designing the snippet on the canvas.
- **Help**: Need help designing your snippet? Click the gray Help button.
- **Cancel**: To cancel your new snippet, click the gray Cancel button. The work you've done so far will NOT be saved.
- **Save**: To save the snippet, click the green Save button. The snippet will appear in the table on the Snippets list page.
Categories
""""""""""
Arranging your snippets into categories can help you keep them organized and logical which means you'll work faster to get your proposals ready.
You can create new categories and view the Categories list page from the Snippets list page.
**To view the Categories page**
Click the gray Categories button at the top of the Snippets list page.
Categories list page
^^^^^^^^^^^^^^^^^^^^
All existing categories will appear in a table on the Categories list page.
The table includes a Name column, and an action column.
In the action column, you can edit, archive and delete categories.
New Category
^^^^^^^^^^^^
To create a new category, go to the Snippets list page. Click the arrow on the gray Categories button, which is situated at the top of the Snippets table. Select New Category from the drop-down menu. The Proposals/ Categories/ Create page will open.
To create a category, enter a name for the category. Click the green Save button.
**To Edit/ Archive/ Delete a Category**
Click on the action column of the relevant category on the Categories list page and select the action from the drop-down menu. You can also archive a category by checking the box to the left of the Name column and clicking the gray Archive button at the top left of the Categories table.
**To restore an Archived or Deleted Category**
First, display the category by updating the table to view Archived or Deleted categories. You can do this by selecting the Archived/Deleted labels in the labels field, to the right of the gray Archive button above the Categories table. Then, open the drop-down menu of the action column of the relevant category. Click Restore category.
.. TIP:: You can filter and sort data about your Proposals, Templates, Snippets and Categories on the list pages for each.
To filter data, enter keywords in the Filter field, located at the top of the list page. The data in the table will filter automatically according to your keywords.
To sort data by column, click on the column you wish to sort. A white arrow will appear in the column header. An arrow pointing down sorts the data in order from highest to lowest. Click the arrow to reverse the sort order.

View File

@ -1,129 +0,0 @@
Quotes
======
For Pro Plan users, the Quotes function streamlines your invoicing activity, from the moment you create and send a price quote for a particular job, until the quote is accepted, you invoice the job, receive payment and provide a receipt. With the Quotes function, you can automatically convert accepted quotes into invoices in a swift one-click action. Keeping track of your projected work schedule and potential income, the Quotes feature gives you even greater control of your freelance activity.
List Quotes
"""""""""""
.. Note:: The Quotes feature is only available for Pro Plan users.
As a freelancer, many jobs whether big or small will begin as a quote. How so? Well, a client expresses interest in your skills or product, but wants to know how much its going to cost, in advance. With the Quotes feature of Invoice Ninja, available to Pro Plan users only, you can easily create a price quote and send it to the client up front, helping them make the decision to commit, and helping you keep track of your projected work schedule and income.
Once the price quote is accepted by the client, the Invoice Ninja system enables automatic creation of an invoice that imports all the quote data, so your quotes and invoices are linked, organized and easily traceable. An advanced Invoice Ninja feature, Quotes is truly the cherry on top, giving you maximum functionality from A to Z in your invoicing activity.
To view your Quotes list page, click the Invoices tab on the main taskbar, and select Quotes from the drop-down menu. This will open the Quotes list page.
Overview
^^^^^^^^
The Quotes list page displays a table of all your quotes, at every stage, whether at the drafting stage, sent to the client, accepted by the client and converted to invoice, or archived/ deleted quotes. Use your Quotes list to get a better grasp of where you stand in terms of possible future projects and income.
Now, well explore all the tabs on the main header bar of the table from left to right:
.. TIP:: To sort the quotes list according to any of the columns, click on the orange column tab of your choice. A small arrow will appear. If the arrow is pointing up, data is sorted from lowest to highest value. If the arrow is pointing down, data is sorted from highest to lowest value. Click to change the arrow direction.
- **Quote #**: The number of the quote
- **Client**: The client name
- **Quote Date**: The date the quote was created
- **Quote Total**: The total amount of the quote, after adjustments for credits and partial payments
- **Valid Until**: The last date that the quote is valid and can be accepted by the client
- **Status**: The current status of the quote (Gray = Draft, Blue = Sent, Converted [clickable link to the invoice])
Action The Action button provides a range of possible actions, depending upon the status of the quote. To view the actions, hover your mouse over the Action area of the relevant quote entry and a gray Select button will appear. Click on the arrow at the right side of the button to open a drop-down list. Here are the available actions:
- **Edit Quote**: Edit the quote information on the Edit Quote page.
- **Clone Quote**: Duplicate the quote. Then you can make minor adjustments. This is a fast way to create a new quote that is identical or similar to this quote.
- **View History**: You'll be redirected to the Quotes / Quote History page, where you can view a history of all the actions taken from the time the quote was created. The Quote History page displays a copy of the latest version of the quote and a drop-down list of all actions and the corresponding version of the quote. Select the version you wish to view. Click on the blue Edit Quote button at the top right of the page to edit the quote.
- **Mark Sent**: When you have sent the quote to your customer, mark as Sent. This will update the quote status in the Quotes list, so you can keep track.
- **Convert to Invoice**: Select this action to automatically convert the quote to an invoice. You'll be redirected to the Invoices / Create page. All the quote information will be imported to the invoice. Continue working on the invoice, save or send it to the client.
- **Archive Quote**: Click here to archive the quote. It will be archived and removed from the Quotes list page.
- **Delete Quote**: Click here to delete the quote. It will be deleted and removed from the Quotes list page.
.. TIP:: For quotes with “Converted” status, there is also the option to View Invoice in the Action drop-down list. Click View Invoice to see the invoice page linked to the specific quote.
You can create a new quote directly from the Quotes list page by clicking on the blue New Quote + button located at the top right side of the page. The Quotes / Create page will open.
Filter
^^^^^^
To filter the Quotes list, enter the filter data in the Filter field, situated at the top right of the page, to the left of the blue New Quote + button. Quotes can be filtered according to the client name or quote number, or elements of these data. Lets filter the table for a client named “Best Ninja”. You can type “best ninja”, or “best” or “ninja”, or even “bes”, or “nin”, or “ja”, or any other grouping of letters in the client name. Alternatively, you can filter according to quote number. The filter function will automatically locate and present the relevant entries.
Archiving/Deleting
^^^^^^^^^^^^^^^^^^
To archive or delete a quote, hover over the quote entry row, and open the Action drop-down list. Select Archive quote or Delete quote from the list. The Quotes table will automatically refresh, and archived or deleted quotes will no longer appear in the list.
You can also archive or delete one or more quote via the gray Archive button that appears at the top left side of the Quotes list page. To archive or delete quotes, check the relevant quotes in the check boxes that appear in the far left column next to the quote number. The number of quotes selected for archiving/deleting will automatically update and show on the Archive button. Then click on the Archive button, open the drop-down list and select the desired action.
Want to view archived or deleted quotes? Check the box marked Show archived/deleted quotes, situated to the right of the Archive button. The table will automatically refresh, and will now feature the full list of quotes, including current, archived and deleted quotes. The status of the archived or deleted quote will appear in the column at the far right of the table.
- **Deleted quotes** are displayed with a red Deleted button. To restore deleted quotes, hover on the red Deleted button. A gray Select button will appear. Click on the Select arrow, and select Restore quote in the drop-down list.
- **Archived quotes** are displayed with an orange Archived button. To restore or delete the archived quote, hover on the orange Archived button. A gray Select button will appear. Click on the Select arrow, and choose Restore quote from the drop-down list. To delete an archived quote, select Delete quote from the drop-down list of the Select button.
.. TIP:: The Quotes page features clickable links to relevant pages you may wish to view. For example, all quote numbers are clickable, taking you directly to the specific quote page, and all client names are clickable, taking you directly to the specific client summary page. In addition, if a quote has been converted to an invoice, you can click “Converted” in the status column of the quote entry. This will take you directly to the invoice page for this quote.
Create Quote
""""""""""""
To create a new quote, go to the Invoices tab on the main taskbar, open the drop-down menu, and click on New Quote. This will open the Quotes / Create page.
How to Create a New Quote
When you open the Quotes / Create page, the Invoice Ninja system will automatically create a new, empty quote for you to complete. Note that the quote entry page is very similar in format to the invoice entry page. This makes converting the quote to an invoice extremely logical and simple.
The top section of the quote contains a range of important information specific to the client and the quote. Lets explore them one by one:
- **Client**: Click on the arrow at the right end of the Client field. Select the relevant client from the client list. TIP: You can create a new client while creating a new quote. Simply click on the Create new client link, situated below the Client field on the Quotes / Create page. A pop-up window will open, enabling you to complete the new clients details. Then continue creating the quote for this new client.
Alternatively, once youve selected an existing client from the drop-down client list, you can edit the client or view the client details. Click the Edit Client or View Client links situated directly below the client field. If you click Edit Client, the Edit Client pop-up box will open. If you click View Client, the client summary page will open in a new window.
- **Quote Date**: The date of creation of the quote. Click the calendar icon to select the relevant date.
- **Valid Until**: The last date that the quote is valid and can be accepted by the client. Click the calendar icon to select the relevant date.
- **Partial**: In the event that you will be billing the client for a partial amount of the quote, enter the amount in the Partial field. This will be automatically applied to the quote, and later, to the invoice.
- **Quote #**: The quote number is assigned automatically when you create a new quote, in order of chronology. You can manually override the default quote number by entering a different number in the Quote # field.
- **PO #**: The purchase order number. Enter the purchase order number for easy reference.
- **Discount**: Applying a discount to a quote is the same as applying a discount to an invoice. To learn how to apply a discount, refer to section 5.11 of the User Guide.
.. TIP:: The currency of the quote will be according to the default currency specified for this client when you created the client.
Now that weve completed the general quote information, its time to finish creating your quote by specifying the job/s youre billing for, the amounts due for each job/line item, discounts and final balance. Let's explore the various columns of the quote, from left to right along the orange header bar:
- **Item**: This is the name of the item you are quoting for. You can either enter the details manually, or by selecting one of the set items created by you at the Product Settings stage. To select a set item, click on the arrow at the right side of the item bar and choose the relevant item from the drop-down list. To enter the item manually, click inside the field and enter the item. Here are some examples of an item: 1 hour programming services OR 5 pages translation OR 1 hour consulting.
- **Description**: Add more information about the item. This will help the customer better understand the scope of the price quote, and is also useful for your own reference.
- **Unit Cost**: The amount you intend to charge per unit of items. For example, let's say your item is "1 hour consulting", and you charge $80 for an hour of consulting that is, for 1 item unit. Then you'll enter 80 in the Unit Cost field. Note: If you have selected a set item, the unit cost that you pre-defined at the Product Settings stage will apply by default. You can manually override the default unit cost by clicking in the Unit Cost field and changing the value.
- **Quantity**: The number of units included in the quote. Continuing the above example, let's say you need to quote for 3 hours of consulting, enter the number 3 in the Quantity field.
- **Line Total**: This is the amount quoted for the particular line item. Once you have entered the Unit Cost and Quantity, this figure will be calculated automatically. If you change either value at any time during creation of the quote, the Line Total will adjust accordingly.
.. TIP:: You can enter as many line items as you need in the quote. As soon as you enter any data in a line item, a fresh, blank line item will open in the row below.
Beneath and to the right of the line item section, you'll find the Total value of the quote. It's made up of a number of figures, including Subtotal, Paid to Date and Total:
- **Subtotal**: This is the amount quoted before other payments made to date are included in the quote calculation, such as Partial payments, Credits, etc.
- **Paid to Date**: The amount paid to date towards the value of the quote, including partial payments and credits.
- **Total**: The final value of the quote for the specified job(s), after partial payments and credits have been deducted from the quoted amount.
Directly to the left of the Balance Due section, you'll see a text box with three tabs to choose from:
- **Note to Client**: Want to write a personal or explanatory note to the client? Enter it here.
- **Quote Terms**: Want to set terms to the quote? Enter them here. The terms will appear on the quote. If you want to make these the default terms for all quotes, check the Save as default terms box. Then these terms will automatically appear on each quote you create. Need to change the default terms? Click Reset Terms, and the text box will clear. You can enter new terms or leave blank.
- **Quote Footer**: Want to enter information to appear as a footer on the quote? Enter it here. The text will appear at the bottom of the quote. If you want to make this the default footer for all quotes, check the Save as default footer box. Then this footer will automatically appear on each quote you create. Need to change the default footer? Click Reset footer, and the text box will clear. You can enter a new footer or leave blank.
Below the quote data fields, you'll see a row of colorful buttons, giving you a range of options:
- **Blue button Download PDF**: Download the quote as a PDF file. You can then print or save to your PC or mobile device.
- **Green button Save Quote**: Save the last version of the quote. The data is saved in your Invoice Ninja account. You can return to the quote at any time to continue working on it.
- **Orange button Email Quote**: Email the quote directly via the Invoice Ninja system to the email address specified for the client.
- **Gray button More Actions**:
Click on More Actions to open the following action list:
- **Clone Quote**: Duplicate the current quote. Then you can make minor adjustments. This is a fast way to create a new quote that is identical or similar to a previous quote.
- **View History**: You'll be redirected to the Quotes / Quote History page, where you can view a history of all the actions taken from the time the quote was created. The Quote History page displays a copy of the latest version of the quote and a drop-down list of all actions and the corresponding version of the quote. Select the version you wish to view. Click on the blue Edit Quote button at the top right of the page to go back to the quote page.
- **Mark Sent**: When you have sent the quote to your customer, mark as Sent. This will update the quote status in the Quotes list, so you can keep track.
- **Convert to Invoice**: Select this action to automatically convert the quote to an invoice. You'll be redirected to the Invoices / Create page. All the quote information will be imported to the invoice. Continue working on the invoice, save or send it to the client.
- **Archive Quote**: Want to archive the quote? Click here. The quote will be archived and removed from the Quotes list page.
- **Delete Quote**: Want to delete the quote? Click here. The quote will be deleted and removed from the Quotes list page.
.. TIP:: At the left of these colorful buttons, you'll see a field with an arrow that opens a drop-down menu. This field provides you with template options for the quote design. Click on the arrow to select the desired template. When selected, the quote preview will change to reflect the new template.

View File

@ -1,80 +0,0 @@
Recurring Invoices
==================
As a busy freelancer, you work for a variety of clients. Some jobs are one-off, but others are ongoing, whether on a weekly, monthly or other basis. Invoice Ninjas Recurring Invoice feature automatically creates invoices for ongoing jobs, and sends the current invoice to the client on a regular, pre-defined basis. For each recurring job, you only need to set up the procedure once. Heres how it works.
List Recurring Invoices
"""""""""""""""""""""""
To view the Recurring Invoices list page, go to the Invoices tab on the main sidebar and click to open the Invoices list page. To open the list page for Recurring Invoices, click the gray Recurring button located above the top right side of the invoices table.
Overview
^^^^^^^^
The recurring invoices list provides a display of all active recurring invoices.
Here is a description of the columns in the recurring invoices list table, from left to right:
- **Frequency**: How often the client is billed with this invoice, ie. Weekly, monthly, etc.
- **Client name**: The client's name
- **Start Date**: The date the recurring invoice series started
- **Last sent**: The date the last invoice was sent for this recurring invoice series
- **Amount**: The amount due
- **Private notes**: Comments and notes that you added when creating the recurring invoice. Only you can see them.
- **Status**: The status of the recurring invoice (ie. Draft, Sent, Viewed, Paid, Overdue)
- **Action**: Hover your mouse over the Action area of the relevant recurring invoice entry and a gray Select button will appear. Click on the arrow at the right side of the button to open a drop-down list. The drop-down list presents a range of possible actions for you to choose from:
- **Edit Invoice**: Edit the recurring invoice information on the Edit Invoice page.
- **Clone to Invoice**: Duplicate the recurring invoice as a new recurring invoice.
- **Clone to Quote**: Create a quote containing data duplicated from the recurring invoice.
- **Archive Recurring** Invoice: Click here to archive the recurring invoice. It will be archived and removed from the Recurring Invoices list page.
- **Delete Recurring Invoice**: Click here to delete the recurring invoice. It will be deleted and removed from the Recurring Invoices list page.
Filter
^^^^^^
To filter the Recurring Invoices list, enter the filter data in the Filter field, situated at the top right of the page, to the left of the blue New Recurring Invoice + button. Recurring invoices can be filtered according to Frequency or Client name. Enter the data or parts of the data, and the filter function will automatically locate and present the relevant entries.
Archiving/Deleting
^^^^^^^^^^^^^^^^^^
To archive or delete a recurring invoice, hover over the Action area of the recurring invoice entry row, and open the Action drop-down list. Select Archive recurring invoice or Delete recurring invoice from the list. The Recurring Invoices table will automatically refresh, and archived or deleted recurring invoices will no longer appear in the list.
You can also archive or delete one or more recurring invoice via the gray Archive button that appears at the top left side of the Recurring Invoices list page. To archive or delete recurring invoices, check the relevant recurring invoices in the check boxes that appear in the far left column next to the Frequency field. The number of recurring invoices selected for archiving/deleting will automatically update and show on the Archive button. Then click on the Archive button, open the drop-down list and select the desired action.
Want to view archived or deleted recurring invoices? Locate the field just to the right of the Archive button at the top left of the recurring invoices table. The field has a default setting of "Active", which means that the table is displaying only Active recurring invoices. Click inside the field, and a drop-down list will open. Select Archived and/or Deleted to view the desired invoices. The table will automatically refresh, and will now feature the full list of recurring invoices, including active, archived and deleted recurring invoices. The status of archived or deleted recurring invoices is displayed in the Action column.
- **Deleted recurring invoices** are displayed with a red Deleted button. To restore deleted recurring invoices, hover on the red Deleted button. A gray Select button will appear. Click on the Select arrow, and select Restore recurring invoice in the drop-down list.
- **Archived recurring invoices** are displayed with an orange Archived button. To restore or delete the archived recurring invoice, hover on the orange Archived button. A gray Select button will appear. Click on the Select arrow, and choose Restore recurring invoice from the drop-down list. To delete an archived recurring invoice, select Delete recurring invoice from the drop-down list of the Select button.
.. TIP: The Recurring Invoices page is rich in clickable links, providing you with a shortcut to relevant pages you may wish to view. For example, all client names are clickable, taking you directly to the specific client summary page. In addition, the Frequency data is clickable, and will take you to the specific Recurring invoice page where you can edit the frequency value or any other information for this recurring invoice.
Create Recurring Invoice
""""""""""""""""""""""""
When you create a recurring invoice, you are creating a pre-defined frequency for invoicing a particular job and client. The recurring invoice entry as featured in the Recurring Invoices list is not the actual invoice sent. Once an invoice of a recurring invoice series is created, it will appear as a numbered invoice in the Invoices list page.
Recurring invoices are numbered with a prefix before the invoice number. This enables you to identify and keep track of your recurring invoices with ease.
To define your recurring invoices number prefix, go to Advanced Settings > Invoice Settings. In the first box, click on the Options tab. Then, specify your prefix in the Recurring prefix field. Make sure to click the green Save button at the bottom of the page to save your prefix setting.
Now, well explore how to set up a recurring invoice.
**Lets Begin**
To create a new recurring invoice, you'll need to go to the Invoices list page. Then, click on the arrow at the right side of the gray Recurring button, located at the top right above the Invoices list table. Select New Recurring Invoice from the drop down menu.
Next, you'll need to complete the invoice details. Let's go over the fields to get a better understanding:
- **Client**: Click on the arrow at the right end of the Client field. Select the relevant client from the client list. TIP: You can create a new client while creating a new recurring invoice. Simply click on the Create new client link, situated below the Client field on the Recurring Invoices / Create page. A pop-up window will open, enabling you to complete the new clients details. Then continue creating the recurring invoice for this new client.
- **Frequency**: Select the frequency the invoice will be sent to the client. Click on the arrow at the right end of the Frequency field to open the drop-down list of frequency options.
.. TIP:: You can create dynamic date variables to include in your invoice emails. Use :MONTH, :QUARTER or :YEAR for date variables, and basic math to modify them. For example, if you enter ":YEAR+1 yearly subscription", the date will appear as the current year + one, denoting subscription for next year.
- **Start Date**: The date the recurring invoice series begins
- **End Date**: The date the recurring invoice series is due to stop
- **Due date**: The date each recurring invoice is due. This is the default date for all invoices in the recurring invoice series. For example, you may want the client to pay on the 1st of the month for each recurring invoice. If so, select "1st day of month" from the drop-down menu. TIP: You can also choose to define the due date according to the client's pre-defined terms. If so, select "Use client terms" from the drop-down menu.
- **Auto-Bill**: Select the applicable option if you want the system to bill the customer automatically at the selected frequency. To disable Auto Bill, select "Off". To enable Auto-Bill at all times, select "Always". To give your customers the option to manage their auto billing for the recurring invoice on their client portal, check the "Opt-In" or "Opt-Out" setting.
- **PO #**: Enter the purchase order number for easy reference.
- **Discount**: If you wish to apply a discount to the invoice, you can choose one of two methods: a monetary amount, or a percentage of the total amount due.
Complete the rest of the recurring invoice as you would a regular invoice. Enter the item(s), quantities and amounts that you are charging on a recurring basis.

View File

@ -1,42 +0,0 @@
Reports
=======
It's easy to get caught up in the job you are currently working on, sending invoices and chasing payments. But it's just as important to take a step back from time to time, and to look at the bigger picture of how your freelance business is doing.
The Reports function helps you do just that. You can define your parameters and extract the exact information you need to generate a range of reports.
Report Settings
"""""""""""""""
The Report Settings section enables you to set parameters and filter the data to generate the right report for you.
- **Type**: Click on the drop-down menu and choose the type of report you want to create. There's a wide range of report types to choose from, such as Invoice, Payment, Client, Quote, Expense, Profit and Loss, and more.
- **Date Range**: Click on the drop-down menu and choose the desired date range of your report. There are a number of pre-defined ranges to choose from, such as Last 7 Days, Last Month, Last Year and This Year. Or you can select a custom date range with the Start and End calendars. Click Apply to implement the custom range.
- **Group Sort**: You can sort the report results according to various parameters. Click the drop-down menu to select a sort function from the options available for the chosen report type.
.. TIP:: For some report types, there is an extra filter function that you can apply. When you select a report type that has an extra filter function, the filter field will automatically appear beneath the Group Sort field. For example, if you select Invoice report type, a field will appear below Group Sort that allows you to filter the report according to invoice status.
- **Run**: Once you've selected all the parameters, click the green Run> button. The extracted data will show in the report display section below. TIP: When you click Run>, the report will generate automatically, and includes only the relevant columns and data, based on the type of reports and dates selected. To view another report, simply change your selections and click Run>.
- **Export**: To export the report data, click the gray Export button. The report will automatically download as a .csv file. If you want to export the data as an Excel, PDF or Zip file, click the drop-down menu at the left of the Export button and choose the desired file type. Then click Export. The file will download in the format you selected.
- **Schedule**: Don't have the time or mindspace to remember to download reports? You don't have to! With the Schedule feature, you can pre-select reports to be automatically generated at a frequency of your choosing, and sent to the email address linked to your Invoice Ninja account.
To schedule receiving the defined report, click the blue Schedule button.
In the pop-up box, select the Frequency you'd like to receive the report. Options include Daily, Weekly, Biweekly or Monthly. Then select the Start Date from when you want to begin receiving the report.
After the report has been scheduled, you'll see a gray Cancel Schedule button on your Reports page. You can cancel the scheduled report at any time by clicking on the cancel button.
Calendar
""""""""
Want a calendar style visualization of your Invoice Ninja activity? Click the gray Calendar button that appears at the top right of the Reports page. You can view details of Invoices, Payments, Quotes, Projects, Tasks and Expenses on the dates they occurred on the calendar.
The calendar will include details of all transactions by default. To filter the calendar so it only displays some of your invoicing data, click inside the Filter field at the top right of the page. Select your desired filters from the drop-down menu.
The calendar is customizable so you can create your preferred view. At the top right of the calendar, there are 4 periodic views tabs to choose from: Month, Week, Day or List. Click the preferred tab and the view will change automatically.
Select today's date by clicking the Today tab at the top left of the calendar. Or click the left or right arrows to move between time periods.

View File

@ -1,279 +0,0 @@
Settings
========
Intro
"""""
Welcome to the Basic Settings section, where you can create the foundations of your Invoice Ninja account. All your company information, user details, product entries, notification preferences, tax rates, payment settings, location and currency selections, and so much more, can be found here. This is your first stop to set up and customize your account to your business. And any time you need to modify your settings, edit your details or change your preferences, this is where you'll return. We've made it simple and user friendly to manage your settings, so the Basic Settings section is a place that's fun to come back to. We promise.
To open the Basic Settings sections, click on the Settings tab, which is the last tab on the Invoice Ninja sidebar. The Basic Settings section will automatically open to the first settings page, Company Details. To move between settings pages, click on the relevant tab on the list situated at the left side of the Basic Settings page.
Company Details
"""""""""""""""
The company details page is divided into three sections: Details, Address and Email Signature. This covers all the key information about your business.
Enter the following company details in the relevant field:
Details
^^^^^^^
- **Name**: The company name
- **ID Number**: The business number or personal ID number of the business owner
- **VAT Number**: The company's VAT number (if applicable)
- **Website**: Your company web address
- **Email**: Your company email address
- **Phone**: Your company phone number
- **Logo**: Upload your company logo by clicking on the Choose File button. Browse your computer for the appropriate image file and upload it. Remember, the Invoice Ninja system supports JPEG, GIF and PNG file types. TIP: Once, you've uploaded your logo, the graphic image will appear on the page. Uploaded the wrong image? Got yourself a new logo? Click Remove logo, and upload a new one.
- **Company Size**: Select the company size from the options in the drop down list
- **Industry Select**: the industry your company belongs to from the options in the drop down list
Address
^^^^^^^
Complete the relevant address detail in each field. For the Country field, start typing the name of your country, and the autocomplete function will offer you options to select from in a drop down list. Select the relevant country. To remove the country entry, click the X at the right hand side of the field.
Email Signature
^^^^^^^^^^^^^^^
Create your unique company signature, which will appear on every email that is sent on your behalf from the Invoice Ninja system. First, enter free text in the text box. This may include your company name, address, phone number, website, email address or anything else you can think of. After you've entered the text, use the formatting toolbar to create the look you want. You can select the font, font size, font design (bold, italic, underline, strikethrough), font color, fill, numbering, bullets and alignment. You can also insert hyperlinks, which means you can create clickable links to your website or email address within your email signature.
When you've completed your Company Details, click the green Save button at the bottom of the page. You can edit these details at any time by returning to the page, changing the details and clicking Save again.
User Details
""""""""""""
As the business owner, you are the primary user of your Invoice Ninja account, so you'll need to define your user details. (Alternatively, if you are setting up the account on behalf of someone else, you'll need to have their details handy.)
Enter your first name, last name, email address and phone number in the fields provided.
One Click Log In
^^^^^^^^^^^^^^^^
If you want to login to your Invoice Ninja account without a password, you can do so via your other online accounts. By linking your Google, Facebook, GitHub or LinkedIn account to your Invoice Ninja account, you enable one-click login that truly makes life simpler.
To enable one click login, click the blue Enable button. A drop down menu will open, giving you the option to select an online account. Choose the account you want, and you'll be redirected to the third party website to link your Invoice Ninja account. Follow the prompts to complete the process.
Referral URL
^^^^^^^^^^^^
Want to join our referral program and save money? Get your friends to sign up and receive a whopping discount on your Invoice Ninja fees. To join the referral program, check the Enable box. To find out more about our referral program, go here.
Change Password
^^^^^^^^^^^^^^^
If you ever need to change your password, click on the blue Change Password button. You'll need to fill in your current password, your new password, and you'll need to confirm the password by typing it in a second time. Then click Save and your password is changed.
When you've finished completing your user details, click the green Save button to save all your information.
Localization
""""""""""""
The Localization page is the place to customize a bunch of settings that make your Invoice Ninja account feel like home.
- **Currency**: Select your default currency from the list of approximately 50 available currencies.
- **Language**: Select your default language from the list of approximately 20 available languages.
- **Timezone**: Select your time zone from the drop down menu.
- **Date Format**: Select the date format you want from a list of some 13 formatting options.
- **Date/Time Format**: Select the date/time format you want from a list of some 13 formatting options.
- **First Day of the Week**: Select the day that your business week begins. (Different cultures and countries have varied work weeks.)
- **24 Hour Time**: If you prefer to use the 24 hour clock time formatting, check the enable box.
To save your Localization settings, make sure to click the green Save button.
Online Payments
"""""""""""""""
The Online Payments page is where you go to set up and manage your payment gateways.
If you are using WePay, Stripe or Braintree, you'll need to complete the Payment Settings. (TIP: If you're not using any of these three gateways, you can skip the Payment Settings box.)
- **Token Billing**: Select your preferred option from the drop down list.
- **Disabled**: Never auto bill
- **Opt In (checkbox is shown but not selected) In the client portal**: The client has the option to check the auto billing box to securely store their credit card/bank account on file.
- **Opt Out (checkbox is shown and selected) In the client portal**: The auto bill option is selected automatically. The client can still choose to uncheck the box and disable storing their credit card/bank account.
- **Always**: Always auto bill
- **Auto Bill**: Choose the date you prefer to auto bill for the invoice: on the send date OR on the due date. Check the relevant box to make your selection.
.. TIP:: For bank transfer payments, auto billing occurs on the due date only.
To save your token billing/auto billing payment settings, click the green Save button.
Payment Gateways list
^^^^^^^^^^^^^^^^^^^^^
To view a current list of your payment gateways, scroll below the Payment Settings box. The Payment Gateways list has two columns:
- **Name**: The payment gateway name (this is a clickable link that takes you to the Payment Gateway/ Edit page)
- **Action**: You can edit or archive the payment gateway by clicking on the Select button. Choose the desired action from the drop down menu.
Add Gateway
^^^^^^^^^^^
To add a new payment gateway, click on the blue Add Gateway + button. You'll be automatically redirected to the Payment Gateways/ Create page.
.. TIP:: The Payment Gateways/ Create page is a default page for the WePay gateway. With a fantastic range of payment features, we like to give you the option to use WePay upfront. Of course, we offer more than 50 other payment gateway options. If you prefer to add one of those, scroll to the bottom of the page and click on the gray Use another provider button. You'll be redirected to the general Payment Gateways/ Create page.
Payment Gateways/ Create WePay
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Let's take a look at the default Payment Gateways/ Create screen for the WePay system.
- **First Name**: Enter your first name
- **Last Name**: Enter your last name
- **Email**: Enter your email address
- **Company Name**: Enter the company name. This will appear on the client's credit card bill.
- **Country**: Select United States or Canada
- **Billing address**: Check the preferred option
- **Require client to provide their billing address**: Show the client's address on the payment page
- **Update client's address with the provided details**: The client's address will be updated on the payment page with the details they provide
- **Accepted Credit Cards**: Check the box for the credit cards you accept
- **ACH**: To allow bank transfer payments, check the Enable ACH box
- **I agree**: Check the box to accept WePay terms and conditions. TIP: To continue using WePay, you must agree to the terms and conditions.
To sign up to WePay or to link an existing WePay account, click the green Sign Up with WePay button. Follow the prompts to complete the process.
Payment Gateways/ Create Other Payment Gateways
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
To create a new payment gateway besides WePay, scroll to the bottom of the default Payment Gateways/ Create page and click the gray Use another provider button. Complete the details in the Add Gateway box by first selecting the desired payment gateway from the list of more than 50 available options. To do this, click on the arrow in the Gateway field and a drop down list will open.
After you've finished creating a payment gateway, it will automatically appear on the Payment Gateways list on the Online Payments page.
.. TIP:: Each payment gateway has different requirements for information. When you select a payment gateway, the box will refresh with the relevant requirements. Follow the prompts and use the Help function on the payment gateway website to complete the process correctly.
Tax Rates
"""""""""
Set and apply your tax rates and preferences on the Tax Rates page.
You can create your tax settings with a few simple checkboxes. Select the relevant preference by checking the applicable boxes from the list:
- **Enable specifying an invoice tax**: Check this box to apply a tax rate to the whole invoice.
- **Enable specifying line item taxes**: Check this box to apply a tax rate for individual line items.
- **Display line item taxes inline**: Check this box to show the line item tax on the separate item line on the invoice.
- **Include line item taxes in line total**: Check this box to show the item tax included in the total cost of the line item.
- **Enable specifying a second tax rate**: Check this box if you need to apply another tax rate to the invoice.
- **Default tax rate**: Select a default tax rate from the drop down list of pre-defined tax rates.
Once you've completed your preferences, click the green Save button.
Tax Rates List
^^^^^^^^^^^^^^
Your pre-defined tax rates are displayed in the list below the Tax Settings section. Scroll down to view. The Tax Rates list has two columns:
- **Name**: The tax rate name (this is a clickable link that takes you to the Tax Rate/ Edit page)
- **Action**: You can edit or archive the tax rate by clicking on the Select button. Choose the desired action from the drop down menu.
Add Tax Rate
^^^^^^^^^^^^
To add a new tax rate, click on the blue Add Tax Rate + button. You'll be automatically redirected to the Tax Rates/ Create page.
To create a tax rate, complete the two fields:
- **Name**: Enter the name of the tax rate (Examples: VAT, NY state tax)
- **Rate**: Enter the percentage value of the tax rate
Click the green Save button to create the tax rate. It will now appear on the tax rates list.
Product Library
"""""""""""""""
Add products to your product library to make your invoice creation process faster.
Product Settings
^^^^^^^^^^^^^^^^
Set your preferences for your product library with the following options:
- **Autofill products**: Check this box to enable autofill of product description and cost when you select the product.
- **Auto-update products**: Check this box to enable automatic updating of the product library entry when you update the product in the invoice.
Product Library List
^^^^^^^^^^^^^^^^^^^^
Your pre-defined products are displayed in the list below the Product Settings section. Scroll down to view. The Product Library list has four columns:
- **Product**: The title of the product (ie. Logo design, 500 words translation, 500g cookies). This is a clickable link that takes you to the Product Library/ Edit page.
- **Description**: A description of the product
- **Unit Cost**: The cost for one unit of the product
- **Action**: You can edit or archive the product by clicking on the Select button. Choose the desired action from the drop down menu.
Add Product
^^^^^^^^^^^
To add a new product, click on the blue Add Product + button. You'll be automatically redirected to the Product Library/ Create page.
To create a product, complete the fields:
- **Product**: Enter the product title
- **Notes**: Enter the product description
- **Cost**: Enter the cost per unit
Click the green Save button to create the product. It will now appear on the product library list.
Email Notifications
"""""""""""""""""""
The Invoice Ninja system sends automated emails notifying you about the status of invoices and quotes sent to clients. Set your notification preferences on the Email Notifications page.
To create your preferences for email notifications, check any of the following options:
- Email me when an invoice is sent
- Email me when an invoice is viewed
- Email me when an invoice is paid
- Email me when a quote is approved (Pro Plan users only)
Facebook and Twitter
^^^^^^^^^^^^^^^^^^^^
Want to keep up to date with Invoice Ninja updates, features and news? Follow our feeds on Facebook and Twitter by clicking on the Follow buttons.
To save your email notification preferences, click the green Save button.
Import / Export
"""""""""""""""
If you need to import data to your Invoice Ninja account, or, alternatively, if you need to export your Invoice Ninja invoicing data, you can do both from the Import / Export page.
Import Data
^^^^^^^^^^^
To import data, select a source from the Source drop down menu. To upload a client file, invoice file or product file, click the browse button and select the relevant file from your computer. Click the orange Upload button to import the file.
.. TIP:: In addition to CSV and JSON file types, you can import files from a range of software programs, including Freshbooks, Hiveage, Invoiceable and more.
Export Data
^^^^^^^^^^^
To export data, select a source from the Source drop down menu. TIP: Export file types include CSV, XLS and JSON. Then, select the data you wish to export from the list. Click the blue Download button to export the data.
Account Management
""""""""""""""""""
Whether upgrading, downgrading or cancelling (we hope not!), manage your Invoice Ninja account via this page.
Plan Status
View your current plan level (Free, Pro or Enterprise) and Renews status here.
To change your plan status, click the orange Change Plan button.
Change Plan
^^^^^^^^^^^
To change your plan status, click the drop down menu and select your new plan (Free, Pro or Enterprise). Click the blue Change Plan button, and the change will take effect immediately. Changed your mind? Click the gray Go Back button.
Delete Account
^^^^^^^^^^^^^^
In the event that you wish to delete your account, click the red Delete Account button.
.. NOTE:: If you delete your Invoice Ninja account, all data is permanently erased. There is no undo option.
You'll be prompted to confirm the delete action, and to provide us with a reason to help us improve the Invoice Ninja experience.
If you're sure you want to delete, click the red Delete Account button.
Changed your mind? Click the gray Go Back button.

View File

@ -1,123 +0,0 @@
Tasks
=====
Got lots of tasks running at the same time? Projects to invoice? Returning to work on that particular job from last month? The Tasks feature keeps all of these details in order, so you can best manage your time, your projects and your clients needs.
List Tasks
""""""""""
The Tasks list page not only displays a summary of all your tasks, for all clients, in an easy-to-follow table format. It also tells you exactly what stage each task is at. From the moment you create a task, till you decide to archive or delete, the task will go through three stages:
- **Running**: A task that is currently in process.
- **Logged**: A task that has been completed, recorded, but not yet invoiced.
- **Invoiced**: A task that has been completed and the invoice sent to the client.
To view your Tasks list page, click the Tasks tab on the main taskbar. This will open the Tasks list page.
Overview
^^^^^^^^
The Tasks list page provides a range of opportunities to carry out actions relating to each specific task. Now, well explore the Tasks list and show you all the features and actions that make managing tasks so easy.
The Tasks list page displays a table of all your tasks, at every stage, from Running to Logged to Invoiced, together with handy accompanying information about each task.
Let's explore the tasks list according to the tabs on the main header bar of the table from left to right:
- **Client**: The client name
- **Date**: The date the task was started, followed by the time it was started
- **Duration**: The total time logged for the task
- **Description**: Information about the task that you entered when you created the task
- **Status**: The current status of the task (Blue = Running, Gray = Logged, Green = Invoiced)
- **Action**: The Action button provides a range of possible actions, depending upon the status of the task.
To view the actions, hover your mouse over the Action area of the relevant task entry and a gray Select button will appear. Click on the arrow at the right side of the button to open a drop-down list. For tasks with “Running” status, the drop-down list presents the following action items:
- **Edit Task**: Edit the task information on the Tasks/ Edit page.
- **Stop Task**: Stop the task from running. It will then change status to “Logged”.
- **Invoice Task**: Send an invoice for this task. An invoice will be automatically generated for this task, featuring all relevant information, including invoice number, client name, task duration, description, etc. You can continue creating the invoice and then Save or Send as desired.
- **Archive Task**: Click here to archive the task. It will be archived and removed from the Tasks list page.
- **Delete Task**: Click here to delete the task. It will be deleted and removed from the Tasks list page.
.. NOTE:: For tasks with “Logged” or “Invoiced” status, only the relevant and applicable options from the above list will show in the Action drop-down list. However, for tasks with “Invoiced” status, the Action drop-down list will also display “View Invoice”. Select this option to view and/or edit the invoice of the specific task on the Invoices / Edit page.
.. TIP:: To sort the tasks list according to any of the columns, click on the orange column tab of your choice. A small arrow will appear. If the arrow is pointing up, data is sorted from lowest to highest value. If the arrow is pointing down, data is sorted from highest to lowest value. Click to change the arrow direction.
You can create a new task directly from the Tasks list page by clicking on the blue New Task + button located at the top right side of the page. The Tasks / Create page will open.
Filter
^^^^^^
To filter the Tasks list, enter the filter data in the Filter field, situated at the top right of the page, to the left of the blue New Tasks + button. Tasks can be filtered according to the client name or description, or elements of these data. Lets filter the table for a client named “Best Ninja”. You can type “best ninja”, or “best” or “ninja”, or even “bes”, or “nin”, or “ja”, or any other grouping of letters in the client name. Alternatively, you can filter according to the description data. The filter function will automatically locate and present the relevant entries.
Invoice
^^^^^^^
Tasks can be invoiced directly from the Tasks list page. To invoice a task, check the relevant task in the check box that appears in the far left column next to the client name. Then click the blue Invoice button that appears at the top left of the Tasks list page. Youll be redirected to the Invoices / Create page, and the invoice will automatically include the task and client information.
.. TIP:: You can invoice more than one task to the same client in a single invoice. To invoice more than one task in the same invoice, select the desired tasks in the check boxes to the left of the client name column, and then click the Invoice button. Youll be redirected to the Invoices / Create page. All the selected tasks will be automatically included in the invoice. Each task will appear as a separate line item in the invoice.
Archiving/Deleting
^^^^^^^^^^^^^^^^^^
To archive or delete a task, hover over the task entry row, and open the Action drop-down list. Select Archive Task or Delete Task from the list. The Tasks table will automatically refresh, and archived or deleted tasks will no longer appear in the list.
You can also archive or delete one or more task via the gray Archive button that appears at the top left side of the Tasks list page, to the right of the blue Invoice button. To archive or delete tasks, check the relevant tasks in the check boxes that appear in the far left column next to the client name. The number of tasks selected for archiving/deleting will automatically update and show on the Archive button. Then click on the Archive button, open the drop-down list and select the desired action.
Want to view archived or deleted tasks? Check the box marked Show archived/deleted tasks, situated to the right of the Archive button. The table will automatically refresh, and will now feature the full list of tasks, including current, archived and deleted tasks. The status of archived and deleted tasks will be displayed in the Action column at the far right of the table.
- Deleted tasks are displayed with a red Deleted button. To restore deleted tasks, hover on the red Deleted button. A gray Select button will appear. Click on the Select arrow, and select Restore task in the drop-down list.
- Archived tasks are displayed with an orange Archived button. To restore or delete the archived task, hover on the orange Archived button. A gray Select button will appear. Click on the Select arrow, and choose Restore task from the drop-down list. To delete an archived task, select Delete task from the drop-down list of the Select button.
.. TIP:: The Tasks page provides clickable links to take you directly to a particular client summary page, or a particular task page. To visit the client summary page, click on the client name in the Client column. To visit the Tasks / Edit page of a particular task, click on the date/time data in the Date field.
Create Task
"""""""""""
With many clients, and any number of projects ongoing at the same time, you need a simple, automatic way to keep track of the time spent on a particular task or project. Of course, this is really important when you charge clients according to time spent, such as by the hour. Yet, it can also be helpful to know just how much time you are devoting to a client or a project even if the time spent doesnt necessarily affect your billing.
Either way, the Tasks component of Invoice Ninja allows you to record and manage your tasks and sessions for every one of your clients.
**Lets Begin**
To create a new task, go to the main taskbar and click the Tasks tab. Then, select New Task from the drop-down menu. The Tasks / Create page will open.
.. NOTE:: Before creating a new task, it is vital to ensure that the correct time zone is set. To set the time zone, go to the Settings button on the right side of the main taskbar. Click to open the drop-down menu. Select Localization. The Localization window will open. Here you can choose your time zone, enable 24 hour time, and select your preferred Time/Date Format.
Now that youve set the correct time zone, you can begin creating a new task.
On the Tasks / Create page, begin by selecting the client name from the drop-down list that opens when you click on the arrow at the right side of the Client field. Then, in the Description box, enter any information you want to describe the task at hand. For example, you might enter “Designing company logo”, or “Consulting conference call”. This will make it easier to identify and manage each task.
There are two ways to record sessions spent on a task: Timer and Manual.
Timer
^^^^^
This is an automatic timer feature that allows you to record working sessions in real time. To begin the timer, press Start. Then get to work. The timer will run until you select Stop.
When you select Stop, youll be automatically redirected to the Tasks / Edit page for this created task. Here you can view a summary of the task, including Date, Time and total Duration.
Manual
^^^^^^
The other way you can create a task is by manual entry of the session details. When you check Manual, two separate fields - Start Time and End Time - will automatically open below. Here, you can record the time spent on a task session, no matter when you completed it. Whether last week, yesterday or just now, simply enter the relevant date and time.
.. TIP:: The Set to Now link, situated at the right side of the time fields, gives you the fast option of selecting todays date and the time right now. Then you can easily edit and make minor adjustments to record the correct times.
With Manual entry, you can enter multiple sessions for the same task. When you finish entering a start and end time in one row, a new row will automatically open, giving you the option to enter another session.
If you want to delete a particular session, hover your mouse over the time duration of the session you wish to delete. A small red cancel icon will appear. Click on the icon to delete the entry.
Want to save the task information and move on to something else? Click Save. The task information will be saved, and youll be automatically redirected to the Tasks / Edit page for this created task. Here you can view a summary of the task, including Date, Time and total Duration.
.. TIP:: With Manual entry, the dates and times you enter must be logical with no overlaps. If youve entered sessions that cannot exist simultaneously for the task, the relevant time fields will be highlighted in red, and youll be instructed to fix the incorrect times before leaving the page.
Edit a Task
^^^^^^^^^^^
Whether Timer or Manual, once youve saved or stopped a task session, youll be automatically redirected to the Tasks / Edit page. To edit the task, click the blue Edit Details button situated just below the task information. This will open a list of all sessions for this task accrued so far, both Timer-based and Manual sessions. Now you can manually edit them. If you wish to add a session manually, enter the start and end times in the new row below the list of existing sessions.
The Tasks / Edit page gives you a few options to choose from:
1. Want to continue working with the timer? To use the Timer function, click Resume, and the timer will begin again. Continue working. When you finish, click Stop. You can resume working as many times as you like for the particular task. When the task is complete, all the time spent will be recorded as one session.
2. Want to save the task information and move on to something else? Click Save. The page will refresh and the task information is saved.
3. Want to invoice the task and get paid? Click More Actions, and select Invoice Task from the list. The task information will be imported directly into a new invoice. Now, you can add your rate, and any other information needed to complete the invoice.
4. Want to archive or delete the task? The task or project no longer relevant? Click More Actions and select Archive Task or Delete Task from the list. After making your selection, youll be automatically redirected to the Tasks list page. If you archived the task, it will appear on the list in a lighter gray font. If you deleted the task, it will appear on the list with a strikethrough.
5. Began a task but want to cancel it? Simply click Cancel.

View File

@ -1,36 +0,0 @@
Templates & Reminders
=====================
There are a few different emails your customers receive from you via the Invoice Ninja system as part of your invoicing communications. These include the invoice notification email, quote notification email, payment notification email and various reminder emails. You can customize all your emails by selecting a template, text and design, and by specifying the frequency of reminder emails.
Email Templates
"""""""""""""""
You can create separate templates for invoice emails, quote emails and payment emails. To do so, click the relevant tab. The settings you choose will apply for that specific email.
- **Subject**: Customize the subject line of your invoice/quote/payment emails by entering the desired text. You can also enter variables according to your preference, such as invoice number, company name, due date and many more. Click the question mark icon at the right side of the Subject field to view a list of available variables. To reset your entry, click the Reset link just above the question mark icon.
- **Body**: Customize the email body text by entering the desired text. You can also enter variables according to your preference. Click the question mark icon at the right side of the Subject field to view a list of available variables. To reset your entry, click the Reset link just above the right hand side of the body text box.
- **Toolbar**: Immediately below the body text box, there is a bar featuring all the formatting tools you need to customize your invoice email, including font style, font size, bold/italics/underline, strikethrough, font color, background color, numbering, bulleting, alignment and hyperlinks.
- **Raw**: You can customize your invoice/quote/payment emails via raw HTML. Click the gray Raw button at the bottom right of the section. A window will open. Enter your HTML code. When you're done, click Update.
- **Preview**: Want to view the email exactly as your client will see it? Preview your invoice/quote/payment email in a separate window at any time by clicking the blue Preview button.
.. TIP: Any changes you make to your email settings will instantly appear in the preview at the right hand side of the page. See how your email template will look as you are creating it, so you can get it just right.
Reminder Emails
"""""""""""""""
Sometimes, your clients need a friendly reminder about their outstanding payments. Invoice Ninja enables up to 3 reminder emails, and you can totally customize the email content and delivery schedule according to your preference.
You can create separate templates for the first, second and third reminder emails. To do so, click the relevant tab. The settings you choose will apply for that specific reminder email.
- **Schedule**: Define the schedule for the reminder email by selecting values for the three schedule boxes: the number of days after/ days before the due date/ invoice date. The reminder will be sent according to the values you select in these three fields.
- **Send Email**: If you want the reminder email to be sent automatically according to your defined schedule, check the Enable box. If you do not check Enable, no reminder email will be sent.
- **Late Fee Amount**: Specify a late fee amount to add to the invoice for overdue payments. You can add a different amount for each reminder email (i.e. you may want to increase the late fee with each late reminder email.)
- **Late Fee Percent**: Specify the late fee as a percentage of the invoice amount.
- **Subject**: Customize the subject line of your reminder email by entering the desired text. You can also enter variables according to your preference, such as invoice number, company name, due date and many more. Click the question mark icon at the right side of the Subject field to view a list of available variables. To reset your entry, click the Reset link just above the question mark icon.
- **Body**: Customize the email body text by entering the desired text. You can also enter variables according to your preference. Click the question mark icon at the right side of the Subject field to view a list of available variables. To reset your entry, click the Reset link just above the right hand side of the body text box.
- **Toolbar**: Immediately below the body text box, there is a bar featuring all the formatting tools you need to customize your reminder email, including font style, font size, bold/italics/underline, strikethrough, font color, background color, numbering, bulleting, alignment and hyperlinks.
- **Raw**: You can customize your reminder email via raw HTML. Click the gray Raw button at the bottom right of the section. A window will open. Enter your HTML code. When you're done, click Update.
- **Preview**: Want to view the reminder email exactly as your client will see it? Preview your reminder email in a separate window at any time by clicking the blue Preview button.
.. TIP:: Any changes you make to your reminder email settings will instantly appear in the preview at the right hand side of the page. See how your reminder email template will look as you are creating it, so you can get it just right.

View File

@ -1,56 +0,0 @@
Tickets
=======
The Invoice Ninja ticketing system will allow you to manage your client and your internal staff communications where ever you are.
.. raw:: html
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; height: auto;">
<iframe src="https://www.youtube.com/embed/E254iuSdPKA" frameborder="0" allowfullscreen style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"></iframe>
</div>
Tickets Listing Page
""""""""""""""""""""
The ticket listing page displays all of your tickets, who they are from and who they are delegated to. A smart icon system allows you to easily understand the status of each ticket and any actions required.
Lets take you through each column of the ticket listing page:
- **Ticket Number**: The is a unique incrementing integer value which is used to track tickets. You can see where you want your counter to start by editing the counter value in Settings > Tickets > Defaults
- **Client Name**: The name (and link to) the client.
- **Contact**: The contact who has opened the ticket or is assigned to the ticket.
- **Subject**: The subject of the ticket.
- **Status**: The status of the ticket - see Ticket Lifecycle for more information on the different statuses available.
- **Due Date**: The date that the ticket is due for resolution (marked as closed).
- **Icons**: An array of icons which provide easily accessible information such as whether the ticket is assigned, internal, awaiting reply or overdue.
You can filter the list by selecting from the filter drop the drop down filtering is available on the ticket state and/or status.
Ticket Lifecycle
""""""""""""""""
The ticket lifecycle is tracked by its status, these are:
- **New**: New Ticket, which has not been responded to.
- **Open**: Ticket which is in progress and has at least one reply from an agent.
- **Merged**: Ticket which has been closed and merged into another ticket.
- **Closed**: Ticket which has been finalised.
There are three main view angles when considering tickets:
- **1. Admin View**:
- **2. Agent View**:
- **3. Client View**:
Admin View
^^^^^^^^^^
The admin view displays all ticket listings and to whom the are delegated. New tickets can be created / assigned / managed by administrators.
The Invoice Ninja ticket system has the concept of a 'Ticket Master' This is a super-admin user who has total oversight of the ticketing system and is also the primary point of contact for internal and external users.
By default the company owner will be assigned as the Ticket Master, however the Ticket Master can be set to any user in the system by toggling the Ticket Master in the settings.

View File

@ -1,60 +0,0 @@
Update
======
.. NOTE:: We recommend backing up your database with mysqldump before updating the app.
To update the app you just need to copy over the latest code. The app tracks the current version in a file called version.txt, if it notices a change it loads ``/update`` to run the database migrations.
https://download.invoiceninja.com
If you have trouble updating you can manually load /update to check for errors.
.. TIP:: We recommend using this `shell script <https://pastebin.com/j657uv9A>`_ to automate the update process, run it as a daily cron to automatically keep your app up to date.
If you're moving servers make sure to copy over the .env file and the custom company logo(s) located in the public/logo directory. For attachments make sure you do not forget to copy the storage/documents directory.
You can manually run the update with the following commands. Once completed add ``?clear_cache=true`` to the end of the URL to clear the application cache.
.. code-block:: shell
composer dump-autoload --optimize
php artisan optimize --force
php artisan migrate
php artisan db:seed --class=UpdateSeeder
A common error with shared hosting is "open_basedir restriction in effect", if you see this you'll need to either temporarily modify your open_basedir settings or run the update from the command line.
.. NOTE:: If you've downloaded the code from GitHub you also need to run ``composer install``
.. TIP:: You can see the detailed changes for each release on our `GitHub release notes <https://github.com/invoiceninja/invoiceninja/releases>`_.
Version 4.3
"""""""""""
You may need to manually delete ``bootstrap/cache/compiled.php``.
Version 4.0
"""""""""""
The minimum PHP version is now 7.0.0
If you're using a rijndael cipher run ``php artisan ninja:update-key --legacy=true`` to change to AES-256-CBC.
Version 3.2
"""""""""""
An import folder has been adding to storage/, you may need to run ``sudo chown -R www-data:www-data storage``
Version 2.5
"""""""""""
The minimum PHP version is now 5.5.9
Version 2.0
"""""""""""
Copy .env.example to .env and set config settings
If unset, set the app cipher to ``rijndael-256``.
Check that ``/path/to/ninja/storage`` has 755 permissions and is owned by the webserver user

Some files were not shown because too many files have changed in this diff Show More