diff --git a/app/Entities/Projects/Job.php b/app/Entities/Projects/Job.php index 9987fc4..14f1c27 100755 --- a/app/Entities/Projects/Job.php +++ b/app/Entities/Projects/Job.php @@ -2,6 +2,7 @@ namespace App\Entities\Projects; +use DB; use App\Entities\Users\User; use Illuminate\Database\Eloquent\Model; use Laracasts\Presenter\PresentableTrait; @@ -109,4 +110,19 @@ class Job extends Model { return $this->price * ($this->progress / 100); } + + /** + * Delete the model from the database. + * + * @return bool|null + */ + public function delete() + { + DB::beginTransaction(); + $this->tasks()->delete(); + $this->comments()->delete(); + DB::commit(); + + return parent::delete(); + } } diff --git a/app/Entities/Projects/Project.php b/app/Entities/Projects/Project.php index e64abce..d2ed10c 100755 --- a/app/Entities/Projects/Project.php +++ b/app/Entities/Projects/Project.php @@ -2,6 +2,7 @@ namespace App\Entities\Projects; +use DB; use App\Entities\Invoices\Invoice; use App\Entities\Payments\Payment; use App\Entities\Partners\Customer; @@ -244,4 +245,22 @@ class Project extends Model return $workDuration.' Day(s)'; } + + /** + * Delete the model from the database. + * + * @return bool|null + */ + public function delete() + { + DB::beginTransaction(); + $this->jobs->each->delete(); + $this->invoices()->delete(); + $this->payments()->delete(); + $this->subscriptions()->delete(); + $this->comments()->delete(); + DB::commit(); + + return parent::delete(); + } } diff --git a/resources/views/projects/jobs/add-from-other-project.blade.php b/resources/views/projects/jobs/add-from-other-project.blade.php index 63a85b8..55f63cb 100755 --- a/resources/views/projects/jobs/add-from-other-project.blade.php +++ b/resources/views/projects/jobs/add-from-other-project.blade.php @@ -32,7 +32,7 @@ @foreach($job->tasks as $task)
  • @endforeach @@ -72,6 +72,14 @@ @endsection diff --git a/tests/Unit/Models/JobTest.php b/tests/Unit/Models/JobTest.php index c2e96c0..e049d77 100644 --- a/tests/Unit/Models/JobTest.php +++ b/tests/Unit/Models/JobTest.php @@ -55,6 +55,19 @@ class JobTest extends TestCase } /** @test */ + public function job_deletion_also_deletes_related_tasks() + { + $job = factory(Job::class)->create(); + $task = factory(Task::class)->create(['job_id' => $job->id]); + + $job->delete(); + + $this->dontSeeInDatabase('tasks', [ + 'job_id' => $job->id, + ]); + } + + /** @test */ public function a_job_has_progress_attribute() { $job = factory(Job::class)->create(); @@ -97,4 +110,21 @@ class JobTest extends TestCase $this->assertInstanceOf(Collection::class, $job->comments); $this->assertInstanceOf(Comment::class, $job->comments->first()); } + + /** @test */ + public function job_deletion_also_deletes_related_comments() + { + $job = factory(Job::class)->create(); + $comment = factory(Comment::class)->create([ + 'commentable_type' => 'jobs', + 'commentable_id' => $job->id, + ]); + + $job->delete(); + + $this->dontSeeInDatabase('comments', [ + 'commentable_type' => 'jobs', + 'commentable_id' => $job->id, + ]); + } } diff --git a/tests/Unit/Models/ProjectTest.php b/tests/Unit/Models/ProjectTest.php index 351c7d8..c8233e2 100644 --- a/tests/Unit/Models/ProjectTest.php +++ b/tests/Unit/Models/ProjectTest.php @@ -5,6 +5,7 @@ namespace Tests\Unit\Models; use Tests\TestCase; use App\Entities\Projects\Job; use App\Entities\Projects\Task; +use App\Entities\Invoices\Invoice; use App\Entities\Payments\Payment; use App\Entities\Projects\Comment; use App\Entities\Projects\Project; @@ -41,6 +42,19 @@ class ProjectTest extends TestCase } /** @test */ + public function project_deletion_also_deletes_related_jobs() + { + $project = factory(Project::class)->create(); + $job = factory(Job::class)->create(['project_id' => $project->id]); + + $project->delete(); + + $this->dontSeeInDatabase('jobs', [ + 'project_id' => $project->id, + ]); + } + + /** @test */ public function a_project_has_many_main_jobs() { $project = factory(Project::class)->create(); @@ -69,15 +83,43 @@ class ProjectTest extends TestCase } /** @test */ - public function a_project_has_many_payments() + public function project_deletion_also_deletes_related_job_tasks() + { + $project = factory(Project::class)->create(); + $job = factory(Job::class)->create(['project_id' => $project->id, 'type_id' => 2]); + $tasks = factory(Task::class, 2)->create(['job_id' => $job->id]); + + $project->delete(); + + $this->dontSeeInDatabase('tasks', [ + 'job_id' => $job->id, + ]); + } + + /** @test */ + public function a_project_has_many_payments_relation() { $project = factory(Project::class)->create(); $payment = factory(Payment::class)->create(['project_id' => $project->id]); + $this->assertInstanceOf(Collection::class, $project->payments); $this->assertInstanceOf(Payment::class, $project->payments->first()); } /** @test */ + public function project_deletion_also_deletes_related_payments() + { + $project = factory(Project::class)->create(); + $payment = factory(Payment::class)->create(['project_id' => $project->id]); + + $project->delete(); + + $this->dontSeeInDatabase('payments', [ + 'project_id' => $project->id, + ]); + } + + /** @test */ public function a_project_has_many_subscriptions() { $project = factory(Project::class)->create(); @@ -87,6 +129,19 @@ class ProjectTest extends TestCase } /** @test */ + public function project_deletion_also_deletes_related_subscriptions() + { + $project = factory(Project::class)->create(); + $subscription = factory(Subscription::class)->create(['project_id' => $project->id]); + + $project->delete(); + + $this->dontSeeInDatabase('subscriptions', [ + 'project_id' => $project->id, + ]); + } + + /** @test */ public function a_project_belongs_to_a_customer() { $customer = factory(Customer::class)->create(); @@ -214,6 +269,23 @@ class ProjectTest extends TestCase } /** @test */ + public function project_deletion_also_deletes_related_comments() + { + $project = factory(Project::class)->create(); + $comment = factory(Comment::class)->create([ + 'commentable_type' => 'projects', + 'commentable_id' => $project->id, + ]); + + $project->delete(); + + $this->dontSeeInDatabase('comments', [ + 'commentable_type' => 'projects', + 'commentable_id' => $project->id, + ]); + } + + /** @test */ public function project_has_work_duration_attribute() { $project = factory(Project::class)->create([ @@ -234,4 +306,27 @@ class ProjectTest extends TestCase $this->assertEquals('2 Year(s) 3 Month(s)', $project->work_duration); } + + /** @test */ + public function a_project_has_many_invoices_relation() + { + $project = factory(Project::class)->create(); + $invoice = factory(Invoice::class)->create(['project_id' => $project->id]); + + $this->assertInstanceOf(Collection::class, $project->invoices); + $this->assertInstanceOf(Invoice::class, $project->invoices->first()); + } + + /** @test */ + public function project_deletion_also_deletes_related_invoices() + { + $project = factory(Project::class)->create(); + $invoice = factory(Invoice::class)->create(['project_id' => $project->id]); + + $project->delete(); + + $this->dontSeeInDatabase('invoices', [ + 'project_id' => $project->id, + ]); + } }