diff --git a/README.md b/README.md index 5f58ffeedf68..af0fc4db125f 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,9 @@ ### [https://www.invoiceninja.com](https://www.invoiceninja.com) ### Introduction -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. [This guide](http://hillelcoren.com/invoice-ninja/self-hosting/) is the simplest way to setup the site. The high level instructions for setting up the site using Git are below but there's also a more detailed [setup guide](http://hillelcoren.com/invoice-ninja/laravel-ubuntu-virtualbox/). -[This guide](http://hillelcoren.com/invoice-ninja/self-hosting/) is the simplest way to setup the site. The high level instructions for setting up the site using Git are below but there's also a more detailed [setup guide](http://hillelcoren.com/invoice-ninja/laravel-ubuntu-virtualbox/). - -For updates follow [@invoiceninja](https://twitter.com/invoiceninja) or join the [Facebook Group](https://www.facebook.com/invoiceninja). For discussion of the code please use the [Google Group](https://groups.google.com/d/forum/invoiceninja). +To connect follow [@invoiceninja](https://twitter.com/invoiceninja) or join the [Facebook Group](https://www.facebook.com/invoiceninja). For discussion of the code please use the [Google Group](https://groups.google.com/d/forum/invoiceninja). If you'd like to translate the site please use [caouecs/Laravel4-long](https://github.com/caouecs/Laravel4-lang) for the starter files. diff --git a/app/controllers/AccountController.php b/app/controllers/AccountController.php index 1e6b4237db06..22a8a1c00407 100755 --- a/app/controllers/AccountController.php +++ b/app/controllers/AccountController.php @@ -78,7 +78,7 @@ class AccountController extends \BaseController { return Response::json($data); } - public function showSection($section = ACCOUNT_DETAILS) + public function showSection($section = ACCOUNT_DETAILS, $subSection = false) { if ($section == ACCOUNT_DETAILS) { @@ -187,7 +187,7 @@ class AccountController extends \BaseController { 'account' => Auth::user()->account ]; - return View::make('accounts.advanced_settings', $data); + return View::make("accounts.{$subSection}", $data); } else if ($section == ACCOUNT_PRODUCTS) { @@ -227,7 +227,14 @@ class AccountController extends \BaseController { } else if ($section == ACCOUNT_ADVANCED_SETTINGS) { - return AccountController::saveAdvancedSettings(); + if ($subSection == ACCOUNT_CUSTOM_FIELDS) + { + return AccountController::saveCustomFields(); + } + else if ($subSection == ACCOUNT_INVOICE_DESIGN) + { + return AccountController::saveInvoiceDesign(); + } } else if ($section == ACCOUNT_PRODUCTS) { @@ -247,23 +254,37 @@ class AccountController extends \BaseController { return Redirect::to('company/products'); } - private function saveAdvancedSettings() + private function saveCustomFields() { - $account = Auth::user()->account; + if (!Auth::user()->account->isPro()) + { + $account = Auth::user()->account; + $account->custom_label1 = Input::get('custom_label1'); + $account->custom_value1 = Input::get('custom_value1'); + $account->custom_label2 = Input::get('custom_label2'); + $account->custom_value2 = Input::get('custom_value2'); + $account->custom_client_label1 = Input::get('custom_client_label1'); + $account->custom_client_label2 = Input::get('custom_client_label2'); + $account->save(); - $account->custom_label1 = Input::get('custom_label1'); - $account->custom_value1 = Input::get('custom_value1'); - $account->custom_label2 = Input::get('custom_label2'); - $account->custom_value2 = Input::get('custom_value2'); - $account->custom_client_label1 = Input::get('custom_client_label1'); - $account->custom_client_label2 = Input::get('custom_client_label2'); + Session::flash('message', trans('texts.updated_settings')); + } - $account->primary_color = Input::get('primary_color');// ? Input::get('primary_color') : null; - $account->secondary_color = Input::get('secondary_color');// ? Input::get('secondary_color') : null; + return Redirect::to('company/advanced_settings'); + } - $account->save(); + private function saveInvoiceDesign() + { + if (!Auth::user()->account->isPro()) + { + $account = Auth::user()->account; + $account->primary_color = Input::get('primary_color');// ? Input::get('primary_color') : null; + $account->secondary_color = Input::get('secondary_color');// ? Input::get('secondary_color') : null; + $account->save(); - Session::flash('message', trans('texts.updated_settings')); + Session::flash('message', trans('texts.updated_settings')); + } + return Redirect::to('company/advanced_settings'); } diff --git a/app/controllers/ReportController.php b/app/controllers/ReportController.php index 7f0e95c25dfa..b872251cb9bc 100755 --- a/app/controllers/ReportController.php +++ b/app/controllers/ReportController.php @@ -24,54 +24,58 @@ class ReportController extends \BaseController { $datasets = []; $labels = []; $maxTotals = 0; - - foreach ([ENTITY_INVOICE, ENTITY_PAYMENT, ENTITY_CREDIT] as $entityType) + $width = 10; + + if (Auth::user()->account->isPro()) { - $records = DB::table($entityType.'s') - ->select(DB::raw('sum(amount) as total, '.$groupBy.'('.$entityType.'_date) as '.$groupBy)) - ->where($entityType.'s.deleted_at', '=', null) - ->where($entityType.'s.'.$entityType.'_date', '>=', $startDate->format('Y-m-d')) - ->where($entityType.'s.'.$entityType.'_date', '<=', $endDate->format('Y-m-d')) - ->groupBy($groupBy); - - $totals = $records->lists('total'); - $dates = $records->lists($groupBy); - $data = array_combine($dates, $totals); - - $interval = new DateInterval('P1'.substr($groupBy, 0, 1)); - $period = new DatePeriod($startDate, $interval, $endDate); - - $totals = []; - - foreach ($period as $d) + foreach ([ENTITY_INVOICE, ENTITY_PAYMENT, ENTITY_CREDIT] as $entityType) { - $dateFormat = $groupBy == 'DAYOFYEAR' ? 'z' : ($groupBy == 'WEEK' ? 'W' : 'n'); - $date = $d->format($dateFormat); - $totals[] = isset($data[$date]) ? $data[$date] : 0; + $records = DB::table($entityType.'s') + ->select(DB::raw('sum(amount) as total, '.$groupBy.'('.$entityType.'_date) as '.$groupBy)) + ->where($entityType.'s.deleted_at', '=', null) + ->where($entityType.'s.'.$entityType.'_date', '>=', $startDate->format('Y-m-d')) + ->where($entityType.'s.'.$entityType.'_date', '<=', $endDate->format('Y-m-d')) + ->groupBy($groupBy); + + $totals = $records->lists('total'); + $dates = $records->lists($groupBy); + $data = array_combine($dates, $totals); + + $interval = new DateInterval('P1'.substr($groupBy, 0, 1)); + $period = new DatePeriod($startDate, $interval, $endDate); - if ($entityType == ENTITY_INVOICE) + $totals = []; + + foreach ($period as $d) { - $labelFormat = $groupBy == 'DAYOFYEAR' ? 'j' : ($groupBy == 'WEEK' ? 'W' : 'F'); - $label = $d->format($labelFormat); - $labels[] = $label; + $dateFormat = $groupBy == 'DAYOFYEAR' ? 'z' : ($groupBy == 'WEEK' ? 'W' : 'n'); + $date = $d->format($dateFormat); + $totals[] = isset($data[$date]) ? $data[$date] : 0; + + if ($entityType == ENTITY_INVOICE) + { + $labelFormat = $groupBy == 'DAYOFYEAR' ? 'j' : ($groupBy == 'WEEK' ? 'W' : 'F'); + $label = $d->format($labelFormat); + $labels[] = $label; + } + } + + $max = max($totals); + + if ($max > 0) + { + $datasets[] = [ + 'totals' => $totals, + 'colors' => $entityType == ENTITY_INVOICE ? '78,205,196' : ($entityType == ENTITY_CREDIT ? '199,244,100' : '255,107,107') + ]; + $maxTotals = max($max, $maxTotals); } } - $max = max($totals); - - if ($max > 0) - { - $datasets[] = [ - 'totals' => $totals, - 'colors' => $entityType == ENTITY_INVOICE ? '78,205,196' : ($entityType == ENTITY_CREDIT ? '199,244,100' : '255,107,107') - ]; - $maxTotals = max($max, $maxTotals); - } + $width = (ceil( $maxTotals / 100 ) * 100) / 10; + $width = max($width, 10); } - $width = (ceil( $maxTotals / 100 ) * 100) / 10; - $width = max($width, 10); - $dateTypes = [ 'DAYOFYEAR' => 'Daily', 'WEEK' => 'Weekly', diff --git a/app/lang/en/texts.php b/app/lang/en/texts.php index 6bf89a1c6213..cc646ae887d4 100644 --- a/app/lang/en/texts.php +++ b/app/lang/en/texts.php @@ -348,5 +348,7 @@ return array( 'specify_colors' => 'Specify colors', 'specify_colors_label' => 'Select the colors used in the invoice', + 'chart_builder' => 'Chart Builder', ); + diff --git a/app/routes.php b/app/routes.php index d26ab474c544..98a06f7b7226 100755 --- a/app/routes.php +++ b/app/routes.php @@ -74,9 +74,12 @@ Route::group(array('before' => 'auth'), function() Route::post('company/products/{product_id?}', 'AccountController@saveProduct'); */ + Route::get('company/advanced_settings/chart_builder', 'ReportController@report'); + Route::post('company/advanced_settings/chart_builder', 'ReportController@report'); + Route::get('account/getSearchData', array('as' => 'getSearchData', 'uses' => 'AccountController@getSearchData')); - Route::get('company/{section?}', 'AccountController@showSection'); - Route::post('company/{section?}', 'AccountController@doSection'); + Route::get('company/{section?}/{sub_section?}', 'AccountController@showSection'); + Route::post('company/{section?}/{sub_section?}', 'AccountController@doSection'); Route::post('user/setTheme', 'UserController@setTheme'); Route::post('remove_logo', 'AccountController@removeLogo'); Route::post('account/go_pro', 'AccountController@enableProPlan'); @@ -104,10 +107,7 @@ Route::group(array('before' => 'auth'), function() Route::resource('credits', 'CreditController'); Route::get('credits/create/{client_id?}/{invoice_id?}', 'CreditController@create'); Route::get('api/credits/{client_id?}', array('as'=>'api.credits', 'uses'=>'CreditController@getDatatable')); - Route::post('credits/bulk', 'CreditController@bulk'); - - Route::get('reports', 'ReportController@report'); - Route::post('reports', 'ReportController@report'); + Route::post('credits/bulk', 'CreditController@bulk'); }); @@ -137,8 +137,12 @@ define('ACCOUNT_IMPORT_EXPORT', 'import_export'); define('ACCOUNT_PAYMENTS', 'payments'); define('ACCOUNT_MAP', 'import_map'); define('ACCOUNT_EXPORT', 'export'); -define('ACCOUNT_ADVANCED_SETTINGS', 'advanced_settings'); define('ACCOUNT_PRODUCTS', 'products'); +define('ACCOUNT_ADVANCED_SETTINGS', 'advanced_settings'); +define('ACCOUNT_CUSTOM_FIELDS', 'custom_fields'); +define('ACCOUNT_INVOICE_DESIGN', 'invoice_design'); +define('ACCOUNT_CHART_BUILDER', 'chart_builder'); + define('DEFAULT_INVOICE_NUMBER', '0001'); define('RECENTLY_VIEWED_LIMIT', 8); @@ -225,7 +229,7 @@ HTML::macro('menu_link', function($type) { $types = $type.'s'; $Type = ucfirst($type); $Types = ucfirst($types); - $class = ( Request::is($types) || Request::is('*'.$type.'*')) ? ' active' : ''; + $class = ( Request::is($types) || Request::is('*'.$type.'*')) && !Request::is('*advanced_settings*') ? ' active' : ''; return '
+ +
+ +@if (!Auth::user()->account->isPro()) +
Free /Always!
$50 /Year
@@ -39,7 +49,7 @@