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,
+ ]);
+ }
}