From 84a117c84b5588aa03ccda7881766b30d5671bb0 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 14 Jun 2015 15:21:29 +0300 Subject: [PATCH] Added resume option to tasks --- app/Http/Controllers/TaskController.php | 17 +-- app/Ninja/Repositories/TaskRepository.php | 26 +++-- .../2015_05_27_121828_add_tasks.php | 2 +- ...015_06_14_093410_enable_resuming_tasks.php | 55 +++++++++ resources/lang/en/texts.php | 4 +- resources/views/tasks/edit.blade.php | 108 +++++++++++++----- 6 files changed, 166 insertions(+), 46 deletions(-) create mode 100644 database/migrations/2015_06_14_093410_enable_resuming_tasks.php diff --git a/app/Http/Controllers/TaskController.php b/app/Http/Controllers/TaskController.php index 55c1dd53d5b3..cddb2b866f80 100644 --- a/app/Http/Controllers/TaskController.php +++ b/app/Http/Controllers/TaskController.php @@ -65,7 +65,7 @@ class TaskController extends BaseController } return $table->addColumn('start_time', function($model) { return Utils::fromSqlDateTime($model->start_time); }) - ->addColumn('duration', function($model) { return gmdate('H:i:s', $model->duration == -1 ? time() - strtotime($model->start_time) : $model->duration); }) + ->addColumn('duration', function($model) { return gmdate('H:i:s', $model->is_running ? time() - strtotime($model->start_time) : $model->duration); }) ->addColumn('description', function($model) { return $model->description; }) ->addColumn('invoice_number', function($model) { return self::getStatusLabel($model); }) ->addColumn('dropdown', function ($model) { @@ -81,7 +81,7 @@ class TaskController extends BaseController if ($model->invoice_number) { $str .= '
  • ' . link_to("/invoices/{$model->invoice_public_id}/edit", trans('texts.view_invoice')) . '
  • '; - } elseif ($model->duration == -1) { + } elseif ($model->is_running) { $str .= '
  • '.trans('texts.stop_task').'
  • '; } elseif (!$model->deleted_at || $model->deleted_at == '0000-00-00') { $str .= '
  • '.trans('texts.invoice_task').'
  • '; @@ -107,7 +107,7 @@ class TaskController extends BaseController if ($model->invoice_number) { $class = 'success'; $label = trans('texts.invoiced'); - } elseif ($model->duration == -1) { + } elseif ($model->is_running) { $class = 'primary'; $label = trans('texts.running'); } else { @@ -163,8 +163,7 @@ class TaskController extends BaseController 'clientPublicId' => $task->client ? $task->client->public_id : 0, 'method' => 'PUT', 'url' => 'tasks/'.$publicId, - 'title' => trans('texts.edit_task'), - 'duration' => time() - strtotime($task->start_time), + 'title' => trans('texts.edit_task') ]; $data = array_merge($data, self::getViewModel()); @@ -196,11 +195,7 @@ class TaskController extends BaseController Session::flash('message', trans($publicId ? 'texts.updated_task' : 'texts.created_task')); - if (Input::get('action') == 'stop') { - return Redirect::to("tasks"); - } else { - return Redirect::to("tasks/{$task->public_id}/edit"); - } + return Redirect::to("tasks/{$task->public_id}/edit"); } public function bulk() @@ -228,7 +223,7 @@ class TaskController extends BaseController } } - if ($task->duration == -1) { + if ($task->is_running) { Session::flash('error', trans('texts.task_error_running')); return Redirect::to('tasks'); } else if ($task->invoice_id) { diff --git a/app/Ninja/Repositories/TaskRepository.php b/app/Ninja/Repositories/TaskRepository.php index a601ff3a7d2f..2f9fd79c5647 100644 --- a/app/Ninja/Repositories/TaskRepository.php +++ b/app/Ninja/Repositories/TaskRepository.php @@ -23,7 +23,7 @@ class TaskRepository }) ->where('contacts.deleted_at', '=', null) ->where('clients.deleted_at', '=', null) - ->select('tasks.public_id', 'clients.name as client_name', 'clients.public_id as client_public_id', 'contacts.first_name', 'contacts.email', 'contacts.last_name', 'invoices.invoice_status_id', 'tasks.start_time', 'tasks.description', 'tasks.duration', 'tasks.is_deleted', 'tasks.deleted_at', 'invoices.invoice_number', 'invoices.public_id as invoice_public_id'); + ->select('tasks.public_id', 'clients.name as client_name', 'clients.public_id as client_public_id', 'contacts.first_name', 'contacts.email', 'contacts.last_name', 'invoices.invoice_status_id', 'tasks.start_time', 'tasks.description', 'tasks.duration', 'tasks.is_deleted', 'tasks.deleted_at', 'invoices.invoice_number', 'invoices.public_id as invoice_public_id', 'tasks.is_running'); if ($clientPublicId) { $query->where('clients.public_id', '=', $clientPublicId); @@ -58,19 +58,31 @@ class TaskRepository } if (isset($data['description'])) { $task->description = trim($data['description']); - } + } if ($data['action'] == 'start') { $task->start_time = Carbon::now()->toDateTimeString(); - $task->duration = -1; - } else if ($data['action'] == 'stop' && $task->duration == -1) { - $task->duration = strtotime('now') - strtotime($task->start_time); - } else if ($data['action'] == 'save' && $task->duration != -1) { + $task->is_running = true; + } else if ($data['action'] == 'resume') { + $task->break_duration = strtotime('now') - strtotime($task->start_time) + $task->duration; + $task->resume_time = Carbon::now()->toDateTimeString(); + $task->is_running = true; + } else if ($data['action'] == 'stop' && $task->is_running) { + if ($task->resume_time) { + $task->duration = $task->duration + strtotime('now') - strtotime($task->resume_time); + $task->resume_time = null; + } else { + $task->duration = strtotime('now') - strtotime($task->start_time); + } + $task->is_running = false; + } else if ($data['action'] == 'save' && !$task->is_running) { $task->start_time = $data['start_time']; $task->duration = $data['duration']; + $task->break_duration = $data['break_duration']; } - $task->duration = max($task->duration, -1); + $task->duration = max($task->duration, 0); + $task->break_duration = max($task->break_duration, 0); $task->save(); diff --git a/database/migrations/2015_05_27_121828_add_tasks.php b/database/migrations/2015_05_27_121828_add_tasks.php index b02b5fe702c7..c8a0efa9cf1a 100644 --- a/database/migrations/2015_05_27_121828_add_tasks.php +++ b/database/migrations/2015_05_27_121828_add_tasks.php @@ -21,7 +21,7 @@ class AddTasks extends Migration { $table->timestamps(); $table->softDeletes(); - $table->timestamp('start_time'); + $table->timestamp('start_time')->nullable(); $table->integer('duration')->nullable(); $table->string('description')->nullable(); $table->boolean('is_deleted')->default(false); diff --git a/database/migrations/2015_06_14_093410_enable_resuming_tasks.php b/database/migrations/2015_06_14_093410_enable_resuming_tasks.php new file mode 100644 index 000000000000..c92f77478692 --- /dev/null +++ b/database/migrations/2015_06_14_093410_enable_resuming_tasks.php @@ -0,0 +1,55 @@ +boolean('is_running')->default(false); + $table->integer('break_duration')->nullable(); + $table->timestamp('resume_time')->nullable(); + }); + + $tasks = DB::table('tasks') + ->where('duration', '=', -1) + ->select('id', 'duration', 'start_time') + ->get(); + + foreach ($tasks as $task) { + $data = [ + 'is_running' => true, + 'duration' => 0, + + ]; + + DB::table('tasks') + ->where('id', $task->id) + ->update($data); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('tasks', function($table) + { + $table->dropColumn('is_running'); + $table->dropColumn('resume_time'); + $table->dropColumn('end_time'); + }); + } + +} diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index bceeff5f52fe..dfe0899175f5 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -687,6 +687,8 @@ return array( 'pro_plan_feature7' => 'Customize Invoice Field Titles & Numbering', 'pro_plan_feature8' => 'Option to Attach PDFs to Client Emails', - + 'resume' => 'Resume', + 'break_duration' => 'Break', + 'edit_details' => 'Edit Details', ); diff --git a/resources/views/tasks/edit.blade.php b/resources/views/tasks/edit.blade.php index b7010803bf32..8c93c238a207 100644 --- a/resources/views/tasks/edit.blade.php +++ b/resources/views/tasks/edit.blade.php @@ -28,6 +28,7 @@ {!! Former::text('action') !!} {!! Former::text('start_time') !!} {!! Former::text('duration') !!} + {!! Former::text('break_duration') !!}
    @@ -39,21 +40,37 @@ {!! Former::select('client')->addOption('', '')->addGroupClass('client-select') !!} {!! Former::textarea('description')->rows(3) !!} - @if ($task && $task->duration == -1) + @if ($task && $task->is_running)
    @else - @if (!$task) + @if ($task) + +
    + + +
    + + + @else {!! Former::radios('task_type')->radios([ trans('texts.timer') => array('name' => 'task_type', 'value' => 'timer'), trans('texts.manual') => array('name' => 'task_type', 'value' => 'manual'), ])->inline()->check('timer')->label(' ') !!} -