Browse Source

Add morph relation of partner to Payment model

Add partner_type on payments table
Set grouped partner list on payment entry form
Payment can have User model as partner
Payment can have Vendor model as partner
Payment can have Customer model as partner
pull/1/head
Nafies Luthfi 8 years ago
parent
commit
be3c52d649
  1. 7
      app/Entities/BaseRepository.php
  2. 2
      app/Entities/Payments/Payment.php
  3. 7
      app/Entities/Payments/PaymentsRepository.php
  4. 27
      database/factories/PaymentFactory.php
  5. 1
      database/migrations/2016_11_15_151228_create_payments_table.php
  6. 5
      tests/Feature/Payments/ManagePaymentsTest.php
  7. 29
      tests/Unit/Models/PaymentTest.php

7
app/Entities/BaseRepository.php

@ -3,6 +3,7 @@
namespace App\Entities; namespace App\Entities;
use App\Entities\Partners\Customer; use App\Entities\Partners\Customer;
use App\Entities\Partners\Vendor;
use App\Entities\Projects\Feature; use App\Entities\Projects\Feature;
use App\Entities\Projects\Project; use App\Entities\Projects\Project;
use App\Entities\Users\User; use App\Entities\Users\User;
@ -20,7 +21,11 @@ abstract class BaseRepository extends EloquentRepository
public function getCustomersAndVendorsList() public function getCustomersAndVendorsList()
{ {
return Customer::orderBy('name')->pluck('name', 'id');
$partners = [
'Customer' => Customer::orderBy('name')->pluck('name', 'id')->all(),
'Vendor' => Vendor::orderBy('name')->pluck('name', 'id')->all(),
];
return $partners;
} }
public function getWorkersList() public function getWorkersList()

2
app/Entities/Payments/Payment.php

@ -34,7 +34,7 @@ class Payment extends Model
public function partner() public function partner()
{ {
return $this->belongsTo('App\Entities\Partners\Customer', 'partner_id');
return $this->morphTo();
} }
public function type() public function type()

7
app/Entities/Payments/PaymentsRepository.php

@ -36,6 +36,13 @@ class PaymentsRepository extends BaseRepository
public function create($paymentData) public function create($paymentData)
{ {
$paymentData['amount'] = str_replace('.', '', $paymentData['amount']); $paymentData['amount'] = str_replace('.', '', $paymentData['amount']);
if ($paymentData['in_out'] == 0) {
$paymentData['partner_type'] = 'App\Entities\Partners\Vendor';
} else {
$paymentData['partner_type'] = 'App\Entities\Partners\Customer';
}
return $this->storeArray($paymentData); return $this->storeArray($paymentData);
} }

27
database/factories/PaymentFactory.php

@ -1,8 +1,10 @@
<?php <?php
use App\Entities\Partners\Customer; use App\Entities\Partners\Customer;
use App\Entities\Partners\Vendor;
use App\Entities\Payments\Payment; use App\Entities\Payments\Payment;
use App\Entities\Projects\Project; use App\Entities\Projects\Project;
use App\Entities\Users\User;
use Faker\Generator as Faker; use Faker\Generator as Faker;
$factory->define(Payment::class, function (Faker $faker) { $factory->define(Payment::class, function (Faker $faker) {
@ -16,8 +18,33 @@ $factory->define(Payment::class, function (Faker $faker) {
'type_id' => rand(1, 3), 'type_id' => rand(1, 3),
'date' => $faker->dateTimeBetween('-1 year', '-1 month')->format('Y-m-d'), 'date' => $faker->dateTimeBetween('-1 year', '-1 month')->format('Y-m-d'),
'description' => $faker->paragraph, 'description' => $faker->paragraph,
'partner_type' => Customer::class,
'partner_id' => function () { 'partner_id' => function () {
return factory(Customer::class)->create()->id; return factory(Customer::class)->create()->id;
}, },
]; ];
}); });
$factory->state(Payment::class, 'vendor', function (Faker $faker) {
return [
'in_out' => 1,
'type_id' => 1,
'partner_type' => Vendor::class,
'partner_id' => function () {
return factory(Vendor::class)->create()->id;
},
];
});
$factory->state(Payment::class, 'fee', function (Faker $faker) {
return [
'in_out' => 1,
'type_id' => 1,
'partner_type' => User::class,
'partner_id' => function () {
return factory(User::class)->create()->id;
},
];
});

1
database/migrations/2016_11_15_151228_create_payments_table.php

@ -21,6 +21,7 @@ class CreatePaymentsTable extends Migration
$table->boolean('in_out')->default(1)->comment('0: out, 1: in'); $table->boolean('in_out')->default(1)->comment('0: out, 1: in');
$table->date('date'); $table->date('date');
$table->string('description'); $table->string('description');
$table->string('partner_type');
$table->integer('partner_id')->unsigned(); $table->integer('partner_id')->unsigned();
$table->timestamps(); $table->timestamps();
}); });

5
tests/Feature/Payments/ManagePaymentsTest.php

@ -3,6 +3,7 @@
namespace Tests\Feature\Payments; namespace Tests\Feature\Payments;
use App\Entities\Partners\Customer; use App\Entities\Partners\Customer;
use App\Entities\Partners\Vendor;
use App\Entities\Payments\Payment; use App\Entities\Payments\Payment;
use App\Entities\Projects\Project; use App\Entities\Projects\Project;
use Tests\TestCase; use Tests\TestCase;
@ -36,6 +37,7 @@ class ManagePaymentsTest extends TestCase
'amount' => 1000000, 'amount' => 1000000,
'in_out' => 1, 'in_out' => 1,
'date' => '2015-05-01', 'date' => '2015-05-01',
'partner_type' => Customer::class,
'partner_id' => $customer->id, 'partner_id' => $customer->id,
]); ]);
} }
@ -44,7 +46,7 @@ class ManagePaymentsTest extends TestCase
public function admin_can_entry_project_an_expanse_payment() public function admin_can_entry_project_an_expanse_payment()
{ {
$user = $this->adminUserSigningIn(); $user = $this->adminUserSigningIn();
$vendor = factory(Customer::class)->create(['owner_id' => $user->agency->id]);
$vendor = factory(Vendor::class)->create(['owner_id' => $user->agency->id]);
$project = factory(Project::class)->create(['owner_id' => $user->agency->id]); $project = factory(Project::class)->create(['owner_id' => $user->agency->id]);
$this->visit(route('payments.index')); $this->visit(route('payments.index'));
@ -68,6 +70,7 @@ class ManagePaymentsTest extends TestCase
'amount' => 1000000, 'amount' => 1000000,
'in_out' => 0, 'in_out' => 0,
'date' => '2015-05-01', 'date' => '2015-05-01',
'partner_type' => Vendor::class,
'partner_id' => $vendor->id, 'partner_id' => $vendor->id,
]); ]);
} }

29
tests/Unit/Models/PaymentTest.php

@ -3,15 +3,40 @@
namespace Tests\Unit\Models; namespace Tests\Unit\Models;
use App\Entities\Partners\Customer; use App\Entities\Partners\Customer;
use App\Entities\Partners\Vendor;
use App\Entities\Payments\Payment; use App\Entities\Payments\Payment;
use App\Entities\Users\User;
use Tests\TestCase; use Tests\TestCase;
class PaymentTest extends TestCase class PaymentTest extends TestCase
{ {
/** @test */ /** @test */
public function it_has_partner_relation()
public function it_can_have_partner_relation_on_customer_model_for_income_payment()
{ {
$payment = factory(Payment::class)->create(); $payment = factory(Payment::class)->create();
$this->assertTrue($payment->partner instanceof Customer);
$this->assertTrue(
$payment->partner instanceof Customer,
'An income payment should have a App\Entities\Partners\Customer model as partner relation'
);
}
/** @test */
public function it_can_have_partner_relation_on_vendor_model_for_expanse_payment()
{
$payment = factory(Payment::class)->states('vendor')->create();
$this->assertTrue(
$payment->partner instanceof Vendor,
'An expanse payment can have a App\Entities\Partners\Vendor model as partner relation'
);
}
/** @test */
public function it_can_have_partner_relation_on_user_model_for_fee_payment()
{
$payment = factory(Payment::class)->states('fee')->create();
$this->assertTrue(
$payment->partner instanceof User,
'An expanse payment can have a App\Entities\Users\User model as partner relation'
);
} }
} }
Loading…
Cancel
Save