Merge branch 'master' of github.com:hillelcoren/invoice-ninja into laravel-5

This commit is contained in:
Jeramy Simpson 2015-03-24 09:55:21 +10:00
commit 37921e4653
19 changed files with 277 additions and 171 deletions

View File

@ -264,6 +264,8 @@ class AccountController extends \BaseController
$account->quote_number_prefix = Input::get('quote_number_prefix'); $account->quote_number_prefix = Input::get('quote_number_prefix');
$account->share_counter = Input::get('share_counter') ? true : false; $account->share_counter = Input::get('share_counter') ? true : false;
$account->pdf_email_attachment = Input::get('pdf_email_attachment') ? true : false;
if (!$account->share_counter) { if (!$account->share_counter) {
$account->quote_number_counter = Input::get('quote_number_counter'); $account->quote_number_counter = Input::get('quote_number_counter');
} }

View File

@ -398,6 +398,10 @@ class InvoiceController extends \BaseController
Utils::trackViewed($client->getDisplayName(), ENTITY_CLIENT, $url); Utils::trackViewed($client->getDisplayName(), ENTITY_CLIENT, $url);
} }
if (!empty(Input::get('pdfupload')) && strpos(Input::get('pdfupload'), 'data:application/pdf;base64,') === 0) {
$this->storePDF(Input::get('pdfupload'), $input->invoice->public_id);
}
if ($action == 'clone') { if ($action == 'clone') {
return $this->cloneInvoice($publicId); return $this->cloneInvoice($publicId);
} elseif ($action == 'convert') { } elseif ($action == 'convert') {
@ -540,4 +544,18 @@ class InvoiceController extends \BaseController
return View::make('invoices.history', $data); return View::make('invoices.history', $data);
} }
private function storePDF($encodedString, $public_id)
{
$uploadsDir = storage_path().'/pdfcache/';
$encodedString = str_replace('data:application/pdf;base64,', '', $encodedString);
$name = 'cache-'.$public_id.'.pdf';
if (file_put_contents($uploadsDir.$name, base64_decode($encodedString)) !== false) {
$finfo = new finfo(FILEINFO_MIME);
if ($finfo->file($uploadsDir.$name) !== 'application/pdf; charset=binary') {
unlink($uploadsDir.$name);
}
}
}
} }

View File

@ -93,7 +93,8 @@ class Invoice extends EntityModel
'custom_value1', 'custom_value1',
'custom_value2', 'custom_value2',
'custom_taxes1', 'custom_taxes1',
'custom_taxes2', ]); 'custom_taxes2',
]);
$this->client->setVisible([ $this->client->setVisible([
'name', 'name',
@ -110,7 +111,8 @@ class Invoice extends EntityModel
'country', 'country',
'currency_id', 'currency_id',
'custom_value1', 'custom_value1',
'custom_value2', ]); 'custom_value2',
]);
$this->account->setVisible([ $this->account->setVisible([
'name', 'name',
@ -136,7 +138,9 @@ class Invoice extends EntityModel
'hide_quantity', 'hide_quantity',
'hide_paid_to_date', 'hide_paid_to_date',
'custom_invoice_label1', 'custom_invoice_label1',
'custom_invoice_label2', ]); 'custom_invoice_label2',
'pdf_email_attachment',
]);
foreach ($this->invoice_items as $invoiceItem) { foreach ($this->invoice_items as $invoiceItem) {
$invoiceItem->setVisible([ $invoiceItem->setVisible([
@ -145,7 +149,8 @@ class Invoice extends EntityModel
'cost', 'cost',
'qty', 'qty',
'tax_name', 'tax_name',
'tax_rate', ]); 'tax_rate',
]);
} }
foreach ($this->client->contacts as $contact) { foreach ($this->client->contacts as $contact) {
@ -153,7 +158,8 @@ class Invoice extends EntityModel
'first_name', 'first_name',
'last_name', 'last_name',
'email', 'email',
'phone', ]); 'phone',
]);
} }
return $this; return $this;

View File

@ -43,6 +43,7 @@ class ContactMailer extends Mailer
$data['body'] = str_replace(array_keys($variables), array_values($variables), $emailTemplate); $data['body'] = str_replace(array_keys($variables), array_values($variables), $emailTemplate);
$data['link'] = $invitation->getLink(); $data['link'] = $invitation->getLink();
$data['entityType'] = $entityType; $data['entityType'] = $entityType;
$data['id'] = $invoice->getAttributes()['id'];
$fromEmail = $invitation->user->email; $fromEmail = $invitation->user->email;
$this->sendTo($invitation->contact->email, $fromEmail, $accountName, $subject, $view, $data); $this->sendTo($invitation->contact->email, $fromEmail, $accountName, $subject, $view, $data);

View File

@ -2,6 +2,7 @@
use Mail; use Mail;
use Utils; use Utils;
use Invoice;
class Mailer class Mailer
{ {
@ -12,7 +13,7 @@ class Mailer
'emails.'.$view.'_text', 'emails.'.$view.'_text',
]; ];
Mail::send($views, $data, function ($message) use ($toEmail, $fromEmail, $fromName, $subject) { Mail::send($views, $data, function ($message) use ($toEmail, $fromEmail, $fromName, $subject, $data) {
$replyEmail = $fromEmail; $replyEmail = $fromEmail;
// http://stackoverflow.com/questions/2421234/gmail-appearing-to-ignore-reply-to // http://stackoverflow.com/questions/2421234/gmail-appearing-to-ignore-reply-to
@ -20,6 +21,20 @@ class Mailer
$fromEmail = NINJA_FROM_EMAIL; $fromEmail = NINJA_FROM_EMAIL;
} }
if(isset($data['id'])) {
$invoice = Invoice::find($data['id']);
$invoice->load('account');
$accountAttributes = $invoice->account()->getParent()->getRelations()['account']->getAttributes();
$pdfPath = storage_path().'/pdfcache/cache-'.$invoice->getAttributes()['public_id'].'.pdf';
if($accountAttributes['pdf_email_attachment'] === 1 && file_exists($pdfPath)) {
$message->attach(
$pdfPath,
array('as' => $accountAttributes['name'].'_'.$accountAttributes['invoice_number_prefix'].$invoice->getName().'.pdf', 'mime' => 'application/pdf')
);
}
}
//$message->setEncoder(\Swift_Encoding::get8BitEncoding()); //$message->setEncoder(\Swift_Encoding::get8BitEncoding());
$message->to($toEmail)->from($fromEmail, $fromName)->replyTo($replyEmail, $fromName)->subject($subject); $message->to($toEmail)->from($fromEmail, $fromName)->replyTo($replyEmail, $fromName)->subject($subject);
}); });

View File

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

View File

@ -11,7 +11,7 @@ If you'd like to use our code to sell your own invoicing app we have an affiliat
Most online invoicing sites are expensive. They shouldn't be. The aim of this project is to provide a free, open-source alternative. Additionally, the hope is the codebase will serve as a sample site for Laravel as well as other JavaScript technologies. Most online invoicing sites are expensive. They shouldn't be. The aim of this project is to provide a free, open-source alternative. Additionally, the hope is the codebase will serve as a sample site for Laravel as well as other JavaScript technologies.
To setup the site you can either use this [zip file](http://www.invoiceninja.com/knowledgebase/self-host/) (easier to setup) or checkout the code from GitHub following the instructions below (easier to stay up to date). To setup the site you can either use this [zip file](https://www.invoiceninja.com/knowledgebase/self-host/) (easier to setup) or checkout the code from GitHub following the instructions below (easier to stay up to date).
For a WAMP/MAMP/LAMP setup you can one-click install using Softaculous's [AMPPS](http://www.ampps.com/). To deploy the app with [Docker](http://www.docker.com/) you can use [this project](https://github.com/rollbrettler/Dockerfiles/tree/master/invoice-ninja). For a WAMP/MAMP/LAMP setup you can one-click install using Softaculous's [AMPPS](http://www.ampps.com/). To deploy the app with [Docker](http://www.docker.com/) you can use [this project](https://github.com/rollbrettler/Dockerfiles/tree/master/invoice-ninja).
@ -39,9 +39,9 @@ Developed by [@hillelcoren](https://twitter.com/hillelcoren) | Designed by [kant
### Documentation ### Documentation
* [Self Host](http://www.invoiceninja.com/knowledgebase/self-host/) * [Self Host](https://www.invoiceninja.com/knowledgebase/self-host/)
* [API Documentation](http://www.invoiceninja.com/knowledgebase/api-documentation/) * [API Documentation](https://www.invoiceninja.com/knowledgebase/api-documentation/)
* [Developer Guide](http://www.invoiceninja.com/knowledgebase/developer-guide/) * [Developer Guide](https://www.invoiceninja.com/knowledgebase/developer-guide/)
### Steps to setup from GitHub ### Steps to setup from GitHub

View File

@ -208,6 +208,8 @@ return array(
'import_to' => 'Importer til', 'import_to' => 'Importer til',
'client_will_create' => 'Klient vil blive oprettet', 'client_will_create' => 'Klient vil blive oprettet',
'clients_will_create' => 'Klienter vil blive oprettet', 'clients_will_create' => 'Klienter vil blive oprettet',
'email_settings' => 'Email Settings',
'pdf_email_attachment' => 'Attach PDF to Emails',
// application messages // application messages
'created_client' => 'Klient oprettet succesfuldt', 'created_client' => 'Klient oprettet succesfuldt',

View File

@ -205,6 +205,8 @@ return array(
'import_to' => 'Importieren nach', 'import_to' => 'Importieren nach',
'client_will_create' => 'Kunde wird erstellt', 'client_will_create' => 'Kunde wird erstellt',
'clients_will_create' => 'Kunden werden erstellt', 'clients_will_create' => 'Kunden werden erstellt',
'email_settings' => 'E-Mail Einstellungen',
'pdf_email_attachment' => 'PDF an E-Mails anhängen',
// application messages // application messages
'created_client' => 'Kunde erfolgreich angelegt', 'created_client' => 'Kunde erfolgreich angelegt',

View File

@ -206,6 +206,8 @@ return array(
'import_to' => 'Import to', 'import_to' => 'Import to',
'client_will_create' => 'client will be created', 'client_will_create' => 'client will be created',
'clients_will_create' => 'clients will be created', 'clients_will_create' => 'clients will be created',
'email_settings' => 'Email Settings',
'pdf_email_attachment' => 'Attach PDF to Emails',
// application messages // application messages
'created_client' => 'Successfully created client', 'created_client' => 'Successfully created client',

View File

@ -205,6 +205,8 @@ return array(
'import_to' => 'Importar a', 'import_to' => 'Importar a',
'client_will_create' => 'cliente se creará', //What is this for, context of it's use 'client_will_create' => 'cliente se creará', //What is this for, context of it's use
'clients_will_create' => 'clientes se crearan', //What is this for, context of it's use 'clients_will_create' => 'clientes se crearan', //What is this for, context of it's use
'email_settings' => 'Email Settings',
'pdf_email_attachment' => 'Attach PDF to Emails',
// application messages // application messages
'created_client' => 'cliente creado con éxito', 'created_client' => 'cliente creado con éxito',

View File

@ -206,6 +206,8 @@ return array(
'import_to' => 'Importer en tant que', 'import_to' => 'Importer en tant que',
'client_will_create' => 'client sera créé', 'client_will_create' => 'client sera créé',
'clients_will_create' => 'clients seront créés', 'clients_will_create' => 'clients seront créés',
'email_settings' => 'Email Settings',
'pdf_email_attachment' => 'Attach PDF to Emails',
// application messages // application messages
'created_client' => 'Client créé avec succès', 'created_client' => 'Client créé avec succès',

View File

@ -206,6 +206,8 @@ return array(
'import_to' => 'Importa in', 'import_to' => 'Importa in',
'client_will_create' => 'il cliente sarà creato', 'client_will_create' => 'il cliente sarà creato',
'clients_will_create' => 'i clienti saranno creati', 'clients_will_create' => 'i clienti saranno creati',
'email_settings' => 'Email Settings',
'pdf_email_attachment' => 'Attach PDF to Emails',
// application messages // application messages
'created_client' => 'Cliente creato con successo', 'created_client' => 'Cliente creato con successo',

View File

@ -206,6 +206,8 @@ return array(
'import_to' => 'Import to', 'import_to' => 'Import to',
'client_will_create' => 'client will be created', 'client_will_create' => 'client will be created',
'clients_will_create' => 'clients will be created', 'clients_will_create' => 'clients will be created',
'email_settings' => 'Email Settings',
'pdf_email_attachment' => 'Attach PDF to Emails',
// application messages // application messages
'created_client' => 'Successfully created client', 'created_client' => 'Successfully created client',

View File

@ -206,6 +206,8 @@ return array(
'import_to' => 'Importer til', 'import_to' => 'Importer til',
'client_will_create' => 'Klient vil bli opprettet', 'client_will_create' => 'Klient vil bli opprettet',
'clients_will_create' => 'Klienter vil bli opprettet', 'clients_will_create' => 'Klienter vil bli opprettet',
'email_settings' => 'Email Settings',
'pdf_email_attachment' => 'Attach PDF to Emails',
// application messages // application messages
'created_client' => 'Klient opprettet suksessfullt', 'created_client' => 'Klient opprettet suksessfullt',

View File

@ -205,6 +205,8 @@ return array(
'import_to' => 'Importeer naar', 'import_to' => 'Importeer naar',
'client_will_create' => 'klant zal aangemaakt worden', 'client_will_create' => 'klant zal aangemaakt worden',
'clients_will_create' => 'klanten zullen aangemaakt worden', 'clients_will_create' => 'klanten zullen aangemaakt worden',
'email_settings' => 'Email Settings',
'pdf_email_attachment' => 'Attach PDF to Emails',
// application messages // application messages
'created_client' => 'Klant succesvol aangemaakt', 'created_client' => 'Klant succesvol aangemaakt',
@ -307,18 +309,18 @@ return array(
'close' => 'Sluiten', 'close' => 'Sluiten',
'pro_plan_product' => 'Pro Plan', 'pro_plan_product' => 'Pro Plan',
'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.', 'pro_plan_description' => 'Één jaar abbonnement op het Invoice Ninja Pro Plan.',
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.', 'pro_plan_success' => 'Bedankt voor het aanmelden! Zodra je factuur betaald is zal je Pro Plan lidmaatschap beginnen.',
'unsaved_changes' => 'You have unsaved changes', 'unsaved_changes' => 'Je hebt niet bewaarde wijzigingen',
'custom_fields' => 'Custom fields', 'custom_fields' => 'Custom fields',
'company_fields' => 'Company Fields', 'company_fields' => 'Company Fields',
'client_fields' => 'Client Fields', 'client_fields' => 'Client Fields',
'field_label' => 'Field Label', 'field_label' => 'Field Label',
'field_value' => 'Field Value', 'field_value' => 'Field Value',
'edit' => 'Edit', 'edit' => 'Bewerk',
'view_invoice' => 'View invoice', 'view_invoice' => 'Bekijk factuur',
'view_as_recipient' => 'View as recipient', 'view_as_recipient' => 'Bekijk als ontvanger',
// product management // product management
'product_library' => 'Product Library', 'product_library' => 'Product Library',
@ -336,105 +338,105 @@ return array(
'archived_product' => 'Successfully archived product', 'archived_product' => 'Successfully archived product',
'pro_plan_custom_fields' => ':link to enable custom fields by joining the Pro Plan', 'pro_plan_custom_fields' => ':link to enable custom fields by joining the Pro Plan',
'advanced_settings' => 'Advanced Settings', 'advanced_settings' => 'Geavanceerde instellingen',
'pro_plan_advanced_settings' => ':link to enable the advanced settings by joining the Pro Plan', 'pro_plan_advanced_settings' => ':link to enable the advanced settings by joining the Pro Plan',
'invoice_design' => 'Invoice Design', 'invoice_design' => 'Factuur ontwerp',
'specify_colors' => 'Specify colors', 'specify_colors' => 'Kies kleuren',
'specify_colors_label' => 'Select the colors used in the invoice', 'specify_colors_label' => 'Kies de kleuren die in de factuur gebruikt worden',
'chart_builder' => 'Chart Builder', 'chart_builder' => 'Chart Builder',
'ninja_email_footer' => 'Use :site to invoice your clients and get paid online for free!', 'ninja_email_footer' => 'Gebruik :site om uw klanten gratis te factureren en betalingen te ontvangen!',
'go_pro' => 'Go Pro', 'go_pro' => 'Go Pro',
// Quotes // Quotes
'quote' => 'Quote', 'quote' => 'Offerte',
'quotes' => 'Quotes', 'quotes' => 'Offertes',
'quote_number' => 'Quote Number', 'quote_number' => 'Offerte Number',
'quote_number_short' => 'Quote #', 'quote_number_short' => 'Offerte #',
'quote_date' => 'Quote Date', 'quote_date' => 'Offerte Datum',
'quote_total' => 'Quote Total', 'quote_total' => 'Offerte Totaal',
'your_quote' => 'Your Quote', 'your_quote' => 'Uw Offerte',
'total' => 'Total', 'total' => 'Totaal',
'clone' => 'Clone', 'clone' => 'Kloon',
'new_quote' => 'New Quote', 'new_quote' => 'Nieuwe Offerte',
'create_quote' => 'Create Quote', 'create_quote' => 'Maak offerte aan',
'edit_quote' => 'Edit Quote', 'edit_quote' => 'Bewerk Offecte',
'archive_quote' => 'Archive Quote', 'archive_quote' => 'Archiveer Offerte',
'delete_quote' => 'Delete Quote', 'delete_quote' => 'Verwijder Offerte',
'save_quote' => 'Save Quote', 'save_quote' => 'Bewaar Offerte',
'email_quote' => 'Email Quote', 'email_quote' => 'Email Offerte',
'clone_quote' => 'Clone Quote', 'clone_quote' => 'Kloon Offerte',
'convert_to_invoice' => 'Convert to Invoice', 'convert_to_invoice' => 'Zet om naar Factuur',
'view_invoice' => 'View Invoice', 'view_invoice' => 'Bekijk Factuur',
'view_quote' => 'View Quote', 'view_quote' => 'Bekijk Offerte',
'view_client' => 'View Client', 'view_client' => 'Bekijk Klant',
'updated_quote' => 'Successfully updated quote', 'updated_quote' => 'Offerte succesvol bijgewerkt',
'created_quote' => 'Successfully created quote', 'created_quote' => 'Offerte succesvol aangemaakt',
'cloned_quote' => 'Successfully cloned quote', 'cloned_quote' => 'Offerte succesvol gekopieerd',
'emailed_quote' => 'Successfully emailed quote', 'emailed_quote' => 'Offerte succesvol gemaild',
'archived_quote' => 'Successfully archived quote', 'archived_quote' => 'Offerte succesvol gearchiveerd',
'archived_quotes' => 'Successfully archived :count quotes', 'archived_quotes' => ':count offertes succesvol gearchiveerd',
'deleted_quote' => 'Successfully deleted quote', 'deleted_quote' => 'Offerte succesvol verwijderd',
'deleted_quotes' => 'Successfully deleted :count quotes', 'deleted_quotes' => ':count offertes succesvol verwijderd',
'converted_to_invoice' => 'Successfully converted quote to invoice', 'converted_to_invoice' => 'Offerte succesvol omgezet naar factuur',
'quote_subject' => 'New quote from :account', 'quote_subject' => 'Nieuwe offerte van :account',
'quote_message' => 'To view your quote for :amount, click the link below.', 'quote_message' => 'Om uw offerte voor :amount te bekijken, klik op de link hieronder.',
'quote_link_message' => 'To view your client quote click the link below:', 'quote_link_message' => 'Klik op de link hieronder om de offerte te bekijken:',
'notification_quote_sent_subject' => 'Quote :invoice was sent to :client', 'notification_quote_sent_subject' => 'Offerte :invoice is verstuurd naar :client',
'notification_quote_viewed_subject' => 'Quote :invoice was viewed by :client', 'notification_quote_viewed_subject' => 'Offerte :invoice is bekeken door :client',
'notification_quote_sent' => 'The following client :client was emailed Quote :invoice for :amount.', 'notification_quote_sent' => 'Klant :client heeft offerte :invoice voor :amount per email ontvangen.',
'notification_quote_viewed' => 'The following client :client viewed Quote :invoice for :amount.', 'notification_quote_viewed' => 'Klant :client heeft offerte :invoice voor :amount bekeken.',
'session_expired' => 'Your session has expired.', 'session_expired' => 'Uw sessie is verlopen.',
'invoice_fields' => 'Invoice Fields', 'invoice_fields' => 'Factuur Velden',
'invoice_options' => 'Invoice Options', 'invoice_options' => 'Factuur Opties',
'hide_quantity' => 'Hide quantity', 'hide_quantity' => 'Verberg aantallen',
'hide_quantity_help' => 'If your line items quantities are always 1, then you can declutter invoices by no longer displaying this field.', 'hide_quantity_help' => 'Als us artikel-aantallen altijd 1 zijn, kunt u uw facturen er netter uit laten zien door dit veld te verbergen.',
'hide_paid_to_date' => 'Hide paid to date', 'hide_paid_to_date' => 'Hide paid to date',
'hide_paid_to_date_help' => 'Only display the "Paid to Date" area on your invoices once a payment has been received.', 'hide_paid_to_date_help' => 'Only display the "Paid to Date" area on your invoices once a payment has been received.',
'charge_taxes' => 'Charge taxes', 'charge_taxes' => 'Charge taxes',
'user_management' => 'User Management', 'user_management' => 'Gebruikersbeheer',
'add_user' => 'Add User', 'add_user' => 'Nieuwe gebruiker',
'send_invite' => 'Send invitation', 'send_invite' => 'Verstuur uitnodiging',
'sent_invite' => 'Successfully sent invitation', 'sent_invite' => 'Uitnodiging succesvol verzonden',
'updated_user' => 'Successfully updated user', 'updated_user' => 'Gebruiker succesvol aangepast',
'invitation_message' => 'You\'ve been invited by :invitor. ', 'invitation_message' => 'U bent uigenodigd door :invitor. ',
'register_to_add_user' => 'Please sign up to add a user', 'register_to_add_user' => 'Meld u aan om een gebruiker toe te voegen',
'user_state' => 'State', 'user_state' => 'Status',
'edit_user' => 'Edit User', 'edit_user' => 'Bewerk Gebruiker',
'delete_user' => 'Delete User', 'delete_user' => 'Verwijder Gebruiker',
'active' => 'Active', 'active' => 'Actief',
'pending' => 'Pending', 'pending' => 'Pending',
'deleted_user' => 'Successfully deleted user', 'deleted_user' => 'Gebruiker succesvol verwijderd',
'limit_users' => 'Sorry, this will exceed the limit of ' . MAX_NUM_USERS . ' users', 'limit_users' => 'Sorry, dit zou de limiet van ' . MAX_NUM_USERS . ' gebruikers overschrijden',
'confirm_email_invoice' => 'Are you sure you want to email this invoice?', 'confirm_email_invoice' => 'Weet u zeker dat u deze factuur wilt mailen?',
'confirm_email_quote' => 'Are you sure you want to email this quote?', 'confirm_email_quote' => 'Weet u zeker dat u deze offerte wilt mailen?',
'confirm_recurring_email_invoice' => 'Recurring is enabled, are you sure you want this invoice emailed?', 'confirm_recurring_email_invoice' => 'Terugkeren (herhalen) staat aan, weet u zeker dat u deze factuur wilt mailen?',
'cancel_account' => 'Cancel Account', 'cancel_account' => 'Zeg Account Op',
'cancel_account_message' => 'Warning: This will permanently erase all of your data, there is no undo.', 'cancel_account_message' => 'Waarschuwing: Dit zal al uw data verwijderen. Er is geen manier om dit ongedaan te maken',
'go_back' => 'Go Back', 'go_back' => 'Ga Terug',
'data_visualizations' => 'Data Visualizations', 'data_visualizations' => 'Data Visualisaties',
'sample_data' => 'Sample data shown', 'sample_data' => 'Voorbeelddata getoond',
'hide' => 'Hide', 'hide' => 'Verberg',
'new_version_available' => 'A new version of :releases_link is available. You\'re running v:user_version, the latest is v:latest_version', 'new_version_available' => 'Een nieuwe versie van :releases_link is beschikbaar. U gebruikt nu v:user_version, de laatste versie is v:latest_version',
'invoice_settings' => 'Invoice Settings', 'invoice_settings' => 'Factuur Instellingen',
'invoice_number_prefix' => 'Invoice Number Prefix', 'invoice_number_prefix' => 'Factuurnummer Prefix',
'invoice_number_counter' => 'Invoice Number Counter', 'invoice_number_counter' => 'Factuurnummer Teller',
'quote_number_prefix' => 'Quote Number Prefix', 'quote_number_prefix' => 'Offertenummer Prefix',
'quote_number_counter' => 'Quote Number Counter', 'quote_number_counter' => 'Offertenummer Teller',
'share_invoice_counter' => 'Share invoice counter', 'share_invoice_counter' => 'Deel factuur teller',
'invoice_issued_to' => 'Invoice issued to', 'invoice_issued_to' => 'Factuur uitgegeven aan',
'invalid_counter' => 'To prevent a possible conflict please set either an invoice or quote number prefix', 'invalid_counter' => 'Stel een factuurnummer prefix of offertenummer prefix in om een mogelijk conflict te voorkomen.',
'mark_sent' => 'Mark sent', 'mark_sent' => 'Markeer als verzonden',
'gateway_help_1' => ':link to sign up for Authorize.net.', 'gateway_help_1' => ':link to sign up for Authorize.net.',
@ -443,17 +445,17 @@ return array(
'gateway_help_23' => 'Note: use your secret API key, not your publishable API key.', 'gateway_help_23' => 'Note: use your secret API key, not your publishable API key.',
'gateway_help_27' => ':link to sign up for TwoCheckout.', 'gateway_help_27' => ':link to sign up for TwoCheckout.',
'more_designs' => 'More designs', 'more_designs' => 'Meer ontwerpen',
'more_designs_title' => 'Additional Invoice Designs', 'more_designs_title' => 'Aanvullende Factuur Ontwerpen',
'more_designs_cloud_header' => 'Go Pro for more invoice designs', 'more_designs_cloud_header' => 'Go Pro for more invoice designs',
'more_designs_cloud_text' => '', 'more_designs_cloud_text' => '',
'more_designs_self_host_header' => 'Get 6 more invoice designs for just $'.INVOICE_DESIGNS_PRICE, 'more_designs_self_host_header' => 'Krijg 6 extra factuurontwerpen voor maar $'.INVOICE_DESIGNS_PRICE,
'more_designs_self_host_text' => '', 'more_designs_self_host_text' => '',
'buy' => 'Buy', 'buy' => 'Koop',
'bought_designs' => 'Successfully added additional invoice designs', 'bought_designs' => 'Aanvullende factuurontwerpen succesvol toegevoegd',
'sent' => 'sent', 'sent' => 'verzonden',
'timesheets' => 'Timesheets', 'timesheets' => 'Timesheets',
'payment_title' => 'Enter Your Billing Address and Credit Card information', 'payment_title' => 'Enter Your Billing Address and Credit Card information',
@ -464,47 +466,47 @@ return array(
'id_number' => 'ID Number', 'id_number' => 'ID Number',
'white_label_link' => 'White label', 'white_label_link' => 'White label',
'white_label_text' => 'Purchase a white label license for $'.WHITE_LABEL_PRICE.' to remove the Invoice Ninja branding from the top of the client pages.', 'white_label_text' => 'Koop een white label licentie voor $'.WHITE_LABEL_PRICE.' om de Invoice Ninja merknaam te verwijderen uit de bovenkant van de klantenpagina\'s.',
'white_label_header' => 'White Label', 'white_label_header' => 'White Label',
'bought_white_label' => 'Successfully enabled white label license', 'bought_white_label' => 'White label licentie succesvol geactiveerd',
'white_labeled' => 'White labeled', 'white_labeled' => 'White labeled',
'restore' => 'Restore', 'restore' => 'Herstel',
'restore_invoice' => 'Restore Invoice', 'restore_invoice' => 'Herstel Factuur',
'restore_quote' => 'Restore Quote', 'restore_quote' => 'Herstel Offerte',
'restore_client' => 'Restore Client', 'restore_client' => 'Herstel Klant',
'restore_credit' => 'Restore Credit', 'restore_credit' => 'Herstel Kredietnota',
'restore_payment' => 'Restore Payment', 'restore_payment' => 'Herstel Betaling',
'restored_invoice' => 'Successfully restored invoice', 'restored_invoice' => 'Factuur succesvol hersteld',
'restored_quote' => 'Successfully restored quote', 'restored_quote' => 'Offerte succesvol hersteld',
'restored_client' => 'Successfully restored client', 'restored_client' => 'Klant succesvol hersteld',
'restored_payment' => 'Successfully restored payment', 'restored_payment' => 'Betaling succesvol hersteld',
'restored_credit' => 'Successfully restored credit', 'restored_credit' => 'Kredietnota succesvol hersteld',
'reason_for_canceling' => 'Help us improve our site by telling us why you\'re leaving.', 'reason_for_canceling' => 'Help ons om onze site te verbeteren door ons te vertellen waarom u weggaat.',
'discount_percent' => 'Percent', 'discount_percent' => 'Percentage',
'discount_amount' => 'Amount', 'discount_amount' => 'Bedrag',
'invoice_history' => 'Invoice History', 'invoice_history' => 'Factuur geschiedenis',
'quote_history' => 'Quote History', 'quote_history' => 'Offerte Geschiedenis',
'current_version' => 'Current version', 'current_version' => 'Huidige Versie',
'select_versiony' => 'Select version', 'select_versiony' => 'Selecteer versie',
'view_history' => 'View History', 'view_history' => 'Bekijk Geschiedenis',
'edit_payment' => 'Edit Payment', 'edit_payment' => 'Bewerk Betaling',
'updated_payment' => 'Successfully updated payment', 'updated_payment' => 'Betaling succesvol bijgewerkt',
'deleted' => 'Deleted', 'deleted' => 'Verwijderd',
'restore_user' => 'Restore User', 'restore_user' => 'Herstel gebruiker',
'restored_user' => 'Successfully restored user', 'restored_user' => 'Gebruiker succesvol hersteld',
'show_deleted_users' => 'Show deleted users', 'show_deleted_users' => 'Toon verwijderde gebruikers',
'email_templates' => 'Email Templates', 'email_templates' => 'Email Templates',
'invoice_email' => 'Invoice Email', 'invoice_email' => 'Factuur Email',
'payment_email' => 'Payment Email', 'payment_email' => 'Betaling Email',
'quote_email' => 'Quote Email', 'quote_email' => 'Offerte Email',
'reset_all' => 'Reset All', 'reset_all' => 'Reset Alles',
'approve' => 'Approve', 'approve' => 'Goedkeuren',
'token_billing_type_id' => 'Token Billing', 'token_billing_type_id' => 'Token Billing',
'token_billing_help' => 'Enables you to store credit cards with your gateway, and charge them at a later date.', 'token_billing_help' => 'Enables you to store credit cards with your gateway, and charge them at a later date.',
@ -519,29 +521,29 @@ return array(
'token_billing' => 'Save card details', 'token_billing' => 'Save card details',
'token_billing_secure' => 'The data is stored securely by :stripe_link', 'token_billing_secure' => 'The data is stored securely by :stripe_link',
'support' => 'Support', 'support' => 'Ondersteuning',
'contact_information' => 'Contact information', 'contact_information' => 'Contact informatie',
'256_encryption' => '256-Bit Encryption', '256_encryption' => '256-Bit Encryptie',
'amount_due' => 'Amount due', 'amount_due' => 'Te betalen bedrag',
'billing_address' => 'Billing address', 'billing_address' => 'Facturatie adres',
'billing_method' => 'Billing method', 'billing_method' => 'Betaalmethode',
'order_overview' => 'Order overview', 'order_overview' => 'Order overzicht',
'match_address' => '*Address must match address associated with credit card.', 'match_address' => '*Addres moet overeenkomen met adres van creditcard.',
'click_once' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.', 'click_once' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.',
'default_invoice_footer' => 'Set default invoice footer', 'default_invoice_footer' => 'Stel standaard factuur-footer in',
'invoice_footer' => 'Invoice footer', 'invoice_footer' => 'Factuur footer',
'save_as_default_footer' => 'Save as default footer', 'save_as_default_footer' => 'Bewaar als standaard footer',
'token_management' => 'Token Management', 'token_management' => 'Token Beheer',
'tokens' => 'Tokens', 'tokens' => 'Tokens',
'add_token' => 'Add Token', 'add_token' => 'Voeg Token Toe',
'show_deleted_tokens' => 'Show deleted tokens', 'show_deleted_tokens' => 'Toon verwijderde tokens',
'deleted_token' => 'Successfully deleted token', 'deleted_token' => 'Token succesvol verwijderd',
'created_token' => 'Successfully created token', 'created_token' => 'Token succesvol aangemaakt',
'updated_token' => 'Successfully updated token', 'updated_token' => 'Token succesvol aangepast',
'edit_token' => 'Edit Token', 'edit_token' => 'Bewerk Token',
'delete_token' => 'Delete Token', 'delete_token' => 'Verwijder Token',
'token' => 'Token', 'token' => 'Token',
'add_gateway' => 'Add Gateway', 'add_gateway' => 'Add Gateway',
@ -553,25 +555,25 @@ return array(
'pay_with_paypal' => 'PayPal', 'pay_with_paypal' => 'PayPal',
'pay_with_card' => 'Credit card', 'pay_with_card' => 'Credit card',
'change_password' => 'Change password', 'change_password' => 'Verander wachtwoord',
'current_password' => 'Current password', 'current_password' => 'Huidig wachtwoord',
'new_password' => 'New password', 'new_password' => 'Nieuw wachtwoord',
'confirm_password' => 'Confirm password', 'confirm_password' => 'Bevestig wachtwoord',
'password_error_incorrect' => 'The current password is incorrect.', 'password_error_incorrect' => 'Het huidige wachtwoord is niet.',
'password_error_invalid' => 'The new password is invalid.', 'password_error_invalid' => 'Het nieuwe wachtwoord is ongeldig.',
'updated_password' => 'Successfully updated password', 'updated_password' => 'Wachtwoord succesvol aangepast',
'api_tokens' => 'API Tokens', 'api_tokens' => 'API Tokens',
'users_and_tokens' => 'Users & Tokens', 'users_and_tokens' => 'Gebruikers & Tokens',
'account_login' => 'Account Login', 'account_login' => 'Account Login',
'recover_password' => 'Recover your password', 'recover_password' => 'Wachtwoordherstel',
'forgot_password' => 'Forgot your password?', 'forgot_password' => 'Wachtwoord vergeten?',
'email_address' => 'Email address', 'email_address' => 'Emailadres',
'lets_go' => 'Lets go', 'lets_go' => 'Lets go',
'password_recovery' => 'Password Recovery', 'password_recovery' => 'Wachtwoord Herstel',
'send_email' => 'Send email', 'send_email' => 'Verstuur email',
'set_password' => 'Set Password', 'set_password' => 'Stel wachtwoord in',
'converted' => 'Converted', 'converted' => 'Omgezet',

View File

@ -204,6 +204,8 @@ return array(
'import_to' => 'Importar para', 'import_to' => 'Importar para',
'client_will_create' => 'cliente será criado', 'client_will_create' => 'cliente será criado',
'clients_will_create' => 'clientes serão criados', 'clients_will_create' => 'clientes serão criados',
'email_settings' => 'Email Settings',
'pdf_email_attachment' => 'Attach PDF to Emails',
// application messages // application messages
'created_client' => 'Cliente criado com sucesso', 'created_client' => 'Cliente criado com sucesso',

View File

@ -42,6 +42,10 @@
->append(Former::checkbox('share_counter')->raw()->onclick('setQuoteNumberEnabled()') . ' ' . trans('texts.share_invoice_counter')) }} ->append(Former::checkbox('share_counter')->raw()->onclick('setQuoteNumberEnabled()') . ' ' . trans('texts.share_invoice_counter')) }}
<p>&nbsp;</p> <p>&nbsp;</p>
{{ Former::legend('email_settings') }}
{{ Former::checkbox('pdf_email_attachment') }}
<p>&nbsp;</p>
@if (Auth::user()->isPro()) @if (Auth::user()->isPro())
{{ Former::actions( Button::lg_success_submit(trans('texts.save'))->append_with_icon('floppy-disk') ) }} {{ Former::actions( Button::lg_success_submit(trans('texts.save'))->append_with_icon('floppy-disk') ) }}
@else @else

View File

@ -729,6 +729,12 @@
submitAction(''); submitAction('');
} }
} else { } else {
var invoice = createInvoiceModel();
var design = getDesignJavascript();
if (!design) return;
var doc = generatePDF(invoice, design, true);
$('form.form-horizontal.warn-on-exit').append('<input type="hidden" name="pdfupload" value="'+doc.output('datauristring')+'">');
submitAction(''); submitAction('');
} }
} }