diff --git a/app/controllers/ActivityController.php b/app/controllers/ActivityController.php index 125e3bd72948..ba8797bb1d00 100755 --- a/app/controllers/ActivityController.php +++ b/app/controllers/ActivityController.php @@ -11,7 +11,6 @@ class ActivityController extends \BaseController ->select('activities.id', 'activities.message', 'activities.created_at', 'clients.currency_id', 'activities.balance', 'activities.adjustment'); return Datatable::query($query) - //->addColumn('blank', function($model) { return ''; }) ->addColumn('id', function ($model) { return Utils::timestampToDateTimeString(strtotime($model->created_at)); }) ->addColumn('message', function ($model) { return Utils::decodeActivity($model->message); }) ->addColumn('balance', function ($model) { return Utils::formatMoney($model->balance, $model->currency_id); }) diff --git a/app/controllers/InvoiceController.php b/app/controllers/InvoiceController.php index d0a889079b80..3eb487d4ce19 100755 --- a/app/controllers/InvoiceController.php +++ b/app/controllers/InvoiceController.php @@ -494,4 +494,50 @@ class InvoiceController extends \BaseController return self::edit($publicId, true); } + + public function invoiceHistory($publicId) + { + $invoice = Invoice::withTrashed()->scope($publicId)->firstOrFail(); + $invoice->load('user', 'invoice_items', 'account.country', 'client.contacts', 'client.country'); + $invoice->invoice_date = Utils::fromSqlDate($invoice->invoice_date); + $invoice->due_date = Utils::fromSqlDate($invoice->due_date); + $invoice->is_pro = Auth::user()->isPro(); + $invoice->is_quote = intval($invoice->is_quote); + + $activityTypeId = $invoice->is_quote ? ACTIVITY_TYPE_UPDATE_QUOTE : ACTIVITY_TYPE_UPDATE_INVOICE; + $activities = Activity::scope(false, $invoice->account_id)->with(['user' => function($query) { + $query->select(['id', 'first_name', 'last_name']); + }])->where('activity_type_id', '=', $activityTypeId)->orderBy('id', 'desc')->get(['id', 'created_at', 'user_id', 'json_backup']); + + $versionsJson = []; + $versionsSelect = []; + $lastId = false; + + foreach ($activities as $activity) { + $backup = json_decode($activity->json_backup); + $backup->invoice_date = Utils::fromSqlDate($backup->invoice_date); + $backup->due_date = Utils::fromSqlDate($backup->due_date); + $backup->is_pro = Auth::user()->isPro(); + $backup->is_quote = intval($backup->is_quote); + + $versionsJson[$activity->id] = $backup; + + $key = Utils::timestampToDateTimeString(strtotime($activity->created_at)) . ' - ' . $activity->user->getDisplayName(); + $versionsSelect[$lastId ? $lastId : 0] = $key; + $lastId = $activity->id; + } + + $versionsSelect[$lastId] = Utils::timestampToDateTimeString(strtotime($invoice->created_at)) . ' - ' . $invoice->user->getDisplayName(); + //dd($versionsSelect); + //dd($activities); + + $data = [ + 'invoice' => $invoice, + 'versionsJson' => json_encode($versionsJson), + 'versionsSelect' => $versionsSelect, + 'invoiceDesigns' => InvoiceDesign::remember(DEFAULT_QUERY_CACHE, 'invoice_designs_cache_'.Auth::user()->maxInvoiceDesignId())->where('id', '<=', Auth::user()->maxInvoiceDesignId())->orderBy('id')->get(), + ]; + + return View::make('invoices.history', $data); + } } diff --git a/app/lang/en/texts.php b/app/lang/en/texts.php index 1be03bccc3ad..115725a4e15a 100644 --- a/app/lang/en/texts.php +++ b/app/lang/en/texts.php @@ -490,5 +490,11 @@ return array( 'reason_for_canceling' => 'Help us improve our site by telling us why you\'re leaving.', 'discount_percent' => 'Percent', 'discount_amount' => 'Amount', - + + 'invoice_history' => 'Invoice History', + 'quote_history' => 'Quote History', + 'current_version' => 'Current version', + 'select_versiony' => 'Select version', + 'view_history' => 'View History', + ); diff --git a/app/models/Activity.php b/app/models/Activity.php index e84d542911be..1eca289b0163 100755 --- a/app/models/Activity.php +++ b/app/models/Activity.php @@ -1,40 +1,5 @@ belongsTo('Account'); } + public function user() + { + return $this->belongsTo('User'); + } + private static function getBlank($entity = false) { $activity = new Activity(); diff --git a/app/ninja/repositories/InvoiceRepository.php b/app/ninja/repositories/InvoiceRepository.php index 1f07ecd01181..5e4c1e723d16 100755 --- a/app/ninja/repositories/InvoiceRepository.php +++ b/app/ninja/repositories/InvoiceRepository.php @@ -144,6 +144,7 @@ class InvoiceRepository if (!$model->deleted_at || $model->deleted_at == '0000-00-00') { $str .= '
  • public_id.'/edit').'">'.trans("texts.edit_{$entityType}").'
  • public_id.'/clone').'">'.trans("texts.clone_{$entityType}").'
  • +
  • public_id}") . '">' . trans("texts.view_history") . '
  • '; if ($model->invoice_status_id < INVOICE_STATUS_SENT) { diff --git a/app/routes.php b/app/routes.php index 7e65bddb7bba..306564b9f74e 100755 --- a/app/routes.php +++ b/app/routes.php @@ -113,6 +113,9 @@ Route::group(array('before' => 'auth'), function() { Route::get('recurring_invoices', 'InvoiceController@recurringIndex'); Route::get('api/recurring_invoices/{client_id?}', array('as'=>'api.recurring_invoices', 'uses'=>'InvoiceController@getRecurringDatatable')); + Route::get('invoices/invoice_history/{invoice_id}', 'InvoiceController@invoiceHistory'); + Route::get('quotes/quote_history/{invoice_id}', 'InvoiceController@invoiceHistory'); + Route::resource('invoices', 'InvoiceController'); Route::get('api/invoices/{client_id?}', array('as'=>'api.invoices', 'uses'=>'InvoiceController@getDatatable')); Route::get('invoices/create/{client_id?}', 'InvoiceController@create'); @@ -192,6 +195,40 @@ define('ACCOUNT_CHART_BUILDER', 'chart_builder'); define('ACCOUNT_USER_MANAGEMENT', 'user_management'); define('ACCOUNT_DATA_VISUALIZATIONS', 'data_visualizations'); +define("ACTIVITY_TYPE_CREATE_CLIENT", 1); +define("ACTIVITY_TYPE_ARCHIVE_CLIENT", 2); +define("ACTIVITY_TYPE_DELETE_CLIENT", 3); + +define("ACTIVITY_TYPE_CREATE_INVOICE", 4); +define("ACTIVITY_TYPE_UPDATE_INVOICE", 5); +define("ACTIVITY_TYPE_EMAIL_INVOICE", 6); +define("ACTIVITY_TYPE_VIEW_INVOICE", 7); +define("ACTIVITY_TYPE_ARCHIVE_INVOICE", 8); +define("ACTIVITY_TYPE_DELETE_INVOICE", 9); + +define("ACTIVITY_TYPE_CREATE_PAYMENT", 10); +define("ACTIVITY_TYPE_UPDATE_PAYMENT", 11); +define("ACTIVITY_TYPE_ARCHIVE_PAYMENT", 12); +define("ACTIVITY_TYPE_DELETE_PAYMENT", 13); + +define("ACTIVITY_TYPE_CREATE_CREDIT", 14); +define("ACTIVITY_TYPE_UPDATE_CREDIT", 15); +define("ACTIVITY_TYPE_ARCHIVE_CREDIT", 16); +define("ACTIVITY_TYPE_DELETE_CREDIT", 17); + +define("ACTIVITY_TYPE_CREATE_QUOTE", 18); +define("ACTIVITY_TYPE_UPDATE_QUOTE", 19); +define("ACTIVITY_TYPE_EMAIL_QUOTE", 20); +define("ACTIVITY_TYPE_VIEW_QUOTE", 21); +define("ACTIVITY_TYPE_ARCHIVE_QUOTE", 22); +define("ACTIVITY_TYPE_DELETE_QUOTE", 23); + +define("ACTIVITY_TYPE_RESTORE_QUOTE", 24); +define("ACTIVITY_TYPE_RESTORE_INVOICE", 25); +define("ACTIVITY_TYPE_RESTORE_CLIENT", 26); +define("ACTIVITY_TYPE_RESTORE_PAYMENT", 27); +define("ACTIVITY_TYPE_RESTORE_CREDIT", 28); + define('DEFAULT_INVOICE_NUMBER', '0001'); define('RECENTLY_VIEWED_LIMIT', 8); define('LOGGED_ERROR_LIMIT', 100); diff --git a/app/views/invoices/edit.blade.php b/app/views/invoices/edit.blade.php index 8d8f8d79e4e8..6f53ad068202 100755 --- a/app/views/invoices/edit.blade.php +++ b/app/views/invoices/edit.blade.php @@ -288,6 +288,7 @@