Browse Source

Prevent admin to delete vendor that has payments

Add payments relation to Vendor model
pull/7/head
Nafies Luthfi 8 years ago
parent
commit
b597feb0fb
  1. 5
      app/Entities/Partners/Vendor.php
  2. 2
      app/Policies/Partners/VendorPolicy.php
  3. 8
      resources/views/vendors/forms.blade.php
  4. 12
      tests/Unit/Models/VendorTest.php
  5. 18
      tests/Unit/Policies/VendorPolicyTest.php

5
app/Entities/Partners/Vendor.php

@ -7,4 +7,9 @@ use Illuminate\Database\Eloquent\Model;
class Vendor extends Model
{
protected $fillable = ['name', 'notes', 'website', 'is_active'];
public function payments()
{
return $this->hasMany('App\Entities\Payments\Payment', 'partner_id');
}
}

2
app/Policies/Partners/VendorPolicy.php

@ -64,6 +64,6 @@ class VendorPolicy
*/
public function delete(User $user, Vendor $vendor)
{
return $this->view($user, $vendor);
return $user->hasRole('admin') && $vendor->payments->isEmpty();
}
}

8
resources/views/vendors/forms.blade.php

@ -32,8 +32,13 @@
{!! $errors->first('vendor_id', '<span class="form-error small">:message</span>') !!}
</div>
<hr style="margin:0">
<div class="panel-body">{{ trans('app.delete_confirm') }}</div>
@can('delete', $editableVendor)
<div class="panel-body">{{ trans('app.delete_confirm') }}</div>
@else
<div class="panel-body">{{ trans('vendor.undeleteable') }}</div>
@endcan
<div class="panel-footer">
@can('delete', $editableVendor)
{!! FormField::delete(
['route'=>['vendors.destroy',$editableVendor->id]],
trans('app.delete_confirm_button'),
@ -44,6 +49,7 @@
'q' => request('q'),
]
) !!}
@endcan
{{ link_to_route('vendors.index', trans('app.cancel'), [], ['class' => 'btn btn-default']) }}
</div>
</div>

12
tests/Unit/Models/VendorTest.php

@ -3,7 +3,9 @@
namespace Tests\Unit\Models;
use App\Entities\Partners\Vendor;
use App\Entities\Payments\Payment;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Support\Collection;
use Tests\TestCase as TestCase;
class VendorTest extends TestCase
@ -16,4 +18,14 @@ class VendorTest extends TestCase
$vendor = factory(Vendor::class)->make(['name' => 'Vendor 1 name']);
$this->assertEquals('Vendor 1 name', $vendor->name);
}
/** @test */
public function a_vendor_has_many_payments_relation()
{
$vendor = factory(Vendor::class)->create();
$payment = factory(Payment::class)->create(['partner_id' => $vendor->id]);
$this->assertInstanceOf(Collection::class, $vendor->payments);
$this->assertInstanceOf(Payment::class, $vendor->payments->first());
}
}

18
tests/Unit/Policies/VendorPolicyTest.php

@ -3,7 +3,8 @@
namespace Tests\Unit\Policies;
use App\Entities\Partners\Vendor;
use Tests\TestCase as TestCase;
use App\Entities\Payments\Payment;
use Tests\TestCase;
/**
* Vendor Policy Test.
@ -54,4 +55,19 @@ class VendorPolicyTest extends TestCase
$this->assertTrue($admin->can('delete', $vendor));
$this->assertFalse($worker->can('delete', $vendor));
}
/** @test */
public function admin_cannot_delete_vendor_if_it_has_dependent_records()
{
$admin = $this->createUser('admin');
$vendor = factory(Vendor::class)->create();
$this->assertTrue($admin->can('delete', $vendor));
$payment = factory(Payment::class)->create([
'partner_type' => Vendor::class,
'partner_id' => $vendor->id,
]);
$this->assertFalse($admin->can('delete', $vendor->fresh()));
}
}
Loading…
Cancel
Save