This commit is contained in:
mindnervestech 2014-11-11 11:30:40 +05:30
commit ab19abac45
43 changed files with 1264 additions and 912 deletions

View File

@ -6,8 +6,6 @@ module.exports = function(grunt) {
options: {
process: function(src, filepath) {
var basepath = filepath.substring(7, filepath.lastIndexOf('/') + 1);
console.log(filepath);
// Fix relative paths for css files
if(filepath.indexOf('.css', filepath.length - 4) !== -1) {
return src.replace(/(url\s*[\("']+)\s*([^'"\)]+)(['"\)]+;?)/gi, function(match, start, url, end, offset, string) {

View File

@ -3,7 +3,7 @@
### [https://www.invoiceninja.com](https://www.invoiceninja.com)
If you'd like to use our code to sell your own invoicing app we offer a white-label affiliate program. We ask for 20% of revenue earned with a $100 sign up fee. Get in touch for more details.
If you'd like to use our code to sell your own invoicing app we offer a white-label affiliate program. We ask for 20% of revenue with a $100 sign up fee. Get in touch for more details.
### Introduction

View File

@ -13,7 +13,7 @@ return array(
|
*/
'debug' => true,
'debug' => false,
/*
|--------------------------------------------------------------------------

View File

@ -818,6 +818,7 @@ class AccountController extends \BaseController {
{
$account = Auth::user()->account;
$account->name = trim(Input::get('name'));
$account->id_number = trim(Input::get('id_number'));
$account->vat_number = trim(Input::get('vat_number'));
$account->work_email = trim(Input::get('work_email'));
$account->work_phone = trim(Input::get('work_phone'));

View File

@ -199,6 +199,7 @@ class ClientController extends \BaseController {
}
$client->name = trim(Input::get('name'));
$client->id_number = trim(Input::get('id_number'));
$client->vat_number = trim(Input::get('vat_number'));
$client->work_phone = trim(Input::get('work_phone'));
$client->custom_value1 = trim(Input::get('custom_value1'));
@ -212,7 +213,7 @@ class ClientController extends \BaseController {
$client->private_notes = trim(Input::get('private_notes'));
$client->size_id = Input::get('size_id') ? : null;
$client->industry_id = Input::get('industry_id') ? : null;
$client->currency_id = Input::get('currency_id') ? : 1;
$client->currency_id = Input::get('currency_id') ? : null;
$client->payment_terms = Input::get('payment_terms') ? : 0;
$client->website = trim(Input::get('website'));

View File

@ -19,7 +19,7 @@ class DashboardController extends \BaseController {
->groupBy('accounts.id')
->first();
$select = DB::raw('SUM(clients.paid_to_date) value');
$select = DB::raw('SUM(clients.paid_to_date) as value');
$totalIncome = DB::table('accounts')
->select($select)

View File

@ -153,6 +153,7 @@ class InvoiceController extends \BaseController {
$invoice->id = null;
$invoice->invoice_number = Auth::user()->account->getNextInvoiceNumber($invoice->is_quote);
$invoice->balance = $invoice->amount;
$invoice->invoice_date = date_create()->format('Y-m-d');
$method = 'POST';
$url = "{$entityType}s";
}

View File

@ -35,11 +35,13 @@ class QuoteController extends \BaseController {
'columns'=>Utils::trans(['checkbox', 'quote_number', 'client', 'quote_date', 'quote_total', 'due_date', 'status', 'action'])
];
/*
if (Invoice::scope()->where('is_recurring', '=', true)->count() > 0)
{
$data['secEntityType'] = ENTITY_RECURRING_INVOICE;
$data['secColumns'] = Utils::trans(['checkbox', 'frequency', 'client', 'start_date', 'end_date', 'quote_total', 'action']);
}
*/
return View::make('list', $data);
}
@ -104,12 +106,14 @@ class QuoteController extends \BaseController {
public function bulk()
{
$action = Input::get('action');
$statusId = Input::get('statusId');
$ids = Input::get('id') ? Input::get('id') : Input::get('ids');
$count = $this->invoiceRepo->bulk($ids, $action);
$count = $this->invoiceRepo->bulk($ids, $action, $statusId);
if ($count > 0)
{
$message = Utils::pluralize("{$action}d_quote", $count);
$key = $action == 'mark' ? "updated_quote" : "{$action}d_quote";
$message = Utils::pluralize($key, $count);
Session::flash('message', $message);
}

View File

@ -279,7 +279,7 @@ class ConfideSetupUsersTable extends Migration {
$t->string('last_name')->nullable();
$t->string('email')->nullable();
$t->string('phone')->nullable();
$t->timestamp('last_login');
$t->timestamp('last_login')->nullable();
$t->foreign('client_id')->references('id')->on('clients')->onDelete('cascade');
$t->foreign('user_id')->references('id')->on('users')->onDelete('cascade');;

View File

@ -422,10 +422,14 @@ class AddInvoiceDesignTable extends Migration {
var account = invoice.account;
var currencyId = client.currency_id;
layout.accountTop += 25;
layout.headerTop += 25;
layout.tableTop += 25;
if (invoice.image)
{
var left = layout.headerRight - invoice.imageWidth;
doc.addImage(invoice.image, 'JPEG', left, 30);
doc.addImage(invoice.image, 'JPEG', left, 50);
}
/* table header */

View File

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

View File

@ -0,0 +1,31 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AllowNullClientCurrency extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('clients', function($table)
{
DB::statement('ALTER TABLE `clients` MODIFY `currency_id` INTEGER UNSIGNED NULL;');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
}
}

View File

@ -5,7 +5,8 @@ return array(
// client
'organization' => 'Organisation',
'name' => 'Navn',
'vat_number' => 'CVR nummer',
'id_number' => 'SE/CVR nummer',
'vat_number' => 'SE/CVR nummer',
'website' => 'Webside',
'work_phone' => 'Telefon',
'address' => 'Adresse',
@ -444,4 +445,29 @@ return array(
'invoice_issued_to' => 'Faktura udstedt til',
'invalid_counter' => 'For at undgå mulige overlap, sæt venligst et faktura eller tilbuds nummer præfiks',
'mark_sent' => 'Markering sendt',
'gateway_help_1' => ':link to sign up for Authorize.net.',
'gateway_help_2' => ':link to sign up for Authorize.net.',
'gateway_help_17' => ':link to get your PayPal API signature.',
'gateway_help_23' => 'Note: use your secret API key, not your publishable API key.',
'gateway_help_27' => ':link to sign up for TwoCheckout.',
'more_designs' => 'More designs',
'more_designs_title' => 'Additional Invoice Designs',
'more_designs_cloud_header' => 'Go Pro for more invoice designs',
'more_designs_cloud_text' => '',
'more_designs_self_host_header' => 'Get 6 more invoice designs for just $20',
'more_designs_self_host_text' => '',
'buy' => 'Buy',
'bought_designs' => 'Successfully added additional invoice designs',
'sent' => 'sent',
'timesheets' => 'Timesheets',
'payment_title' => 'Enter Your Billing Address and Credit Card information',
'payment_cvv' => '*This is the 3-4 digit number onthe back of your card',
'payment_footer1' => '*Billing address must match address accociated with credit card.',
'payment_footer2' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.',
);

View File

@ -450,5 +450,16 @@ return array(
'buy' => 'Buy',
'bought_designs' => 'Successfully added additional invoice designs',
'sent' => 'sent',
'timesheets' => 'Timesheets',
'payment_title' => 'Enter Your Billing Address and Credit Card information',
'payment_cvv' => '*This is the 3-4 digit number onthe back of your card',
'payment_footer1' => '*Billing address must match address accociated with credit card.',
'payment_footer2' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.',
'vat_number' => 'Vat Number',
);

View File

@ -466,7 +466,17 @@ return array(
'more_designs_self_host_text' => '',
'buy' => 'Buy',
'bought_designs' => 'Successfully added additional invoice designs',
'sent' => 'sent',
'id_number' => 'ID Number',
'vat_number' => 'VAT Number',
'timesheets' => 'Timesheets',
'payment_title' => 'Enter Your Billing Address and Credit Card information',
'payment_cvv' => '*This is the 3-4 digit number onthe back of your card',
'payment_footer1' => '*Billing address must match address accociated with credit card.',
'payment_footer2' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.',
'vat_number' => 'Vat Number',
);

View File

@ -430,4 +430,15 @@ return array(
'buy' => 'Buy',
'bought_designs' => 'Successfully added additional invoice designs',
'sent' => 'sent',
'timesheets' => 'Timesheets',
'payment_title' => 'Enter Your Billing Address and Credit Card information',
'payment_cvv' => '*This is the 3-4 digit number onthe back of your card',
'payment_footer1' => '*Billing address must match address accociated with credit card.',
'payment_footer2' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.',
'vat_number' => 'Vat Number',
);

View File

@ -9,7 +9,7 @@ return array(
'work_phone' => 'Téléphone',
'address' => 'Adresse',
'address1' => 'Rue',
'address2' => 'Appt/Batiment',
'address2' => 'Appt/Bâtiment',
'city' => 'Ville',
'state' => 'Région/Département',
'postal_code' => 'Code Postal',
@ -18,7 +18,7 @@ return array(
'first_name' => 'Prénom',
'last_name' => 'Nom',
'phone' => 'Téléphone',
'email' => 'Email',
'email' => 'Courriel',
'additional_info' => 'Informations complémentaires',
'payment_terms' => 'Conditions de paiement',
'currency_id' => 'Devise',
@ -35,13 +35,13 @@ return array(
'invoice_number_short' => 'Facture #',
'po_number' => 'Numéro du bon de commande',
'po_number_short' => 'Bon de commande #',
'frequency_id' => 'Fréquence', //litteral translation : Combien de fois
'discount' => 'Remise', //can be "rabais" or "réduction"
'frequency_id' => 'Fréquence',
'discount' => 'Remise',
'taxes' => 'Taxes',
'tax' => 'Taxe',
'item' => 'Ligne', //I'm not sure, I need the context : screenshot ?
'item' => 'Article',
'description' => 'Description',
'unit_cost' => 'Coût à l\'unité',
'unit_cost' => 'Coût unitaire',
'quantity' => 'Quantité',
'line_total' => 'Total',
'subtotal' => 'Total',
@ -67,7 +67,7 @@ return array(
'clone_invoice' => 'Dupliquer la facture',
'archive_invoice' => 'Archiver la facture',
'delete_invoice' => 'Supprimer la facture',
'email_invoice' => 'Envoir la facture par email',
'email_invoice' => 'Envoyer la facture par courriel',
'enter_payment' => 'Saisissez un paiement',
'tax_rates' => 'Taux de taxe',
'rate' => 'Taux',
@ -88,16 +88,16 @@ return array(
'company_details' => 'Informations sur l\'entreprise',
'online_payments' => 'Paiements en ligne',
'notifications' => 'Notifications',
'import_export' => 'Import/Export',
'import_export' => 'Importer/Exporter',
'done' => 'Valider',
'save' => 'Sauvegarder',
'create' => 'Créer',
'upload' => 'Envoyer',
'import' => 'Import',
'import' => 'Importer',
'download' => 'Télécharger',
'cancel' => 'Annuler',
'close' => 'Fermer',
'provide_email' => 'Veuillez renseigner une adresse email valide',
'provide_email' => 'Veuillez renseigner une adresse courriel valide',
'powered_by' => 'Propulsé par',
'no_items' => 'Aucun élément',
@ -156,8 +156,8 @@ return array(
'credit_date' => 'Date de crédit',
'empty_table' => 'Aucune donnée disponible dans la table',
'select' => 'Sélectionner',
'edit_client' => 'Editer le Client',
'edit_invoice' => 'Editer la Facture',
'edit_client' => 'Éditer le Client',
'edit_invoice' => 'Éditer la Facture',
// client view page
'create_invoice' => 'Créer une facture',
@ -177,7 +177,7 @@ return array(
'amount' => 'Montant',
// account/company pages
'work_email' => 'Email',
'work_email' => 'Courriel',
'language_id' => 'Langage',
'timezone_id' => 'Fuseau horaire',
'date_format_id' => 'Format de la date',
@ -188,14 +188,14 @@ return array(
'logo_help' => 'Formats supportés: JPEG, GIF et PNG. Hauteur recommandé: 120px',
'payment_gateway' => 'Passerelle de paiement',
'gateway_id' => 'Fournisseur',
'email_notifications' => 'Notifications par email',
'email_sent' => 'm\'envoyer un email quand une facture est <b>envoyée</b>',
'email_viewed' => 'm\'envoyer un email quand une facture est <b>vue</b>',
'email_paid' => 'm\'envoyer un email quand une facture est <b>payée</b>',
'email_notifications' => 'Notifications par courriel',
'email_sent' => 'm\'envoyer un courriel quand une facture est <b>envoyée</b>',
'email_viewed' => 'm\'envoyer un courriel quand une facture est <b>vue</b>',
'email_paid' => 'm\'envoyer un courriel quand une facture est <b>payée</b>',
'site_updates' => 'Mises à jour du site',
'custom_messages' => 'Messages personnalisés',
'default_invoice_terms' => 'Définir comme les conditions par défaut',
'default_email_footer' => 'Définir comme la signature d\'email par défaut',
'default_email_footer' => 'Définir comme la signature de courriel par défaut',
'import_clients' => 'Importer des données clients',
'csv_file' => 'Sélectionner un fichier CSV',
'export_clients' => 'Exporter des données clients',
@ -216,8 +216,8 @@ return array(
'invoice_error' => 'Veuillez vous assurer de sélectionner un client et de corriger les erreurs',
'limit_clients' => 'Désolé, cela dépasse la limite de :count clients',
'payment_error' => 'Il y a eu une erreur lors du traitement de votre paiement. Veuillez réessayer ultérieurement',
'registration_required' => 'Veuillez vous enregistrer pour envoyer une facture par email',
'confirmation_required' => 'Veuillez confirmer votre adresse email',
'registration_required' => 'Veuillez vous enregistrer pour envoyer une facture par courriel',
'confirmation_required' => 'Veuillez confirmer votre adresse courriel',
'updated_client' => 'Client modifié avec succès',
'created_client' => 'Client créé avec succès',
@ -229,7 +229,7 @@ return array(
'updated_invoice' => 'Facture modifiée avec succès',
'created_invoice' => 'Facture créée avec succès',
'cloned_invoice' => 'Facture dupliquée avec succès',
'emailed_invoice' => 'Facture envoyée par email avec succès',
'emailed_invoice' => 'Facture envoyée par courriel avec succès',
'and_created_client' => 'et client créé',
'archived_invoice' => 'Facture archivée avec succès',
'archived_invoices' => ':count factures archivées avec succès',
@ -260,13 +260,13 @@ return array(
'email_salutation' => 'Cher :name,',
'email_signature' => 'Cordialement,',
'email_from' => 'L\'équipe InvoiceNinja',
'user_email_footer' => 'Pour modifier vos paramètres de notification par email, veuillez visiter '.SITE_URL.'/company/notifications',
'user_email_footer' => 'Pour modifier vos paramètres de notification par courriel, veuillez visiter '.SITE_URL.'/company/notifications',
'invoice_link_message' => 'Pour voir la facture de votre client cliquez sur le lien ci-après :',
'notification_invoice_paid_subject' => 'La facture :invoice a été payée par le client :client',
'notification_invoice_sent_subject' => 'La facture :invoice a été envoyée au client :client',
'notification_invoice_viewed_subject' => 'La facture :invoice a été vue par le client :client',
'notification_invoice_paid' => 'Un paiement de :amount a été effectué par le client :client concernant la facture :invoice.',
'notification_invoice_sent' => 'Le client suivant :client a reçu par email la facture :invoice d\'un montant de :amount',
'notification_invoice_sent' => 'Le client suivant :client a reçu par courriel la facture :invoice d\'un montant de :amount',
'notification_invoice_viewed' => 'Le client suivant :client a vu la facture :invoice d\'un montant de :amount',
'reset_password' => 'Vous pouvez réinitialiser votre mot de passe en cliquant sur le lien suivant :',
'reset_password_footer' => 'Si vous n\'avez pas effectué de demande de réinitalisation de mot de passe veuillez contacter notre support :' . CONTACT_EMAIL,
@ -281,10 +281,10 @@ return array(
// Security alerts
'confide' => array(
'too_many_attempts' => 'Trop de tentatives. Essayez à nouveau dans quelques minutes.',
'wrong_credentials' => 'Email ou mot de passe incorrect',
'wrong_credentials' => 'Courriel ou mot de passe incorrect',
'confirmation' => 'Votre compte a été validé !',
'wrong_confirmation' => 'Code de confirmation incorrect.',
'password_forgot' => 'Les informations de réinitialisation de votre mot de passe vous ont été envoyées par email.',
'password_forgot' => 'Les informations de réinitialisation de votre mot de passe vous ont été envoyées par courriel.',
'password_reset' => 'Votre mot de passe a été modifié avec succès.',
'wrong_password_reset' => 'Mot de passe incorrect. Veuillez réessayer',
),
@ -299,10 +299,10 @@ return array(
'sign_up_to_save' => 'Connectez vous pour sauvegarder votre travail',
'agree_to_terms' =>'J\'accepte les conditions d\'utilisation d\'Invoice ninja :terms',
'terms_of_service' => 'Conditions d\'utilisation',
'email_taken' => 'L\'adresse email est déjà existante',
'email_taken' => 'L\'adresse courriel existe déjà',
'working' => 'En cours',
'success' => 'Succès',
'success_message' => 'Inscription réussie avec succès. Veuillez cliquer sur le lien dans l\'email de confirmation de compte pour vérifier votre adresse email.',
'success_message' => 'Inscription réussie avec succès. Veuillez cliquer sur le lien dans le courriel de confirmation de compte pour vérifier votre adresse courriel.',
'erase_data' => 'Cela supprimera vos données de façon permanente.',
'password' => 'Mot de passe',
@ -316,7 +316,7 @@ return array(
'client_fields' => 'Champs client',
'field_label' => 'Nom du champ',
'field_value' => 'Valeur du champ',
'edit' => 'Editer',
'edit' => 'Éditer',
'view_as_recipient' => 'Voir en tant que destinataire',
// product management
@ -328,7 +328,7 @@ return array(
'update_products' => 'Mise à jour auto des produits',
'update_products_help' => 'La mise à jour d\'une facture entraîne la <b>mise à jour des produits</b>',
'create_product' => 'Nouveau produit',
'edit_product' => 'Editer Produit',
'edit_product' => 'Éditer Produit',
'archive_product' => 'Archiver Produit',
'updated_product' => 'Produit mis à jour',
'created_product' => 'Produit créé',
@ -341,51 +341,51 @@ return array(
'specify_colors' => 'Spécifiez les couleurs',
'specify_colors_label' => 'Sélectionnez les couleurs utilisés dans les factures',
'chart_builder' => 'Chart Builder',
'ninja_email_footer' => 'Use :site to invoice your clients and get paid online for free!',
'go_pro' => 'Go Pro',
'chart_builder' => 'Concepteur de graphiques',
'ninja_email_footer' => 'Utilisez :site pour facturer vos clients et être payés en ligne gratuitement!',
'go_pro' => 'Passez au Plan Pro',
// Quotes
'quote' => 'Devis',
'quotes' => 'Devis',
'quote_number' => 'Devis numéro',
'quote_number_short' => 'Devis N°',
'quote_date' => 'Date du devis',
'quote_total' => 'Montant du devis',
'your_quote' => 'Votre Devis',
'quote' => 'Soumission',
'quotes' => 'Soumissions',
'quote_number' => 'Soumission numéro',
'quote_number_short' => 'Soumission #',
'quote_date' => 'Date de soumission',
'quote_total' => 'Montant de la soumis',
'your_quote' => 'Votre Soumission',
'total' => 'Total',
'clone' => 'Dupliquer',
'new_quote' => 'Nouveau devis',
'create_quote' => 'Créer un devis',
'edit_quote' => 'Editer le devis',
'archive_quote' => 'Archiver le devis',
'delete_quote' => 'Supprimer le devis',
'save_quote' => 'Enregistrer le devis',
'email_quote' => 'Envoyer le devis par mail',
'clone_quote' => 'Dupliquer le devis',
'new_quote' => 'Nouvelle soumission',
'create_quote' => 'Créer une soumission',
'edit_quote' => 'Éditer la soumission',
'archive_quote' => 'Archiver la soumission',
'delete_quote' => 'Supprimer la soumission',
'save_quote' => 'Enregistrer la soumission',
'email_quote' => 'Envoyer la soumission par courriel',
'clone_quote' => 'Dupliquer la soumission',
'convert_to_invoice' => 'Convertir en facture',
'view_invoice' => 'Nouvelle facture',
'view_quote' => 'Voir le devis',
'view_quote' => 'Voir la soumission',
'view_client' => 'Voir le client',
'updated_quote' => 'Devis mis à jour',
'created_quote' => 'Devis créé',
'cloned_quote' => 'Devis dupliqué avec succès',
'emailed_quote' => 'Devis envoyé par email',
'archived_quote' => 'Devis archivé',
'archived_quotes' => ':count devis ont bien été archivé',
'deleted_quote' => 'Devis supprimé',
'deleted_quotes' => ':count devis ont bien été supprimés',
'converted_to_invoice' => 'Le devis a bien été converti en facture',
'updated_quote' => 'Soumission mise à jour',
'created_quote' => 'Soumission créée',
'cloned_quote' => 'Soumission dupliquée avec succès',
'emailed_quote' => 'Soumission envoyée par courriel',
'archived_quote' => 'Soumission archivée',
'archived_quotes' => ':count soumissions ont bien été archivés',
'deleted_quote' => 'Soumission supprimée',
'deleted_quotes' => ':count soumissions ont bien été supprimés',
'converted_to_invoice' => 'La soumission a bien été convertie en facture',
'quote_subject' => 'New quote from :account',
'quote_message' => 'To view your quote for :amount, click the link below.',
'quote_link_message' => 'To view your client quote click the link below:',
'notification_quote_sent_subject' => 'Quote :invoice was sent to :client',
'notification_quote_viewed_subject' => 'Quote :invoice was viewed by :client',
'notification_quote_sent' => 'The following client :client was emailed Quote :invoice for :amount.',
'notification_quote_viewed' => 'The following client :client viewed Quote :invoice for :amount.',
'quote_subject' => 'Nouvelle soumission de :account',
'quote_message' => 'Pour visionner votre soumission de :amount, cliquez le lien ci-dessous.',
'quote_link_message' => 'Pour visionner votre soumission, cliquez le lien ci-dessous:',
'notification_quote_sent_subject' => 'La soumission :invoice a été envoyée à :client',
'notification_quote_viewed_subject' => 'La soumission :invoice a été visionnée par :client',
'notification_quote_sent' => 'La facture :invoice de :amount a été envoyée au client :client.',
'notification_quote_viewed' => 'La facture :invoice de :amount a été visionée par le client :client.',
'session_expired' => 'Votre session a expiré.',
@ -396,45 +396,45 @@ return array(
'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.',
'charge_taxes' => 'Charge taxes',
'charge_taxes' => 'Factures des taxes',
'user_management' => 'Gestion des utilisateurs',
'add_user' => 'Ajouter utilisateur',
'send_invite' => 'Envoyer invitation',
'sent_invite' => 'Invitation envoyés',
'updated_user' => 'Utilisateur mis à jour',
'invitation_message' => 'Vous avez été invité par :invitor. ',
'register_to_add_user' => 'Please sign up to add a user',
'user_state' => 'Etat',
'edit_user' => 'Editer l\'utilisateur',
'register_to_add_user' => 'Veuillez vous enregistrer pour ajouter un utilisateur',
'user_state' => 'État',
'edit_user' => 'Éditer l\'utilisateur',
'delete_user' => 'Supprimer l\'utilisateur',
'active' => 'Actif',
'pending' => 'En attente',
'deleted_user' => 'Utilisateur supprimé',
'limit_users' => 'Sorry, this will exceed the limit of ' . MAX_NUM_USERS . ' users',
'limit_users' => 'Désolé, ceci excédera la limite de ' . MAX_NUM_USERS . ' utilisateurs',
'confirm_email_invoice' => 'Are you sure you want to email this invoice?',
'confirm_email_quote' => 'Are you sure you want to email this quote?',
'confirm_recurring_email_invoice' => 'Recurring is enabled, are you sure you want this invoice emailed?',
'confirm_email_invoice' => 'Voulez-vous vraiment envoyer cette facture par courriel?',
'confirm_email_quote' => 'Voulez-vous vraiment envoyer cette soumission par courriel?',
'confirm_recurring_email_invoice' => 'Les factures récurrentes sont activées, voulez-vous vraiment envoyer cette facture par courriel?',
'cancel_account' => 'Supprimé le compte',
'cancel_account_message' => 'Warning: This will permanently erase all of your data, there is no undo.',
'cancel_account' => 'Supprimer le compte',
'cancel_account_message' => 'Attention: Ceci supprimera de façon permanente toutes vos données; cette action est irréversible.',
'go_back' => 'Retour',
'data_visualizations' => 'Data Visualizations',
'sample_data' => 'Sample data shown',
'data_visualizations' => 'Visualisation des données',
'sample_data' => 'Données fictives présentées',
'hide' => 'Cacher',
'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' => 'Une nouvelle version de :releases_link est disponible. Vous utilisez v:user_version, la plus récente est v:latest_version',
'invoice_settings' => 'Paramètre des factures',
'invoice_number_prefix' => 'Invoice Number Prefix',
'invoice_number_counter' => 'Invoice Number Counter',
'quote_number_prefix' => 'Quote Number Prefix',
'quote_number_counter' => 'Quote Number Counter',
'share_invoice_counter' => 'Share invoice counter',
'invoice_issued_to' => 'Invoice issued to',
'invoice_settings' => 'Paramètres des factures',
'invoice_number_prefix' => 'Préfixe du numéro de facture',
'invoice_number_counter' => 'Compteur du numéro de facture',
'quote_number_prefix' => 'Préfixe du numéro de soumission',
'quote_number_counter' => 'Compteur du numéro de soumission',
'share_invoice_counter' => 'Partager le compteur de facture',
'invoice_issued_to' => 'Facture destinée à',
'invalid_counter' => 'To prevent a possible conflict please set either an invoice or quote number prefix',
'mark_sent' => 'Maquer comme envoyé',
'mark_sent' => 'Marquer comme envoyé',
'gateway_help_1' => ':link to sign up for Authorize.net.',
'gateway_help_2' => ':link to sign up for Authorize.net.',
@ -442,14 +442,22 @@ return array(
'gateway_help_23' => 'Note: use your secret API key, not your publishable API key.',
'gateway_help_27' => ':link to sign up for TwoCheckout.',
'more_designs' => 'More designs',
'more_designs_title' => 'Additional Invoice Designs',
'more_designs_cloud_header' => 'Go Pro for more invoice designs',
'more_designs' => 'Plus de modèles',
'more_designs_title' => 'Modèles de factures additionnels',
'more_designs_cloud_header' => 'Passez au Plan Pro pour plus de modèles',
'more_designs_cloud_text' => '',
'more_designs_self_host_header' => 'Get 6 more invoice designs for just $20',
'more_designs_self_host_header' => 'Obtenez 6 modèles de factures additionnels pour seulement 20$',
'more_designs_self_host_text' => '',
'buy' => 'Acheter',
'bought_designs' => 'Successfully added additional invoice designs',
'bought_designs' => 'Les nouveaux modèles ont été ajoutés avec succès',
'sent' => 'sent',
'timesheets' => 'Timesheets',
'payment_title' => 'Enter Your Billing Address and Credit Card information',
'payment_cvv' => '*This is the 3-4 digit number onthe back of your card',
'payment_footer1' => '*Billing address must match address accociated with credit card.',
'payment_footer2' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.',
'vat_number' => 'Vat Number',
);

View File

@ -452,5 +452,16 @@ return array(
'bought_designs' => 'Successfully added additional invoice designs',
'sent' => 'sent',
'timesheets' => 'Timesheets',
'payment_title' => 'Enter Your Billing Address and Credit Card information',
'payment_cvv' => '*This is the 3-4 digit number onthe back of your card',
'payment_footer1' => '*Billing address must match address accociated with credit card.',
'payment_footer2' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.',
'vat_number' => 'Vat Number',
);

View File

@ -460,5 +460,17 @@ return array(
'bought_designs' => 'Successfully added additional invoice designs',
'sent' => 'sent',
'timesheets' => 'Timesheets',
'payment_title' => 'Enter Your Billing Address and Credit Card information',
'payment_cvv' => '*This is the 3-4 digit number onthe back of your card',
'payment_footer1' => '*Billing address must match address accociated with credit card.',
'payment_footer2' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.',
'vat_number' => 'Vat Number',
);

View File

@ -459,5 +459,16 @@ return array(
'bought_designs' => 'Successfully added additional invoice designs',
'sent' => 'sent',
'timesheets' => 'Timesheets',
'payment_title' => 'Enter Your Billing Address and Credit Card information',
'payment_cvv' => '*This is the 3-4 digit number onthe back of your card',
'payment_footer1' => '*Billing address must match address accociated with credit card.',
'payment_footer2' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.',
'vat_number' => 'Vat Number',
);

View File

@ -453,4 +453,16 @@ return array(
'bought_designs' => 'Successfully added additional invoice designs',
'sent' => 'sent',
'timesheets' => 'Timesheets',
'payment_title' => 'Enter Your Billing Address and Credit Card information',
'payment_cvv' => '*This is the 3-4 digit number onthe back of your card',
'payment_footer1' => '*Billing address must match address accociated with credit card.',
'payment_footer2' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.',
'vat_number' => 'Vat Number',
);

View File

@ -441,4 +441,17 @@ return array(
'sent' => 'sent',
'timesheets' => 'Timesheets',
'payment_title' => 'Enter Your Billing Address and Credit Card information',
'payment_cvv' => '*This is the 3-4 digit number onthe back of your card',
'payment_footer1' => '*Billing address must match address accociated with credit card.',
'payment_footer2' => '*Please click "PAY NOW" only once - transaction may take up to 1 minute to process.',
'vat_number' => 'Vat Number',
);

View File

@ -131,11 +131,23 @@ class Client extends EntityModel
return $str;
}
public function getIdNumber()
{
$str = '';
if ($this->id_number)
{
$str .= '<i class="fa fa-vat-number" style="width: 20px"></i>' . $this->vat_number;
}
return $str;
}
public function getVatNumber()
{
$str = '';
if ($this->work_phone)
if ($this->vat_number)
{
$str .= '<i class="fa fa-vat-number" style="width: 20px"></i>' . $this->vat_number;
}

View File

@ -95,6 +95,7 @@ class Invoice extends EntityModel
$this->client->setVisible([
'name',
'id_number',
'vat_number',
'address1',
'address2',
@ -111,6 +112,7 @@ class Invoice extends EntityModel
$this->account->setVisible([
'name',
'id_number',
'vat_number',
'address1',
'address2',

View File

@ -15,16 +15,9 @@ class Mailer {
Mail::send($views, $data, function($message) use ($toEmail, $fromEmail, $fromName, $subject)
{
$replyEmail = $fromEmail;
$fromEmail = NINJA_FROM_EMAIL;
// We're unable to set the true fromEmail for emails sent from Yahoo or AOL accounts
// http://blog.mandrill.com/yahoos-recent-dmarc-changes-and-how-that-impacts-senders.html
if (strpos($fromEmail, '@yahoo.') !== false || strpos($fromEmail, '@aol.') !== FALSE)
{
$fromEmail = CONTACT_EMAIL;
}
$message->to($toEmail)->from($fromEmail, $fromName)->sender($fromEmail, $fromName)
->replyTo($replyEmail, $fromName)->subject($subject);
$message->to($toEmail)->from($fromEmail, $fromName)->replyTo($replyEmail, $fromName)->subject($subject);
});
}
}

View File

@ -62,6 +62,9 @@ class ClientRepository
if (isset($data['name'])) {
$client->name = trim($data['name']);
}
if (isset($data['id_number'])) {
$client->id_number = trim($data['id_number']);
}
if (isset($data['vat_number'])) {
$client->vat_number = trim($data['vat_number']);
}
@ -102,7 +105,7 @@ class ClientRepository
$client->industry_id = $data['industry_id'] ? $data['industry_id'] : null;
}
if (isset($data['currency_id'])) {
$client->currency_id = $data['currency_id'] ? $data['currency_id'] : 1;
$client->currency_id = $data['currency_id'] ? $data['currency_id'] : null;
}
if (isset($data['payment_terms'])) {
$client->payment_terms = $data['payment_terms'];

View File

@ -9,7 +9,7 @@ use TaxRate;
class InvoiceRepository
{
public function getInvoices($accountId, $clientPublicId = false, $filter = false)
public function getInvoices($accountId, $clientPublicId = false, $entityType = ENTITY_INVOICE, $filter = false)
{
$query = \DB::table('invoices')
->join('clients', 'clients.id', '=','invoices.client_id')
@ -22,7 +22,7 @@ class InvoiceRepository
->where('contacts.is_primary', '=', true)
->select('clients.public_id as client_public_id', 'invoice_number', 'invoice_status_id', 'clients.name as client_name', 'invoices.public_id', 'amount', 'invoices.balance', 'invoice_date', 'due_date', 'invoice_statuses.name as invoice_status_name', 'clients.currency_id', 'contacts.first_name', 'contacts.last_name', 'contacts.email', 'quote_id', 'quote_invoice_id');
if (!\Session::get('show_trash:invoice'))
if (!\Session::get('show_trash:' . $entityType))
{
$query->where('invoices.deleted_at', '=', null);
}
@ -85,7 +85,7 @@ class InvoiceRepository
public function getDatatable($accountId, $clientPublicId = null, $entityType, $search)
{
$query = $this->getInvoices($accountId, $clientPublicId, $search)
$query = $this->getInvoices($accountId, $clientPublicId, $entityType, $search)
->where('invoices.is_quote', '=', $entityType == ENTITY_QUOTE ? true : false);
$table = \Datatable::query($query);

View File

@ -247,6 +247,7 @@ define('NINJA_GATEWAY_ID', GATEWAY_AUTHORIZE_NET);
define('NINJA_GATEWAY_CONFIG', '{"apiLoginId":"626vWcD5","transactionKey":"4bn26TgL9r4Br4qJ","testMode":"","developerMode":""}');
define('NINJA_URL', 'https://www.invoiceninja.com');
define('NINJA_VERSION', '1.5.1');
define('NINJA_FROM_EMAIL', 'maildelivery@invoiceninja.com');
define('RELEASES_URL', 'https://github.com/hillelcoren/invoice-ninja/releases/');
define('COUNT_FREE_DESIGNS', 4);

View File

@ -29,6 +29,7 @@
{{ Former::legend('details') }}
{{ Former::text('name') }}
{{ Former::text('id_number') }}
{{ Former::text('vat_number') }}
{{ Former::text('work_email') }}
{{ Former::text('work_phone') }}

View File

@ -4,6 +4,7 @@
{{ Former::legend('Organization') }}
{{ Former::text('name') }}
{{ Former::text('id_number') }}
{{ Former::text('vat_number') }}
{{ Former::text('work_phone')->label('Phone') }}
{{ Former::textarea('notes') }}

View File

@ -23,6 +23,7 @@
{{ Former::legend('organization') }}
{{ Former::text('name')->data_bind("attr { placeholder: placeholderName }") }}
{{ Former::text('id_number') }}
{{ Former::text('vat_number') }}
{{ Former::text('website') }}
{{ Former::text('work_phone') }}

View File

@ -39,6 +39,7 @@
<div class="col-md-3">
<h3>{{ trans('texts.details') }}</h3>
<p>{{ $client->getIdNumber() }}</p>
<p>{{ $client->getVatNumber() }}</p>
<p>{{ $client->getAddress() }}</p>
<p>{{ $client->getCustomFields() }}</p>

View File

@ -341,6 +341,7 @@
{{ Former::legend('organization') }}
{{ Former::text('name')->data_bind("value: name, valueUpdate: 'afterkeydown', attr { placeholder: name.placeholder }") }}
{{ Former::text('id_number')->data_bind("value: id_number, valueUpdate: 'afterkeydown'") }}
{{ Former::text('vat_number')->data_bind("value: vat_number, valueUpdate: 'afterkeydown'") }}
{{ Former::text('website')->data_bind("value: website, valueUpdate: 'afterkeydown'") }}
@ -1222,6 +1223,7 @@
var self = this;
self.public_id = ko.observable(0);
self.name = ko.observable('');
self.id_number = ko.observable('');
self.vat_number = ko.observable('');
self.work_phone = ko.observable('');
self.custom_value1 = ko.observable('');

View File

@ -66,7 +66,7 @@
<div class="col-md-7 info">
<div class="col-md-12 alignCenterText" >
Enter Your Billing Address and Credit Card information
{{ trans('texts.payment_title') }}
</div>
<div class="row">
@ -113,10 +113,10 @@
<div class="row">
<h5 class="col-md-12 boldText" >
*Billing address must match address accociated with credit card.
{{ trans('texts.payment_footer1') }}
</h5>
<h5 class="col-md-12 boldText">
*Please click "PAY NOW" only once - transaction may take up to 1 minute to process
{{ trans('texts.payment_footer2') }}
</h5>
</div>
@ -141,7 +141,7 @@
<div class="col-md-5">
<div class="col-md-12 alignCenterText" >
Balance Due $
{{ trans('texts.balance_due') . ' ' . Utils::formatMoney($amount, $currencyId) }}
</div>
<div class="col-md-12">
<div class="card">
@ -189,7 +189,7 @@
{{ Former::text('cvv') }}
</div>
<div>
<h5 class="boldText" style="margin-top: 8%;margin-left: 5%;"> *This is the 3-4 digit number onthe back of your card</h5>
<h5 class="boldText" style="margin-top: 8%;margin-left: 5%;">{{ trans('texts.payment_cvv') }}</h5>
</div>
<div class="col-md-6">
<!-- <p><span class="glyphicon glyphicon-credit-card" style="margin-right: 10px;"></span><a href="#">Where Do I find CVV?</a></p> -->

View File

@ -117,7 +117,7 @@
</div>
<div class="customMenuDiv" >
<span class="img-wrap shiftLeft" ><img src="{{ asset('images/BestInClassSecurity.png') }}"></span>
<span class="customSubMenu shiftLeft"> Best-in-class data security </span>
<span class="customSubMenu shiftLeft"> Best-in-class security </span>
</div>
<div class="customMenuDiv" >

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -254,7 +254,7 @@ a .cta:hover span {
.hero1.background {
background-repeat: no-repeat;
background-position: center center;
background-attachment: fixed;
/*background-attachment: fixed;*/
background-size: cover;
min-height: 500px;
}

View File

@ -707,6 +707,11 @@ box-shadow: 0px 0px 15px 0px rgba(0, 5, 5, 0.2);
.plans-table a .cta h2 span {background: #1e84a5;}
.checkbox-inline input[type="checkbox"] {
margin-left: 0px !important;
}
#designThumbs img {
border: 1px solid #CCCCCC;
}

View File

@ -576,8 +576,8 @@ function populateInvoiceComboboxes(clientId, invoiceId) {
var client = clientMap[invoice.client.public_id];
if (!client) continue; // client is deleted/archived
$invoiceCombobox.append(new Option(invoice.invoice_number + ' - ' + invoice.invoice_status.name + ' - ' +
getClientDisplayName(client) + ' - ' + formatMoney(invoice.amount, invoice.currency_id) + ' | ' +
formatMoney(invoice.balance, invoice.currency_id), invoice.public_id));
getClientDisplayName(client) + ' - ' + formatMoney(invoice.amount, client.currency_id) + ' | ' +
formatMoney(invoice.balance, client.currency_id), invoice.public_id));
}
$('select#invoice').combobox('refresh');
});
@ -602,7 +602,7 @@ function populateInvoiceComboboxes(clientId, invoiceId) {
var client = clientMap[invoice.client.public_id];
setComboboxValue($('.invoice-select'), invoice.public_id, (invoice.invoice_number + ' - ' +
invoice.invoice_status.name + ' - ' + getClientDisplayName(client) + ' - ' +
formatMoney(invoice.amount, invoice.currency_id) + ' | ' + formatMoney(invoice.balance, invoice.currency_id)));
formatMoney(invoice.amount, client.currency_id) + ' | ' + formatMoney(invoice.balance, client.currency_id)));
$invoiceSelect.trigger('change');
} else if (clientId) {
var client = clientMap[clientId];
@ -637,6 +637,7 @@ function displayAccount(doc, invoice, x, y, layout) {
var data1 = [
account.name,
account.id_number,
account.vat_number,
account.work_email,
account.work_phone
@ -675,6 +676,7 @@ function displayClient(doc, invoice, x, y, layout) {
}
var data = [
getClientDisplayName(client),
client.id_number,
client.vat_number,
concatStrings(client.address1, client.address2),
concatStrings(client.city, client.state, client.postal_code),