diff --git a/app/Entities/BaseRepository.php b/app/Entities/BaseRepository.php index 0043165..659ef49 100755 --- a/app/Entities/BaseRepository.php +++ b/app/Entities/BaseRepository.php @@ -4,7 +4,7 @@ namespace App\Entities; use App\Entities\Partners\Customer; use App\Entities\Partners\Vendor; -use App\Entities\Projects\Feature; +use App\Entities\Projects\Job; use App\Entities\Projects\Project; use App\Entities\Users\User; @@ -45,8 +45,8 @@ abstract class BaseRepository extends EloquentRepository return Project::orderBy('name')->pluck('name', 'id'); } - public function requireFeatureById($featureId) + public function requireJobById($jobId) { - return Feature::findOrFail($featureId); + return Job::findOrFail($jobId); } } diff --git a/app/Entities/Payments/Type.php b/app/Entities/Payments/Type.php index 4031c82..0f2a0de 100644 --- a/app/Entities/Payments/Type.php +++ b/app/Entities/Payments/Type.php @@ -8,7 +8,7 @@ class Type extends ReferenceAbstract { protected static $lists = [ 1 => 'project', - 2 => 'add_feature', + 2 => 'add_job', 3 => 'maintenance', ]; diff --git a/app/Entities/Projects/FeaturesRepository.php b/app/Entities/Projects/FeaturesRepository.php deleted file mode 100755 index 8bf41b6..0000000 --- a/app/Entities/Projects/FeaturesRepository.php +++ /dev/null @@ -1,103 +0,0 @@ -model->whereHas('tasks', function($query) { - return $query->where('progress','<',100); - }) - ->whereHas('project', function($query) { - return $query->whereIn('status_id', [2,3]); - }) - ->with(['tasks','project']) - ->get(); - } - - public function requireProjectById($projectId) - { - return Project::findOrFail($projectId); - } - - public function createFeature($featureData, $projectId) - { - $featureData['project_id'] = $projectId; - $featureData['price'] = str_replace('.', '', $featureData['price']); - return $this->storeArray($featureData); - } - - public function createFeatures($featuresData, $projectId) - { - $selectedFeatures = $this->model->whereIn('id', $featuresData['feature_ids'])->get(); - - DB::beginTransaction(); - foreach ($selectedFeatures as $feature) { - $newFeature = $feature->replicate(); - $newFeature->project_id = $projectId; - $newFeature->save(); - - $selectedTasks = $feature->tasks()->whereIn('id', $featuresData[$feature->id . '_task_ids'])->get(); - - foreach ($selectedTasks as $task) { - $newTask = $task->replicate(); - $newTask->progress = 0; - $newTask->feature_id = $newFeature->id; - $newTask->save(); - } - } - DB::commit(); - - return 'ok'; - } - - public function getTasksByFeatureId($featureId) - { - return Task::whereFeatureId($featureId)->get(); - } - - public function requireTaskById($taskId) - { - return Task::findOrFail($taskId); - } - - public function update($featureData = [], $featureId) - { - foreach ($featureData as $key => $value) { - if (!$featureData[$key]) $featureData[$key] = null; - } - - $featureData['price'] = str_replace('.', '', $featureData['price']); - $feature = $this->requireById($featureId); - $feature->update($featureData); - return $feature; - } - - public function tasksReorder($sortedData) - { - $taskOrder = explode(',', $sortedData); - - foreach ($taskOrder as $order => $taskId) { - $task = $this->requireTaskById($taskId); - $task->position = $order + 1; - $task->save(); - } - - return $taskOrder; - } -} \ No newline at end of file diff --git a/app/Entities/Projects/Feature.php b/app/Entities/Projects/Job.php similarity index 78% rename from app/Entities/Projects/Feature.php rename to app/Entities/Projects/Job.php index f82ccc6..f0594a7 100755 --- a/app/Entities/Projects/Feature.php +++ b/app/Entities/Projects/Job.php @@ -2,18 +2,19 @@ namespace App\Entities\Projects; -use App\Entities\Projects\FeaturePresenter; +use App\Entities\Projects\JobPresenter; use App\Entities\Projects\Project; use App\Entities\Users\User; use Illuminate\Database\Eloquent\Model; use Laracasts\Presenter\PresentableTrait; -class Feature extends Model { +class Job extends Model +{ use PresentableTrait; - protected $presenter = FeaturePresenter::class; - protected $guarded = ['id','created_at','updated_at']; + protected $presenter = JobPresenter::class; + protected $guarded = ['id', 'created_at', 'updated_at']; public function project() { diff --git a/app/Entities/Projects/FeaturePresenter.php b/app/Entities/Projects/JobPresenter.php similarity index 50% rename from app/Entities/Projects/FeaturePresenter.php rename to app/Entities/Projects/JobPresenter.php index f4892f8..95d8f4c 100644 --- a/app/Entities/Projects/FeaturePresenter.php +++ b/app/Entities/Projects/JobPresenter.php @@ -4,11 +4,11 @@ namespace App\Entities\Projects; use Laracasts\Presenter\Presenter; -class FeaturePresenter extends Presenter +class JobPresenter extends Presenter { public function workerNameAndEmail() { - return $this->worker_id ? $this->worker->name . ' (' . $this->worker->email . ')' : '-'; + return $this->worker_id ? $this->worker->name.' ('.$this->worker->email.')' : '-'; } public function projectLink() @@ -16,9 +16,9 @@ class FeaturePresenter extends Presenter return link_to_route('projects.show', $this->project->name, [$this->project_id]); } - public function projectFeaturesLink() + public function projectJobsLink() { - return link_to_route('projects.features', trans('project.features'), [$this->project_id]); + return link_to_route('projects.jobs', trans('project.jobs'), [$this->project_id]); } -} \ No newline at end of file +} diff --git a/app/Entities/Projects/JobsRepository.php b/app/Entities/Projects/JobsRepository.php new file mode 100755 index 0000000..971d67b --- /dev/null +++ b/app/Entities/Projects/JobsRepository.php @@ -0,0 +1,106 @@ +model->whereHas('tasks', function ($query) { + return $query->where('progress', '<', 100); + }) + ->whereHas('project', function ($query) { + return $query->whereIn('status_id', [2, 3]); + }) + ->with(['tasks', 'project']) + ->get(); + } + + public function requireProjectById($projectId) + { + return Project::findOrFail($projectId); + } + + public function createJob($jobData, $projectId) + { + $jobData['project_id'] = $projectId; + $jobData['price'] = str_replace('.', '', $jobData['price']); + return $this->storeArray($jobData); + } + + public function createJobs($jobsData, $projectId) + { + $selectedJobs = $this->model->whereIn('id', $jobsData['job_ids'])->get(); + + DB::beginTransaction(); + foreach ($selectedJobs as $job) { + $newJob = $job->replicate(); + $newJob->project_id = $projectId; + $newJob->save(); + + $selectedTasks = $job->tasks()->whereIn('id', $jobsData[$job->id.'_task_ids'])->get(); + + foreach ($selectedTasks as $task) { + $newTask = $task->replicate(); + $newTask->progress = 0; + $newTask->job_id = $newJob->id; + $newTask->save(); + } + } + DB::commit(); + + return 'ok'; + } + + public function getTasksByJobId($jobId) + { + return Task::whereJobId($jobId)->get(); + } + + public function requireTaskById($taskId) + { + return Task::findOrFail($taskId); + } + + public function update($jobData = [], $jobId) + { + foreach ($jobData as $key => $value) { + if (!$jobData[$key]) { + $jobData[$key] = null; + } + + } + + $jobData['price'] = str_replace('.', '', $jobData['price']); + $job = $this->requireById($jobId); + $job->update($jobData); + return $job; + } + + public function tasksReorder($sortedData) + { + $taskOrder = explode(',', $sortedData); + + foreach ($taskOrder as $order => $taskId) { + $task = $this->requireTaskById($taskId); + $task->position = $order + 1; + $task->save(); + } + + return $taskOrder; + } +} diff --git a/app/Entities/Projects/Project.php b/app/Entities/Projects/Project.php index 52ff6c2..bd129c1 100755 --- a/app/Entities/Projects/Project.php +++ b/app/Entities/Projects/Project.php @@ -16,7 +16,7 @@ class Project extends Model use PresentableTrait; protected $presenter = ProjectPresenter::class; - protected $guarded = ['id', 'created_at', 'updated_at']; + protected $guarded = ['id', 'created_at', 'updated_at']; // protected $dates = ['start_date','end_date']; public function nameLink() @@ -24,24 +24,24 @@ class Project extends Model return link_to_route('projects.show', $this->name, [$this->id]); } - public function features() + public function jobs() { - return $this->hasMany(Feature::class)->orderBy('position'); + return $this->hasMany(Job::class)->orderBy('position'); } public function tasks() { - return $this->hasManyThrough(Task::class, Feature::class); + return $this->hasManyThrough(Task::class, Job::class); } - public function mainFeatures() + public function mainJobs() { - return $this->hasMany(Feature::class)->orderBy('position')->whereTypeId(1); + return $this->hasMany(Job::class)->orderBy('position')->whereTypeId(1); } - public function additionalFeatures() + public function additionalJobs() { - return $this->hasMany(Feature::class)->orderBy('position')->whereTypeId(2); + return $this->hasMany(Job::class)->orderBy('position')->whereTypeId(2); } public function subscriptions() @@ -78,15 +78,15 @@ class Project extends Model }); } - public function getFeatureOveralProgress() + public function getJobOveralProgress() { $overalProgress = 0; - $this->load('features.tasks'); - $totalPrice = $this->features->sum('price'); + $this->load('jobs.tasks'); + $totalPrice = $this->jobs->sum('price'); - foreach ($this->features as $feature) { - $progress = $feature->tasks->avg('progress'); - $index = $totalPrice ? ($feature->price / $totalPrice) : 1; + foreach ($this->jobs as $job) { + $progress = $job->tasks->avg('progress'); + $index = $totalPrice ? ($job->price / $totalPrice) : 1; $overalProgress += $progress * $index; } @@ -100,13 +100,13 @@ class Project extends Model public function getCollectibeEarnings() { - // Collectible earnings is total of (price * avg task progress of each feature) + // Collectible earnings is total of (price * avg task progress of each job) $collectibeEarnings = 0; - $this->load('features.tasks'); + $this->load('jobs.tasks'); - foreach ($this->features as $feature) { - $progress = $feature->tasks->avg('progress'); - $collectibeEarnings += ($progress / 100) * $feature->price; + foreach ($this->jobs as $job) { + $progress = $job->tasks->avg('progress'); + $collectibeEarnings += ($progress / 100) * $job->price; } return $collectibeEarnings; diff --git a/app/Entities/Projects/ProjectsRepository.php b/app/Entities/Projects/ProjectsRepository.php index f53a869..587ac29 100755 --- a/app/Entities/Projects/ProjectsRepository.php +++ b/app/Entities/Projects/ProjectsRepository.php @@ -77,12 +77,12 @@ class ProjectsRepository extends BaseRepository // Delete project payments $project->payments()->delete(); - // Delete features tasks - $featureIds = $project->features->pluck('id')->all(); - DB::table('tasks')->whereIn('feature_id', $featureIds)->delete(); + // Delete jobs tasks + $jobIds = $project->jobs->pluck('id')->all(); + DB::table('tasks')->whereIn('job_id', $jobIds)->delete(); - // Delete features - $project->features()->delete(); + // Delete jobs + $project->jobs()->delete(); // Delete project $project->delete(); @@ -91,9 +91,9 @@ class ProjectsRepository extends BaseRepository return 'deleted'; } - public function getProjectFeatures($projectId, $type = null) + public function getProjectJobs($projectId, $type = null) { - return Feature::where(function ($query) use ($projectId, $type) { + return Job::where(function ($query) use ($projectId, $type) { $query->whereProjectId($projectId); if ($type) { $query->whereTypeId($type); @@ -111,15 +111,15 @@ class ProjectsRepository extends BaseRepository return $project; } - public function featuresReorder($sortedData) + public function jobsReorder($sortedData) { - $featureOrder = explode(',', $sortedData); - foreach ($featureOrder as $order => $featureId) { - $feature = $this->requireFeatureById($featureId); - $feature->position = $order + 1; - $feature->save(); + $jobOrder = explode(',', $sortedData); + foreach ($jobOrder as $order => $jobId) { + $job = $this->requireJobById($jobId); + $job->position = $order + 1; + $job->save(); } - return $featureOrder; + return $jobOrder; } } diff --git a/app/Entities/Projects/Task.php b/app/Entities/Projects/Task.php index b4b6f9e..88db231 100755 --- a/app/Entities/Projects/Task.php +++ b/app/Entities/Projects/Task.php @@ -3,20 +3,20 @@ namespace App\Entities\Projects; use App\Entities\Projects\TaskPresenter; -use App\Entities\Users\User; use Illuminate\Database\Eloquent\Model; use Laracasts\Presenter\PresentableTrait; -class Task extends Model { +class Task extends Model +{ use PresentableTrait; protected $presenter = TaskPresenter::class; - protected $guarded = ['id','created_at','updated_at']; + protected $guarded = ['id', 'created_at', 'updated_at']; - public function feature() + public function job() { - return $this->belongsTo(Feature::class, 'project_id'); + return $this->belongsTo(Job::class, 'project_id'); } } diff --git a/app/Entities/Projects/TasksRepository.php b/app/Entities/Projects/TasksRepository.php index 9042427..10723f1 100755 --- a/app/Entities/Projects/TasksRepository.php +++ b/app/Entities/Projects/TasksRepository.php @@ -5,8 +5,8 @@ namespace App\Entities\Projects; use App\Entities\BaseRepository; /** -* Tasks Repository Class -*/ + * Tasks Repository Class + */ class TasksRepository extends BaseRepository { protected $model; @@ -16,14 +16,14 @@ class TasksRepository extends BaseRepository parent::__construct($model); } - public function createTask($taskData, $featureId) + public function createTask($taskData, $jobId) { - $taskData['feature_id'] = $featureId; + $taskData['job_id'] = $jobId; return $this->storeArray($taskData); } - public function getTasksByFeatureId($featureId) + public function getTasksByJobId($jobId) { - return Task::whereTaskId($featureId)->get(); + return Task::whereTaskId($jobId)->get(); } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Api/ProjectsController.php b/app/Http/Controllers/Api/ProjectsController.php index 903e806..f7aecb6 100644 --- a/app/Http/Controllers/Api/ProjectsController.php +++ b/app/Http/Controllers/Api/ProjectsController.php @@ -24,13 +24,13 @@ class ProjectsController extends Controller return $this->repo->requireById($id); } - public function features($id) + public function jobs($id) { $project = $this->repo->requireById($id); - // $project->load('features.tasks'); + // $project->load('jobs.tasks'); $response = fractal() ->item($project->toArray()) - ->transformWith(function($project) { + ->transformWith(function ($project) { return $project; }) ->toArray(); diff --git a/app/Http/Controllers/Projects/FeaturesController.php b/app/Http/Controllers/Projects/FeaturesController.php deleted file mode 100755 index 1804670..0000000 --- a/app/Http/Controllers/Projects/FeaturesController.php +++ /dev/null @@ -1,124 +0,0 @@ -repo = $repo; - } - - public function index() - { - $features = $this->repo->getUnfinishedFeatures(); - return view('features.unfinished', compact('features')); - } - - public function create($projectId) - { - $project = $this->repo->requireProjectById($projectId); - $workers = $this->repo->getWorkersList(); - return view('features.create',compact('project','workers')); - } - - public function addFromOtherProject(Request $req, $projectId) - { - $selectedProject = null; - $project = $this->repo->requireProjectById($projectId); - $workers = $this->repo->getWorkersList(); - $projects = $this->repo->getProjectsList(); - - if ($req->has('project_id')) { - $selectedProject = $this->repo->requireProjectById($req->get('project_id')); - } - return view('features.add-from-other-project',compact('project','workers','projects','selectedProject')); - } - - public function store(CreateRequest $req, $projectId) - { - $feature = $this->repo->createFeature($req->except('_token'), $projectId); - flash()->success(trans('feature.created')); - return redirect()->route('features.show', $feature->id); - } - - public function storeFromOtherProject(Request $req, $projectId) - { - $this->repo->createFeatures($req->except('_token'), $projectId); - flash()->success(trans('feature.created_from_other_project')); - return redirect()->route('projects.features', $projectId); - } - - public function show(Request $req, $featureId) - { - $editableTask = null; - $feature = $this->repo->requireById($featureId); - - if ($req->get('action') == 'task_edit' && $req->has('task_id')) { - $editableTask = $this->repo->requireTaskById($req->get('task_id')); - } - - if ($req->get('action') == 'task_delete' && $req->has('task_id')) { - $editableTask = $this->repo->requireTaskById($req->get('task_id')); - } - - return view('features.show', compact('feature','editableTask')); - } - - public function edit($featureId) - { - $feature = $this->repo->requireById($featureId); - $workers = $this->repo->getWorkersList(); - return view('features.edit',compact('feature','workers')); - } - - public function update(UpdateRequest $req, $featureId) - { - $feature = $this->repo->update($req->except(['_method','_token']), $featureId); - flash()->success(trans('feature.updated')); - return redirect()->route('features.show', $feature->id); - } - - public function delete($featureId) - { - $feature = $this->repo->requireById($featureId); - return view('features.delete', compact('feature')); - } - - public function destroy(DeleteRequest $req, $featureId) - { - $feature = $this->repo->requireById($featureId); - $projectId = $feature->project_id; - if ($featureId == $req->get('feature_id')) - { - $feature->tasks()->delete(); - $feature->delete(); - flash()->success(trans('feature.deleted')); - } - else - flash()->error(trans('feature.undeleted')); - - return redirect()->route('projects.features', $projectId); - } - - public function tasksReorder(Request $req, $featureId) - { - if ($req->ajax()) { - $data = $this->repo->tasksReorder($req->get('postData')); - return 'oke'; - } - - return null; - } - -} diff --git a/app/Http/Controllers/Projects/FilesController.php b/app/Http/Controllers/Projects/FilesController.php index 2f4e1cf..26bd109 100644 --- a/app/Http/Controllers/Projects/FilesController.php +++ b/app/Http/Controllers/Projects/FilesController.php @@ -4,9 +4,8 @@ namespace App\Http\Controllers\Projects; use App\Entities\Projects\File; use App\Http\Controllers\Controller; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Http\Request; use File as FileSystem; +use Illuminate\Http\Request; class FilesController extends Controller { @@ -17,7 +16,7 @@ class FilesController extends Controller public function index(Request $request, $fileableId) { $editableFile = null; - $fileableType = $request->segment(1); // projects, features + $fileableType = $request->segment(1); // projects, jobs $modelName = $this->getModelName($fileableType); $modelShortName = $this->getModelShortName($modelName); $model = $modelName::findOrFail($fileableId); @@ -33,10 +32,10 @@ class FilesController extends Controller public function create(Request $request, $fileableId) { $this->validate($request, [ - 'fileable_type' => 'required', - 'file' => 'required|file|max:10000', - 'title' => 'required|max:60', - 'description' => 'nullable|max:255', + 'fileable_type' => 'required', + 'file' => 'required|file|max:10000', + 'title' => 'required|max:60', + 'description' => 'nullable|max:255', ]); $fileableExist = array_search($request->get('fileable_type'), $this->fileableTypes); @@ -44,12 +43,15 @@ class FilesController extends Controller if ($fileableExist) { $file = $this->proccessPhotoUpload($request->except('_token'), $request->get('fileable_type'), $fileableId); - if ($file->exists) + if ($file->exists) { flash()->success('Upload file berhasil.'); - else + } else { flash()->error('Upload file gagal, coba kembali.'); - } else + } + + } else { flash()->error('Upload file gagal, coba kembali.'); + } return back(); } @@ -109,7 +111,6 @@ class FilesController extends Controller return $file; } - public function getModelName($fileableType) { return isset($this->fileableTypes[$fileableType]) ? $this->fileableTypes[$fileableType] : false; diff --git a/app/Http/Controllers/Projects/JobsController.php b/app/Http/Controllers/Projects/JobsController.php new file mode 100755 index 0000000..64335e5 --- /dev/null +++ b/app/Http/Controllers/Projects/JobsController.php @@ -0,0 +1,123 @@ +repo = $repo; + } + + public function index() + { + $jobs = $this->repo->getUnfinishedJobs(); + return view('jobs.unfinished', compact('jobs')); + } + + public function create($projectId) + { + $project = $this->repo->requireProjectById($projectId); + $workers = $this->repo->getWorkersList(); + return view('jobs.create', compact('project', 'workers')); + } + + public function addFromOtherProject(Request $req, $projectId) + { + $selectedProject = null; + $project = $this->repo->requireProjectById($projectId); + $workers = $this->repo->getWorkersList(); + $projects = $this->repo->getProjectsList(); + + if ($req->has('project_id')) { + $selectedProject = $this->repo->requireProjectById($req->get('project_id')); + } + return view('jobs.add-from-other-project', compact('project', 'workers', 'projects', 'selectedProject')); + } + + public function store(CreateRequest $req, $projectId) + { + $job = $this->repo->createJob($req->except('_token'), $projectId); + flash()->success(trans('job.created')); + return redirect()->route('jobs.show', $job->id); + } + + public function storeFromOtherProject(Request $req, $projectId) + { + $this->repo->createJobs($req->except('_token'), $projectId); + flash()->success(trans('job.created_from_other_project')); + return redirect()->route('projects.jobs', $projectId); + } + + public function show(Request $req, $jobId) + { + $editableTask = null; + $job = $this->repo->requireById($jobId); + + if ($req->get('action') == 'task_edit' && $req->has('task_id')) { + $editableTask = $this->repo->requireTaskById($req->get('task_id')); + } + + if ($req->get('action') == 'task_delete' && $req->has('task_id')) { + $editableTask = $this->repo->requireTaskById($req->get('task_id')); + } + + return view('jobs.show', compact('job', 'editableTask')); + } + + public function edit($jobId) + { + $job = $this->repo->requireById($jobId); + $workers = $this->repo->getWorkersList(); + return view('jobs.edit', compact('job', 'workers')); + } + + public function update(UpdateRequest $req, $jobId) + { + $job = $this->repo->update($req->except(['_method', '_token']), $jobId); + flash()->success(trans('job.updated')); + return redirect()->route('jobs.show', $job->id); + } + + public function delete($jobId) + { + $job = $this->repo->requireById($jobId); + return view('jobs.delete', compact('job')); + } + + public function destroy(DeleteRequest $req, $jobId) + { + $job = $this->repo->requireById($jobId); + $projectId = $job->project_id; + if ($jobId == $req->get('job_id')) { + $job->tasks()->delete(); + $job->delete(); + flash()->success(trans('job.deleted')); + } else { + flash()->error(trans('job.undeleted')); + } + + return redirect()->route('projects.jobs', $projectId); + } + + public function tasksReorder(Request $req, $jobId) + { + if ($req->ajax()) { + $data = $this->repo->tasksReorder($req->get('postData')); + return 'oke'; + } + + return null; + } + +} diff --git a/app/Http/Controllers/Projects/ProjectsController.php b/app/Http/Controllers/Projects/ProjectsController.php index 84e7a33..da6cee1 100755 --- a/app/Http/Controllers/Projects/ProjectsController.php +++ b/app/Http/Controllers/Projects/ProjectsController.php @@ -81,11 +81,11 @@ class ProjectsController extends Controller return redirect()->route('projects.index'); } - public function features($projectId) + public function jobs($projectId) { $project = $this->repo->requireById($projectId); - $features = $this->repo->getProjectFeatures($projectId); - return view('projects.features', compact('project', 'features')); + $jobs = $this->repo->getProjectJobs($projectId); + return view('projects.jobs', compact('project', 'jobs')); } public function subscriptions($projectId) @@ -94,28 +94,28 @@ class ProjectsController extends Controller return view('projects.subscriptions', compact('project')); } - public function featuresExport(Request $request, $projectId, $exportType = 'excel') + public function jobsExport(Request $request, $projectId, $exportType = 'excel') { - $featureType = $request->get('feature_type', 1); + $jobType = $request->get('job_type', 1); $project = $this->repo->requireById($projectId); - $features = $this->repo->getProjectFeatures($projectId, $featureType); + $jobs = $this->repo->getProjectJobs($projectId, $jobType); if ($exportType == 'excel') { - return view('projects.features-export-excel', compact('project', 'features')); - \Excel::create(str_slug(trans('project.features').'-'.$project->name), function ($excel) use ($project, $features) { - $excel->sheet('testng', function ($sheet) use ($project, $features) { - $sheet->loadView('projects.features-export-excel', compact('project', 'features')); + return view('projects.jobs-export-excel', compact('project', 'jobs')); + \Excel::create(str_slug(trans('project.jobs').'-'.$project->name), function ($excel) use ($project, $jobs) { + $excel->sheet('testng', function ($sheet) use ($project, $jobs) { + $sheet->loadView('projects.jobs-export-excel', compact('project', 'jobs')); }); })->download('xls'); } elseif ($exportType == 'excel-progress') { - return view('projects.features-export-progress-excel', compact('project', 'features')); - \Excel::create(str_slug(trans('project.features').'-'.$project->name), function ($excel) use ($project, $features) { - $excel->sheet('export-progress', function ($sheet) use ($project, $features) { - $sheet->loadView('projects.features-export-progress-excel', compact('project', 'features')); + return view('projects.jobs-export-progress-excel', compact('project', 'jobs')); + \Excel::create(str_slug(trans('project.jobs').'-'.$project->name), function ($excel) use ($project, $jobs) { + $excel->sheet('export-progress', function ($sheet) use ($project, $jobs) { + $sheet->loadView('projects.jobs-export-progress-excel', compact('project', 'jobs')); }); })->download('xls'); } else { - return view('projects.features-export-html-2', compact('project', 'features')); + return view('projects.jobs-export-html-2', compact('project', 'jobs')); } } @@ -133,10 +133,10 @@ class ProjectsController extends Controller return redirect()->route('projects.show', $projectId); } - public function featuresReorder(Request $request, $projectId) + public function jobsReorder(Request $request, $projectId) { if ($request->ajax()) { - $data = $this->repo->featuresReorder($request->get('postData')); + $data = $this->repo->jobsReorder($request->get('postData')); return 'oke'; } diff --git a/app/Http/Controllers/Projects/TasksController.php b/app/Http/Controllers/Projects/TasksController.php index a65c2e5..3bfbd37 100755 --- a/app/Http/Controllers/Projects/TasksController.php +++ b/app/Http/Controllers/Projects/TasksController.php @@ -2,51 +2,49 @@ namespace App\Http\Controllers\Projects; +use App\Entities\Projects\TasksRepository; +use App\Http\Controllers\Controller; use App\Http\Requests\Tasks\CreateRequest; -use App\Http\Requests\Tasks\UpdateRequest; use App\Http\Requests\Tasks\DeleteRequest; -use App\Http\Controllers\Controller; -use App\Entities\Projects\TasksRepository; +use App\Http\Requests\Tasks\UpdateRequest; -use Illuminate\Http\Request; - -class TasksController extends Controller { - - private $repo; - - public function __construct(TasksRepository $repo) - { - $this->repo = $repo; - } - - public function store(CreateRequest $req, $featureId) - { - $feature = $this->repo->createTask($req->except('_token'), $featureId); - flash()->success(trans('task.created')); - return redirect()->route('features.show', $featureId); - } - - public function update(UpdateRequest $req, $taskId) - { - $task = $this->repo->update($req->except(['_method','_token']), $taskId); - flash()->success(trans('task.updated')); - return redirect()->route('features.show', $task->feature_id); - } - - public function destroy(DeleteRequest $req, $taskId) - { - $task = $this->repo->requireById($taskId); - $featureId = $task->feature_id; - - if ($taskId == $req->get('task_id')) - { - $task->delete(); - flash()->success(trans('task.deleted')); - } - else - flash()->error(trans('task.undeleted')); - - return redirect()->route('features.show', $featureId); - } +class TasksController extends Controller +{ + + private $repo; + + public function __construct(TasksRepository $repo) + { + $this->repo = $repo; + } + + public function store(CreateRequest $req, $jobId) + { + $job = $this->repo->createTask($req->except('_token'), $jobId); + flash()->success(trans('task.created')); + return redirect()->route('jobs.show', $jobId); + } + + public function update(UpdateRequest $req, $taskId) + { + $task = $this->repo->update($req->except(['_method', '_token']), $taskId); + flash()->success(trans('task.updated')); + return redirect()->route('jobs.show', $task->job_id); + } + + public function destroy(DeleteRequest $req, $taskId) + { + $task = $this->repo->requireById($taskId); + $jobId = $task->job_id; + + if ($taskId == $req->get('task_id')) { + $task->delete(); + flash()->success(trans('task.deleted')); + } else { + flash()->error(trans('task.undeleted')); + } + + return redirect()->route('jobs.show', $jobId); + } } diff --git a/app/Http/Requests/Features/DeleteRequest.php b/app/Http/Requests/Features/DeleteRequest.php deleted file mode 100644 index 4ed539e..0000000 --- a/app/Http/Requests/Features/DeleteRequest.php +++ /dev/null @@ -1,34 +0,0 @@ -get('project_id')); - return auth()->user()->can('manage_features', $project); - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - return [ - 'feature_id' => 'required', - 'project_id' => 'required', - ]; - } - -} diff --git a/app/Http/Requests/Features/UpdateRequest.php b/app/Http/Requests/Features/UpdateRequest.php deleted file mode 100644 index 05022c5..0000000 --- a/app/Http/Requests/Features/UpdateRequest.php +++ /dev/null @@ -1,37 +0,0 @@ -get('project_id')); - return auth()->user()->can('manage_features', $project); - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - return [ - 'name' => 'required|max:60', - 'price' => 'required', - 'worker_id' => 'required|numeric', - 'type_id' => 'required|numeric', - 'description' => 'max:255', - ]; - } - -} diff --git a/app/Http/Requests/Features/CreateRequest.php b/app/Http/Requests/Jobs/CreateRequest.php similarity index 87% rename from app/Http/Requests/Features/CreateRequest.php rename to app/Http/Requests/Jobs/CreateRequest.php index f4d2604..0e7724f 100644 --- a/app/Http/Requests/Features/CreateRequest.php +++ b/app/Http/Requests/Jobs/CreateRequest.php @@ -1,6 +1,6 @@ segment(2)); - return auth()->user()->can('manage_features', $project); + return auth()->user()->can('manage_jobs', $project); } /** diff --git a/app/Http/Requests/Jobs/DeleteRequest.php b/app/Http/Requests/Jobs/DeleteRequest.php new file mode 100644 index 0000000..dd01ec3 --- /dev/null +++ b/app/Http/Requests/Jobs/DeleteRequest.php @@ -0,0 +1,35 @@ +get('project_id')); + return auth()->user()->can('manage_jobs', $project); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'job_id' => 'required', + 'project_id' => 'required', + ]; + } + +} diff --git a/app/Http/Requests/Jobs/UpdateRequest.php b/app/Http/Requests/Jobs/UpdateRequest.php new file mode 100644 index 0000000..a8fadb8 --- /dev/null +++ b/app/Http/Requests/Jobs/UpdateRequest.php @@ -0,0 +1,38 @@ +get('project_id')); + return auth()->user()->can('manage_jobs', $project); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'name' => 'required|max:60', + 'price' => 'required', + 'worker_id' => 'required|numeric', + 'type_id' => 'required|numeric', + 'description' => 'max:255', + ]; + } + +} diff --git a/app/Http/Requests/Tasks/CreateRequest.php b/app/Http/Requests/Tasks/CreateRequest.php index 48d0fae..f125d55 100644 --- a/app/Http/Requests/Tasks/CreateRequest.php +++ b/app/Http/Requests/Tasks/CreateRequest.php @@ -2,35 +2,35 @@ namespace App\Http\Requests\Tasks; -use App\Entities\Projects\Feature; +use App\Entities\Projects\Job; use App\Http\Requests\Request; -class CreateRequest extends Request { +class CreateRequest extends Request +{ + /** + * Determine if the user is authorized to make this request. + * + * @return bool + */ + public function authorize() + { + $job = Job::findOrFail($this->segment(2)); + return auth()->user()->can('manage_job', $job); + } - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - $feature = Feature::findOrFail($this->segment(2)); - return auth()->user()->can('manage_feature', $feature); - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - return [ - 'name' => 'required|max:60', - 'description' => 'max:255', - 'progress' => 'numeric|max:100', - 'route_name' => 'max:255', - ]; - } + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'name' => 'required|max:60', + 'description' => 'max:255', + 'progress' => 'numeric|max:100', + 'route_name' => 'max:255', + ]; + } } diff --git a/app/Http/Requests/Tasks/DeleteRequest.php b/app/Http/Requests/Tasks/DeleteRequest.php index 4842516..a06778f 100644 --- a/app/Http/Requests/Tasks/DeleteRequest.php +++ b/app/Http/Requests/Tasks/DeleteRequest.php @@ -2,33 +2,34 @@ namespace App\Http\Requests\Tasks; -use App\Entities\Projects\Feature; +use App\Entities\Projects\Job; use App\Http\Requests\Request; -class DeleteRequest extends Request { +class DeleteRequest extends Request +{ - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - $feature = Feature::findOrFail($this->get('feature_id')); - return auth()->user()->can('manage_feature', $feature); - } + /** + * Determine if the user is authorized to make this request. + * + * @return bool + */ + public function authorize() + { + $job = Job::findOrFail($this->get('job_id')); + return auth()->user()->can('manage_job', $job); + } - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - return [ - 'task_id' => 'required', - 'feature_id' => 'required', - ]; - } + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'task_id' => 'required', + 'job_id' => 'required', + ]; + } } diff --git a/app/Http/Requests/Tasks/UpdateRequest.php b/app/Http/Requests/Tasks/UpdateRequest.php index 0d393da..754b26e 100644 --- a/app/Http/Requests/Tasks/UpdateRequest.php +++ b/app/Http/Requests/Tasks/UpdateRequest.php @@ -2,35 +2,36 @@ namespace App\Http\Requests\Tasks; -use App\Entities\Projects\Feature; +use App\Entities\Projects\Job; use App\Http\Requests\Request; -class UpdateRequest extends Request { +class UpdateRequest extends Request +{ - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - $feature = Feature::findOrFail($this->get('feature_id')); - return auth()->user()->can('manage_feature', $feature); - } + /** + * Determine if the user is authorized to make this request. + * + * @return bool + */ + public function authorize() + { + $job = Job::findOrFail($this->get('job_id')); + return auth()->user()->can('manage_job', $job); + } - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - return [ - 'name' => 'required|max:60', - 'description' => 'max:255', - 'progress' => 'numeric|max:100', - 'route_name' => 'max:255', - ]; - } + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'name' => 'required|max:60', + 'description' => 'max:255', + 'progress' => 'numeric|max:100', + 'route_name' => 'max:255', + ]; + } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 5a3bbf4..d6d8232 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -49,12 +49,12 @@ class AuthServiceProvider extends ServiceProvider return true; }); - Gate::define('manage_features', function ($user, $project) { + Gate::define('manage_jobs', function ($user, $project) { return true; }); - Gate::define('manage_feature', function ($user, $feature) { - return $user->id == $feature->worker_id; + Gate::define('manage_job', function ($user, $job) { + return $user->id == $job->worker_id; }); } diff --git a/config/queue.php b/config/queue.php index 6c2b7d2..85d79eb 100644 --- a/config/queue.php +++ b/config/queue.php @@ -37,7 +37,7 @@ return [ 'database' => [ 'driver' => 'database', - 'table' => 'jobs', + 'table' => 'laravel_jobs', 'queue' => 'default', 'expire' => 60, ], diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index 102d8df..8faedc8 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -1,7 +1,7 @@ define(User::class, function (Faker\Generator $faker) { return [ - 'name' => $faker->name, - 'email' => $faker->unique()->email, - 'password' => 'member', + 'name' => $faker->name, + 'email' => $faker->unique()->email, + 'password' => 'member', 'remember_token' => str_random(10), - 'api_token' => str_random(32), + 'api_token' => str_random(32), ]; }); -$factory->define(Feature::class, function (Faker\Generator $faker) { +$factory->define(Job::class, function (Faker\Generator $faker) { return [ - 'project_id' => function () { + 'project_id' => function () { return factory(Project::class)->create()->id; }, - 'name' => $faker->sentence(3), - 'price' => rand(1, 10) * 100000, + 'name' => $faker->sentence(3), + 'price' => rand(1, 10) * 100000, 'description' => $faker->paragraph, - 'worker_id' => function () { + 'worker_id' => function () { return factory(User::class)->create()->id; }, - 'type_id' => 1, // Main feature - 'position' => rand(1, 10), + 'type_id' => 1, // Main job + 'position' => rand(1, 10), ]; }); $factory->define(Task::class, function (Faker\Generator $faker) { return [ - 'feature_id' => function () { - return factory(Feature::class)->create()->id; + 'job_id' => function () { + return factory(Job::class)->create()->id; }, - 'name' => $faker->sentence(3), + 'name' => $faker->sentence(3), 'description' => $faker->paragraph, - 'progress' => rand(40, 100), - 'route_name' => implode('.', $faker->words(3)), - 'position' => rand(1, 10), + 'progress' => rand(40, 100), + 'route_name' => implode('.', $faker->words(3)), + 'position' => rand(1, 10), ]; }); $factory->define(Event::class, function (Faker\Generator $faker) { return [ - 'user_id' => function () { + 'user_id' => function () { return factory(User::class)->create()->id; }, 'project_id' => function () { return factory(Project::class)->create()->id; }, - 'title' => $faker->words(rand(2, 4), true), - 'body' => $faker->sentence, - 'start' => $faker->dateTimeBetween('-2 months', '-2 months')->format('Y-m-d H:i:s'), - 'end' => $faker->dateTimeBetween('-2 months', '-2 months')->format('Y-m-d H:i:s'), - 'is_allday' => rand(0, 1), + 'title' => $faker->words(rand(2, 4), true), + 'body' => $faker->sentence, + 'start' => $faker->dateTimeBetween('-2 months', '-2 months')->format('Y-m-d H:i:s'), + 'end' => $faker->dateTimeBetween('-2 months', '-2 months')->format('Y-m-d H:i:s'), + 'is_allday' => rand(0, 1), ]; }); @@ -70,11 +70,11 @@ $factory->define(Invoice::class, function (Faker\Generator $faker) { 'project_id' => function () { return factory(Project::class)->create()->id; }, - 'number' => (new Invoice)->generateNewNumber(), - 'items' => [], - 'amount' => 100000, - 'notes' => $faker->paragraph, - 'status_id' => 1, + 'number' => (new Invoice)->generateNewNumber(), + 'items' => [], + 'amount' => 100000, + 'notes' => $faker->paragraph, + 'status_id' => 1, 'creator_id' => function () { return factory(User::class)->create()->id; }, diff --git a/database/migrations/2016_07_09_093439_create_features_table.php b/database/migrations/2016_07_09_093439_create_features_table.php deleted file mode 100644 index cb7a43e..0000000 --- a/database/migrations/2016_07_09_093439_create_features_table.php +++ /dev/null @@ -1,40 +0,0 @@ -increments('id'); - $table->integer('project_id')->unsigned(); - $table->string('name', 60); - $table->string('description')->nullable(); - $table->integer('worker_id')->unsigned()->nullable(); - $table->integer('price')->unsigned()->default(0); - $table->boolean('type_id')->default(1)->comment('1: main, 2: additional'); - $table->boolean('position')->default(0); - $table->timestamps(); - }); - } - - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('features'); - } - -} diff --git a/database/migrations/2016_07_09_093439_create_jobs_table.php b/database/migrations/2016_07_09_093439_create_jobs_table.php new file mode 100644 index 0000000..d78b412 --- /dev/null +++ b/database/migrations/2016_07_09_093439_create_jobs_table.php @@ -0,0 +1,39 @@ +increments('id'); + $table->integer('project_id')->unsigned(); + $table->string('name', 60); + $table->string('description')->nullable(); + $table->integer('worker_id')->unsigned()->nullable(); + $table->integer('price')->unsigned()->default(0); + $table->boolean('type_id')->default(1)->comment('1: main, 2: additional'); + $table->boolean('position')->default(0); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('jobs'); + } + +} diff --git a/database/migrations/2016_07_09_142833_create_tasks_table.php b/database/migrations/2016_07_09_142833_create_tasks_table.php index 2d8049b..3f39423 100644 --- a/database/migrations/2016_07_09_142833_create_tasks_table.php +++ b/database/migrations/2016_07_09_142833_create_tasks_table.php @@ -3,37 +3,36 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; -class CreateTasksTable extends Migration { +class CreateTasksTable extends Migration +{ - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - Schema::create('tasks', function(Blueprint $table) - { - $table->increments('id'); - $table->integer('feature_id')->unsigned(); - $table->string('name', 60); - $table->string('description')->nullable(); - $table->boolean('progress')->default(0); - $table->string('route_name')->nullable(); - $table->boolean('position')->default(0); - $table->timestamps(); - }); - } + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('tasks', function (Blueprint $table) { + $table->increments('id'); + $table->integer('job_id')->unsigned(); + $table->string('name', 60); + $table->string('description')->nullable(); + $table->boolean('progress')->default(0); + $table->string('route_name')->nullable(); + $table->boolean('position')->default(0); + $table->timestamps(); + }); + } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('tasks'); - } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('tasks'); + } } diff --git a/database/migrations/2016_11_15_151228_create_payments_table.php b/database/migrations/2016_11_15_151228_create_payments_table.php index ecf698a..96bd251 100644 --- a/database/migrations/2016_11_15_151228_create_payments_table.php +++ b/database/migrations/2016_11_15_151228_create_payments_table.php @@ -17,7 +17,7 @@ class CreatePaymentsTable extends Migration $table->increments('id'); $table->integer('project_id')->unsigned(); $table->integer('amount')->unsigned(); - $table->boolean('type_id')->default(1)->comment('1:project, 2: add_feature, 3:maintenance'); + $table->boolean('type_id')->default(1)->comment('1:project, 2: add_job, 3:maintenance'); $table->boolean('in_out')->default(1)->comment('0: out, 1: in'); $table->date('date'); $table->string('description'); diff --git a/resources/lang/id/feature.php b/resources/lang/id/feature.php deleted file mode 100644 index e66cae6..0000000 --- a/resources/lang/id/feature.php +++ /dev/null @@ -1,37 +0,0 @@ - 'Fitur', - 'features' => 'Daftar Fitur', - 'on_progress' => 'Fitur on Progress', - 'search' => 'Cari Fitur', - 'found' => 'Fitur ditemukan', - 'not_found' => 'Fitur tidak ditemukan', - 'tasks' => 'Daftar Task', - 'price_total' => 'Nilai Fitur Total', - 'tasks_count' => 'Jumlah Task', - 'empty' => 'Belum ada Fitur', - 'back_to_index' => 'Kembali ke daftar Fitur', - - // Actions - 'create' => 'Input Fitur Baru', - 'created' => 'Input Fitur baru telah berhasil.', - 'show' => 'Detail Fitur', - 'edit' => 'Edit Fitur', - 'update' => 'Update Fitur', - 'updated' => 'Update data Fitur telah berhasil.', - 'delete' => 'Hapus Fitur', - 'deleted' => 'Hapus data Fitur telah berhasil.', - 'undeleted' => 'Data Fitur gagal dihapus.', - 'add_from_other_project' => 'Tambah Fitur dari Project Lain', - 'sort_tasks' => 'Urutkan Prioritas Task', - - // Attributes - 'name' => 'Nama Fitur', - 'description' => 'Deskripsi', - 'progress' => 'Progress', - 'worker' => 'Pekerja', - 'price' => 'Biaya Pengerjaan', - 'type' => 'Jenis Fitur', -]; diff --git a/resources/lang/id/job.php b/resources/lang/id/job.php new file mode 100644 index 0000000..85c1aa9 --- /dev/null +++ b/resources/lang/id/job.php @@ -0,0 +1,37 @@ + 'Job', + 'jobs' => 'Daftar Job', + 'on_progress' => 'Job on Progress', + 'search' => 'Cari Job', + 'found' => 'Job ditemukan', + 'not_found' => 'Job tidak ditemukan', + 'tasks' => 'Daftar Task', + 'price_total' => 'Nilai Job Total', + 'tasks_count' => 'Jumlah Task', + 'empty' => 'Belum ada Job', + 'back_to_index' => 'Kembali ke daftar Job', + + // Actions + 'create' => 'Input Job Baru', + 'created' => 'Input Job baru telah berhasil.', + 'show' => 'Detail Job', + 'edit' => 'Edit Job', + 'update' => 'Update Job', + 'updated' => 'Update data Job telah berhasil.', + 'delete' => 'Hapus Job', + 'deleted' => 'Hapus data Job telah berhasil.', + 'undeleted' => 'Data Job gagal dihapus.', + 'add_from_other_project' => 'Tambah Job dari Project Lain', + 'sort_tasks' => 'Urutkan Prioritas Task', + + // Attributes + 'name' => 'Nama Job', + 'description' => 'Deskripsi', + 'progress' => 'Progress', + 'worker' => 'Pekerja', + 'price' => 'Biaya Pengerjaan', + 'type' => 'Jenis Job', +]; diff --git a/resources/lang/id/payment.php b/resources/lang/id/payment.php index 8d0a433..893bfda 100644 --- a/resources/lang/id/payment.php +++ b/resources/lang/id/payment.php @@ -43,7 +43,7 @@ return [ // Types 'types' => [ 'project' => 'Project', - 'add_feature' => 'Add Feature', + 'add_job' => 'Add Job', 'maintenance' => 'Maintenance', ], ]; diff --git a/resources/lang/id/project.php b/resources/lang/id/project.php index 6d52618..a5f02ce 100644 --- a/resources/lang/id/project.php +++ b/resources/lang/id/project.php @@ -14,21 +14,21 @@ return [ 'back_to_index' => 'Kembali ke daftar Project', // Actions - 'create' => 'Input Project Baru', - 'created' => 'Input Project baru telah berhasil.', - 'show' => 'Detail Project', - 'edit' => 'Edit Project', - 'update' => 'Update Project', - 'updated' => 'Update data Project telah berhasil.', - 'delete' => 'Hapus Project', - 'deleted' => 'Hapus data Project telah berhasil.', - 'undeleted' => 'Data Project gagal dihapus.', - 'show_features' => 'Lihat Fitur', + 'create' => 'Input Project Baru', + 'created' => 'Input Project baru telah berhasil.', + 'show' => 'Detail Project', + 'edit' => 'Edit Project', + 'update' => 'Update Project', + 'updated' => 'Update data Project telah berhasil.', + 'delete' => 'Hapus Project', + 'deleted' => 'Hapus data Project telah berhasil.', + 'undeleted' => 'Data Project gagal dihapus.', + 'show_jobs' => 'Lihat Job', - 'features_export_html' => 'Export HTML', - 'features_export_excel' => 'Export Excel', - 'features_export_progress_excel' => 'Export Progress', - 'sort_features' => 'Urutkan Prioritas Fitur', + 'jobs_export_html' => 'Export HTML', + 'jobs_export_excel' => 'Export Excel', + 'jobs_export_progress_excel' => 'Export Progress', + 'sort_jobs' => 'Urutkan Prioritas Job', // Attributes 'name' => 'Nama Project', @@ -41,8 +41,8 @@ return [ // Relations 'files' => 'List Dokumen', - 'features' => 'Daftar Item Pekerjaan', - 'no_features' => 'Belum ada Item Pekerjaan', + 'jobs' => 'Daftar Job', + 'no_jobs' => 'Belum ada Job', 'cost_proposal' => 'Pengajuan Biaya', 'invoices' => 'List Invoice', 'customer' => 'Customer', diff --git a/resources/views/features/partials/breadcrumb.blade.php b/resources/views/features/partials/breadcrumb.blade.php deleted file mode 100644 index 8a4da3e..0000000 --- a/resources/views/features/partials/breadcrumb.blade.php +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/resources/views/features/partials/feature-show.blade.php b/resources/views/features/partials/feature-show.blade.php deleted file mode 100644 index ceb00eb..0000000 --- a/resources/views/features/partials/feature-show.blade.php +++ /dev/null @@ -1,14 +0,0 @@ -
-

{{ trans('feature.show') }}

- - - - - - - - - - -
{{ trans('feature.name') }}{{ $feature->name }}
{{ trans('feature.type') }}{{ $feature->type() }}
{{ trans('feature.price') }}{{ formatRp($feature->price) }}
{{ trans('feature.tasks_count') }}{{ $feature->tasks->count() }}
{{ trans('feature.progress') }}{{ formatDecimal($feature->tasks->avg('progress')) }}%
{{ trans('feature.worker') }}{{ $feature->worker->name }}
{{ trans('feature.description') }}{!! nl2br($feature->description) !!}
-
diff --git a/resources/views/features/unfinished.blade.php b/resources/views/features/unfinished.blade.php deleted file mode 100755 index 9aed168..0000000 --- a/resources/views/features/unfinished.blade.php +++ /dev/null @@ -1,63 +0,0 @@ -@extends('layouts.app') - -@section('title', trans('project.features')) - -@section('content') -

- Daftar Fitur on Progress -

- -
- - - - - - - - - - - - - @forelse($features as $key => $feature) - - - - - - - - - - - @empty - - @endforelse - - - - - - - - - - -
{{ trans('app.table_no') }}{{ trans('project.name') }}{{ trans('feature.name') }}{{ trans('feature.tasks_count') }}{{ trans('feature.progress') }}{{ trans('feature.price') }}{{ trans('feature.worker') }}{{ trans('app.action') }}
{{ 1 + $key }}{{ $feature->project->name }} - {{ $feature->name }} - @if ($feature->tasks->isEmpty() == false) -
    - @foreach($feature->tasks as $task) -
  • - - {{ $task->name }} -
  • - @endforeach -
- @endif -
{{ $feature->tasks_count = $feature->tasks->count() }}{{ formatDecimal($feature->progress = $feature->tasks->avg('progress')) }} %{{ formatRp($feature->price) }}{{ $feature->worker->name }} - {!! link_to_route('features.show', trans('app.show'),[$feature->id],['class' => 'btn btn-info btn-xs']) !!} -
{{ trans('feature.empty') }}
Total{{ $features->sum('tasks_count') }}{{ formatDecimal($features->avg('progress')) }} %{{ formatRp($features->sum('price')) }}
-
-@endsection \ No newline at end of file diff --git a/resources/views/invoices/pdf.blade.php b/resources/views/invoices/pdf.blade.php index ca729bb..9fea7f1 100755 --- a/resources/views/invoices/pdf.blade.php +++ b/resources/views/invoices/pdf.blade.php @@ -52,7 +52,7 @@

{{ $invoice->project->customer->name }}

- {{ trans('project.features') }} : + {{ trans('project.jobs') }} : @@ -104,4 +104,4 @@
- \ No newline at end of file + diff --git a/resources/views/features/add-from-other-project.blade.php b/resources/views/jobs/add-from-other-project.blade.php similarity index 62% rename from resources/views/features/add-from-other-project.blade.php rename to resources/views/jobs/add-from-other-project.blade.php index ea7b581..c0801ad 100755 --- a/resources/views/features/add-from-other-project.blade.php +++ b/resources/views/jobs/add-from-other-project.blade.php @@ -1,14 +1,14 @@ @extends('layouts.app') -@section('title', trans('feature.add_from_other_project') . ' | ' . $project->name) +@section('title', trans('job.add_from_other_project') . ' | ' . $project->name) @section('content') -@include('projects.partials.breadcrumb',['title' => trans('feature.add_from_other_project')]) +@include('projects.partials.breadcrumb',['title' => trans('job.add_from_other_project')])
-

{{ trans('feature.add_from_other_project') }}

+

{{ trans('job.add_from_other_project') }}

{!! Form::open(['method'=>'get']) !!}
@@ -18,23 +18,23 @@ 'class' => 'form-control customer-select', 'placeholder' => '-- Pilih Project --' ]) !!} - +
{!! Form::close() !!} @if ($selectedProject) - {!! Form::open(['route'=>['features.store-from-other-project', $project->id]]) !!} + {!! Form::open(['route'=>['jobs.store-from-other-project', $project->id]]) !!}
    - @forelse($selectedProject->features as $key => $feature) + @forelse($selectedProject->jobs as $key => $job)
  • - +
      - @foreach($feature->tasks as $task) + @foreach($job->tasks as $task)
    • -
    • @endforeach @@ -47,12 +47,12 @@ @else
      Pilih salah satu project
      @endif - {!! Form::submit(trans('feature.create'), ['class'=>'btn btn-primary']) !!} + {!! Form::submit(trans('job.create'), ['class'=>'btn btn-primary']) !!} {!! Form::close() !!}
@@ -76,4 +76,4 @@ }); })(); -@endsection \ No newline at end of file +@endsection diff --git a/resources/views/features/create.blade.php b/resources/views/jobs/create.blade.php similarity index 62% rename from resources/views/features/create.blade.php rename to resources/views/jobs/create.blade.php index d298a93..44a6c58 100755 --- a/resources/views/features/create.blade.php +++ b/resources/views/jobs/create.blade.php @@ -1,34 +1,34 @@ @extends('layouts.app') -@section('title', trans('feature.create')) +@section('title', trans('job.create')) @section('content') -@include('projects.partials.breadcrumb',['title' => trans('feature.create')]) +@include('projects.partials.breadcrumb',['title' => trans('job.create')])
- {!! Form::open(['route'=>['features.store', $project->id]]) !!} + {!! Form::open(['route'=>['jobs.store', $project->id]]) !!}
-

{{ trans('feature.create') }}

+

{{ trans('job.create') }}

- {!! FormField::text('name',['label'=> trans('feature.name')]) !!} + {!! FormField::text('name',['label'=> trans('job.name')]) !!}
- {!! FormField::price('price', ['label'=> trans('feature.price')]) !!} + {!! FormField::price('price', ['label'=> trans('job.price')]) !!}
- {!! FormField::select('worker_id', $workers, ['label'=> trans('feature.worker'),'value' => 1]) !!} + {!! FormField::select('worker_id', $workers, ['label'=> trans('job.worker'),'value' => 1]) !!}
- {!! FormField::radios('type_id', [1 => 'Project','Tambahan'], ['value' => 1,'label'=> trans('feature.type'),'list_style' => 'unstyled']) !!} + {!! FormField::radios('type_id', [1 => 'Project','Tambahan'], ['value' => 1,'label'=> trans('job.type'),'list_style' => 'unstyled']) !!}
- {!! FormField::textarea('description',['label'=> trans('feature.description')]) !!} + {!! FormField::textarea('description',['label'=> trans('job.description')]) !!}
{!! Form::close() !!} @@ -53,4 +53,4 @@ }); })(); -@endsection \ No newline at end of file +@endsection diff --git a/resources/views/features/delete.blade.php b/resources/views/jobs/delete.blade.php similarity index 50% rename from resources/views/features/delete.blade.php rename to resources/views/jobs/delete.blade.php index 5d90b78..4802dd5 100755 --- a/resources/views/features/delete.blade.php +++ b/resources/views/jobs/delete.blade.php @@ -1,25 +1,25 @@ @extends('layouts.app') -@section('title', trans('feature.delete')) +@section('title', trans('job.delete')) @section('content')

{!! FormField::delete([ - 'route'=>['features.destroy',$feature->id]], + 'route'=>['jobs.destroy',$job->id]], trans('app.delete_confirm_button'), ['class'=>'btn btn-danger'], [ - 'feature_id'=>$feature->id, - 'project_id'=>$feature->project_id, + 'job_id'=>$job->id, + 'project_id'=>$job->project_id, ]) !!}
{{ trans('app.delete_confirm') }} - {!! link_to_route('features.show', trans('app.cancel'), [$feature->id], ['class' => 'btn btn-default']) !!} + {!! link_to_route('jobs.show', trans('app.cancel'), [$job->id], ['class' => 'btn btn-default']) !!}

- @include('features.partials.feature-show') + @include('jobs.partials.job-show')
-@endsection \ No newline at end of file +@endsection diff --git a/resources/views/features/edit.blade.php b/resources/views/jobs/edit.blade.php similarity index 53% rename from resources/views/features/edit.blade.php rename to resources/views/jobs/edit.blade.php index 67861a0..ba5f1ac 100755 --- a/resources/views/features/edit.blade.php +++ b/resources/views/jobs/edit.blade.php @@ -1,41 +1,41 @@ @extends('layouts.app') -@section('title', trans('feature.edit')) +@section('title', trans('job.edit')) @section('content')

- {!! Form::model($feature, ['route'=>['features.update', $feature->id], 'method' => 'patch']) !!} + {!! Form::model($job, ['route'=>['jobs.update', $job->id], 'method' => 'patch']) !!}
-

{{ $feature->name }} {{ trans('feature.edit') }}

+

{{ $job->name }} {{ trans('job.edit') }}

- {!! FormField::text('name',['label'=> trans('feature.name')]) !!} + {!! FormField::text('name',['label'=> trans('job.name')]) !!}
- {!! FormField::price('price', ['label'=> trans('feature.price')]) !!} + {!! FormField::price('price', ['label'=> trans('job.price')]) !!}
- {!! FormField::select('worker_id', $workers, ['label'=> trans('feature.worker'),'value' => 1]) !!} + {!! FormField::select('worker_id', $workers, ['label'=> trans('job.worker'),'value' => 1]) !!}
- {!! FormField::radios('type_id', [1 => 'Project','Tambahan'], ['value' => 1,'label'=> trans('feature.type'),'list_style' => 'unstyled']) !!} + {!! FormField::radios('type_id', [1 => 'Project','Tambahan'], ['value' => 1,'label'=> trans('job.type'),'list_style' => 'unstyled']) !!}
- {!! FormField::textarea('description',['label'=> trans('feature.description')]) !!} + {!! FormField::textarea('description',['label'=> trans('job.description')]) !!}
{!! Form::close() !!}
- @include('projects.partials.project-show', ['project' => $feature->project]) + @include('projects.partials.project-show', ['project' => $job->project])
@endsection @@ -54,4 +54,4 @@ }); })(); -@endsection \ No newline at end of file +@endsection diff --git a/resources/views/jobs/partials/breadcrumb.blade.php b/resources/views/jobs/partials/breadcrumb.blade.php new file mode 100644 index 0000000..0c2d6b3 --- /dev/null +++ b/resources/views/jobs/partials/breadcrumb.blade.php @@ -0,0 +1,6 @@ + diff --git a/resources/views/jobs/partials/job-show.blade.php b/resources/views/jobs/partials/job-show.blade.php new file mode 100644 index 0000000..51a22e3 --- /dev/null +++ b/resources/views/jobs/partials/job-show.blade.php @@ -0,0 +1,14 @@ +
+

{{ trans('job.show') }}

+ + + + + + + + + + +
{{ trans('job.name') }}{{ $job->name }}
{{ trans('job.type') }}{{ $job->type() }}
{{ trans('job.price') }}{{ formatRp($job->price) }}
{{ trans('job.tasks_count') }}{{ $job->tasks->count() }}
{{ trans('job.progress') }}{{ formatDecimal($job->tasks->avg('progress')) }}%
{{ trans('job.worker') }}{{ $job->worker->name }}
{{ trans('job.description') }}{!! nl2br($job->description) !!}
+
diff --git a/resources/views/features/partials/feature-tasks-operation.blade.php b/resources/views/jobs/partials/job-tasks-operation.blade.php similarity index 84% rename from resources/views/features/partials/feature-tasks-operation.blade.php rename to resources/views/jobs/partials/job-tasks-operation.blade.php index 4ebda46..9937c89 100644 --- a/resources/views/features/partials/feature-tasks-operation.blade.php +++ b/resources/views/jobs/partials/job-tasks-operation.blade.php @@ -1,5 +1,5 @@ @if (Request::has('action') == false) -{!! Form::open(['route' => ['tasks.store', $feature->id]])!!} +{!! Form::open(['route' => ['tasks.store', $job->id]])!!}

{{ trans('task.create') }}

@@ -38,11 +38,11 @@ {{ $editableTask->progress }} %
- {!! FormField::select('feature_id', $feature->project->features->pluck('name','id'), ['label' => 'Pindahkan ke Fitur lain']) !!} + {!! FormField::select('job_id', $job->project->jobs->pluck('name','id'), ['label' => 'Pindahkan ke Fitur lain']) !!}
{!! Form::submit(trans('task.update'), ['class' => 'btn btn-warning']) !!} - {!! link_to_route('features.show', trans('app.cancel'), [$feature->id], ['class' => 'btn btn-default']) !!} + {!! link_to_route('jobs.show', trans('app.cancel'), [$job->id], ['class' => 'btn btn-default']) !!} {!! Form::close() !!}
@@ -56,7 +56,7 @@ diff --git a/resources/views/features/partials/feature-tasks.blade.php b/resources/views/jobs/partials/job-tasks.blade.php similarity index 66% rename from resources/views/features/partials/feature-tasks.blade.php rename to resources/views/jobs/partials/job-tasks.blade.php index cd04901..7268985 100644 --- a/resources/views/features/partials/feature-tasks.blade.php +++ b/resources/views/jobs/partials/job-tasks.blade.php @@ -1,11 +1,11 @@ -
+
@if (request('action') == 'sort_tasks') - {{ link_to_route('features.show', trans('app.done'), [$feature->id], ['class' => 'btn btn-default btn-xs pull-right', 'style' => 'margin: -2px -8px']) }} + {{ link_to_route('jobs.show', trans('app.done'), [$job->id], ['class' => 'btn btn-default btn-xs pull-right', 'style' => 'margin: -2px -8px']) }} @else - {{ link_to_route('features.show', trans('feature.sort_tasks'), [$feature->id, 'action' => 'sort_tasks', '#feature-tasks'], ['class' => 'btn btn-default btn-xs pull-right', 'style' => 'margin: -2px -8px']) }} + {{ link_to_route('jobs.show', trans('job.sort_tasks'), [$job->id, 'action' => 'sort_tasks', '#job-tasks'], ['class' => 'btn btn-default btn-xs pull-right', 'style' => 'margin: -2px -8px']) }} @endif -

{{ trans('feature.tasks') }}

+

{{ trans('job.tasks') }}

@@ -16,7 +16,7 @@ - @forelse($feature->tasks as $key => $task) + @forelse($job->tasks as $key => $task) - + @@ -82,7 +82,7 @@ update: function (event, ui) { var data = $(this).sortable('toArray').toString(); // console.log(data); - $.post("{{ route('features.tasks-reorder', $feature->id) }}", {postData: data}); + $.post("{{ route('jobs.tasks-reorder', $job->id) }}", {postData: data}); } }); })(); diff --git a/resources/views/features/show.blade.php b/resources/views/jobs/show.blade.php similarity index 60% rename from resources/views/features/show.blade.php rename to resources/views/jobs/show.blade.php index ff7e582..078c1bd 100755 --- a/resources/views/features/show.blade.php +++ b/resources/views/jobs/show.blade.php @@ -1,27 +1,27 @@ @extends('layouts.app') -@section('title', trans('feature.show') . ' | ' . $feature->name . ' | ' . $feature->project->name) +@section('title', trans('job.show') . ' | ' . $job->name . ' | ' . $job->project->name) @section('content') -@include('features.partials.breadcrumb') +@include('jobs.partials.breadcrumb')

- {!! html_link_to_route('features.create', trans('feature.create'), [$feature->project_id], ['class' => 'btn btn-success','icon' => 'plus']) !!} - {!! link_to_route('features.edit', trans('feature.edit'), [$feature->id], ['class' => 'btn btn-warning']) !!} - {!! link_to_route('projects.features', trans('feature.back_to_index'), [$feature->project_id, '#' . $feature->id], ['class' => 'btn btn-default']) !!} + {!! html_link_to_route('jobs.create', trans('job.create'), [$job->project_id], ['class' => 'btn btn-success','icon' => 'plus']) !!} + {!! link_to_route('jobs.edit', trans('job.edit'), [$job->id], ['class' => 'btn btn-warning']) !!} + {!! link_to_route('projects.jobs', trans('job.back_to_index'), [$job->project_id, '#' . $job->id], ['class' => 'btn btn-default']) !!}
- {{ $feature->name }} {{ trans('feature.show') }} + {{ $job->name }} {{ trans('job.show') }}

- @include('features.partials.feature-show') + @include('jobs.partials.job-show')
- @include('features.partials.feature-tasks-operation') + @include('jobs.partials.job-tasks-operation')
-@include('features.partials.feature-tasks') +@include('jobs.partials.job-tasks') @endsection @if (Request::get('action') == 'task_edit' && $editableTask) diff --git a/resources/views/jobs/unfinished.blade.php b/resources/views/jobs/unfinished.blade.php new file mode 100755 index 0000000..249927a --- /dev/null +++ b/resources/views/jobs/unfinished.blade.php @@ -0,0 +1,63 @@ +@extends('layouts.app') + +@section('title', trans('project.jobs')) + +@section('content') +

+ Daftar Fitur on Progress +

+ +
+
{{ trans('app.action') }}
{{ 1 + $key }} @@ -26,8 +26,8 @@ {{ $task->route_name }} {{ $task->progress }} % - {!! html_link_to_route('features.show', '', [ - $feature->id, + {!! html_link_to_route('jobs.show', '', [ + $job->id, 'action' => 'task_edit', 'task_id' => $task->id ],[ @@ -36,8 +36,8 @@ 'id' => $task->id . '-tasks-edit', 'icon' => 'edit' ]) !!} - {!! html_link_to_route('features.show', '', [ - $feature->id, + {!! html_link_to_route('jobs.show', '', [ + $job->id, 'action' => 'task_delete', 'task_id' => $task->id ],[ @@ -55,12 +55,12 @@
Total{{ formatDecimal($feature->tasks->avg('progress')) }} %{{ formatDecimal($job->tasks->avg('progress')) }} % @if (request('action') == 'sort_tasks') - {{ link_to_route('features.show', trans('app.done'), [$feature->id], ['class' => 'btn btn-default btn-xs pull-right']) }} + {{ link_to_route('jobs.show', trans('app.done'), [$job->id], ['class' => 'btn btn-default btn-xs pull-right']) }} @else - {{ link_to_route('features.show', trans('feature.sort_tasks'), [$feature->id, 'action' => 'sort_tasks', '#feature-tasks'], ['class' => 'btn btn-default btn-xs pull-right']) }} + {{ link_to_route('jobs.show', trans('job.sort_tasks'), [$job->id, 'action' => 'sort_tasks', '#job-tasks'], ['class' => 'btn btn-default btn-xs pull-right']) }} @endif
+ + + + + + + + + + + + @forelse($jobs as $key => $job) + + + + + + + + + + + @empty + + @endforelse + + + + + + + + + + +
{{ trans('app.table_no') }}{{ trans('project.name') }}{{ trans('job.name') }}{{ trans('job.tasks_count') }}{{ trans('job.progress') }}{{ trans('job.price') }}{{ trans('job.worker') }}{{ trans('app.action') }}
{{ 1 + $key }}{{ $job->project->name }} + {{ $job->name }} + @if ($job->tasks->isEmpty() == false) +
    + @foreach($job->tasks as $task) +
  • + + {{ $task->name }} +
  • + @endforeach +
+ @endif +
{{ $job->tasks_count = $job->tasks->count() }}{{ formatDecimal($job->progress = $job->tasks->avg('progress')) }} %{{ formatRp($job->price) }}{{ $job->worker->name }} + {!! link_to_route('jobs.show', trans('app.show'),[$job->id],['class' => 'btn btn-info btn-xs']) !!} +
{{ trans('job.empty') }}
Total{{ $jobs->sum('tasks_count') }}{{ formatDecimal($jobs->avg('progress')) }} %{{ formatRp($jobs->sum('price')) }}
+
+@endsection diff --git a/resources/views/layouts/partials/sidebar.blade.php b/resources/views/layouts/partials/sidebar.blade.php index cb89351..f0fc527 100755 --- a/resources/views/layouts/partials/sidebar.blade.php +++ b/resources/views/layouts/partials/sidebar.blade.php @@ -16,7 +16,7 @@