Browse Source

Add agency has many projects relation

Add global scope for payment by owner agency projects
Remove owner_id column on payments table
pull/1/head
Nafies Luthfi 8 years ago
parent
commit
e40e53e42b
  1. 5
      app/Entities/Agencies/Agency.php
  2. 13
      app/Entities/Payments/Payment.php
  3. 3
      app/Entities/Payments/PaymentsRepository.php
  4. 19
      app/Entities/Reports/ReportsRepository.php
  5. 4
      app/Traits/OwnedByAgency.php
  6. 4
      database/factories/PaymentFactory.php
  7. 1
      database/migrations/2016_11_15_151228_create_payments_table.php
  8. 8
      resources/views/reports/payments/daily.blade.php
  9. 2
      tests/Feature/ManageProjectsTest.php
  10. 6
      tests/Feature/Payments/ManagePaymentsTest.php
  11. 8
      tests/Feature/Payments/PaymentSearchTest.php
  12. 12
      tests/Unit/Models/AgencyTest.php

5
app/Entities/Agencies/Agency.php

@ -12,4 +12,9 @@ class Agency extends Model
{ {
return $this->belongsTo('App\Entities\Users\User'); return $this->belongsTo('App\Entities\Users\User');
} }
public function projects()
{
return $this->hasMany('App\Entities\Projects\Project', 'owner_id');
}
} }

13
app/Entities/Payments/Payment.php

@ -5,6 +5,7 @@ namespace App\Entities\Payments;
use App\Entities\Partners\Partner; use App\Entities\Partners\Partner;
use App\Entities\Payments\PaymentPresenter; use App\Entities\Payments\PaymentPresenter;
use App\Entities\Projects\Project; use App\Entities\Projects\Project;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Laracasts\Presenter\PresentableTrait; use Laracasts\Presenter\PresentableTrait;
@ -15,6 +16,18 @@ class Payment extends Model
protected $presenter = PaymentPresenter::class; protected $presenter = PaymentPresenter::class;
protected $guarded = ['id', 'created_at', 'updated_at']; protected $guarded = ['id', 'created_at', 'updated_at'];
protected static function boot()
{
parent::boot();
static::addGlobalScope('by_owner_project', function (Builder $builder) {
if (auth()->user() && auth()->user()->agency) {
$projectIds = auth()->user()->agency->projects->pluck('id')->all();
$builder->whereIn('project_id', $projectIds);
}
});
}
public function project() public function project()
{ {
return $this->belongsTo(Project::class); return $this->belongsTo(Project::class);

3
app/Entities/Payments/PaymentsRepository.php

@ -35,8 +35,7 @@ class PaymentsRepository extends BaseRepository
public function create($paymentData) public function create($paymentData)
{ {
$paymentData['owner_id'] = auth()->id();
$paymentData['amount'] = str_replace('.', '', $paymentData['amount']);
$paymentData['amount'] = str_replace('.', '', $paymentData['amount']);
return $this->storeArray($paymentData); return $this->storeArray($paymentData);
} }

19
app/Entities/Reports/ReportsRepository.php

@ -8,8 +8,8 @@ use App\Entities\Projects\Project;
use DB; use DB;
/** /**
* Reports Repository Class
*/
* Reports Repository Class
*/
class ReportsRepository extends BaseRepository class ReportsRepository extends BaseRepository
{ {
protected $model; protected $model;
@ -21,10 +21,9 @@ class ReportsRepository extends BaseRepository
public function getDailyReports($date, $q) public function getDailyReports($date, $q)
{ {
return Payment::orderBy('date','desc')
return Payment::orderBy('date', 'desc')
->where('date', $date) ->where('date', $date)
->with('customer','project')
->where('owner_id',auth()->id())
->with('partner', 'project')
->get(); ->get();
} }
@ -34,8 +33,7 @@ class ReportsRepository extends BaseRepository
->where(DB::raw('YEAR(date)'), $year) ->where(DB::raw('YEAR(date)'), $year)
->where(DB::raw('MONTH(date)'), $month) ->where(DB::raw('MONTH(date)'), $month)
->groupBy('date') ->groupBy('date')
->orderBy('date','asc')
->where('owner_id',auth()->id())
->orderBy('date', 'asc')
->get(); ->get();
} }
@ -45,16 +43,15 @@ class ReportsRepository extends BaseRepository
->where(DB::raw('YEAR(date)'), $year) ->where(DB::raw('YEAR(date)'), $year)
->groupBy(DB::raw('YEAR(date)')) ->groupBy(DB::raw('YEAR(date)'))
->groupBy(DB::raw('MONTH(date)')) ->groupBy(DB::raw('MONTH(date)'))
->orderBy('date','asc')
->where('owner_id',auth()->id())
->orderBy('date', 'asc')
->get(); ->get();
} }
public function getCurrentCredits() public function getCurrentCredits()
{ {
// On Progress, Done, On Hold // On Progress, Done, On Hold
$projects = Project::whereIn('status_id',[2,3,6])->with('payments','customer')->get();
return $projects->filter(function($project) {
$projects = Project::whereIn('status_id', [2, 3, 6])->with('payments', 'customer')->get();
return $projects->filter(function ($project) {
return $project->cashInTotal() < $project->project_value; return $project->cashInTotal() < $project->project_value;
})->values(); })->values();
} }

4
app/Traits/OwnedByAgency.php

@ -9,10 +9,8 @@ trait OwnedByAgency
public static function bootOwnedByAgency() public static function bootOwnedByAgency()
{ {
static::addGlobalScope('by_owner', function (Builder $builder) { static::addGlobalScope('by_owner', function (Builder $builder) {
if ( ! is_null(auth()->user()->agency)) {
if (auth()->user() && auth()->user()->agency) {
$builder->where('owner_id', auth()->user()->agency->id); $builder->where('owner_id', auth()->user()->agency->id);
} else {
$builder->where('owner_id', 0);
} }
}); });
} }

4
database/factories/PaymentFactory.php

@ -3,7 +3,6 @@
use App\Entities\Partners\Partner; use App\Entities\Partners\Partner;
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) {
@ -17,9 +16,6 @@ $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,
'owner_id' => function () {
return factory(User::class)->create()->id;
},
'partner_id' => function () { 'partner_id' => function () {
return factory(Partner::class)->create()->id; return factory(Partner::class)->create()->id;
}, },

1
database/migrations/2016_11_15_151228_create_payments_table.php

@ -22,7 +22,6 @@ class CreatePaymentsTable extends Migration
$table->date('date'); $table->date('date');
$table->string('description'); $table->string('description');
$table->integer('partner_id')->unsigned(); $table->integer('partner_id')->unsigned();
$table->integer('owner_id')->unsigned();
$table->timestamps(); $table->timestamps();
}); });
} }

8
resources/views/reports/payments/daily.blade.php

@ -3,7 +3,7 @@
@section('title', 'Laporan Harian : ' . dateId($date)) @section('title', 'Laporan Harian : ' . dateId($date))
@section('content') @section('content')
<?php $dt = Carbon::parse($date) ?>
<?php $dt = Carbon::parse($date)?>
<ul class="breadcrumb hidden-print"> <ul class="breadcrumb hidden-print">
<li>{{ link_to_route('reports.payments.yearly', 'Laporan Tahun ' . $dt->year, ['year' => $dt->year]) }}</li> <li>{{ link_to_route('reports.payments.yearly', 'Laporan Tahun ' . $dt->year, ['year' => $dt->year]) }}</li>
@ -31,20 +31,20 @@
<th class="col-md-1">{{ trans('app.action') }}</th> <th class="col-md-1">{{ trans('app.action') }}</th>
</thead> </thead>
<tbody> <tbody>
<?php $total = 0; ?>
<?php $total = 0;?>
@forelse($payments as $key => $payment) @forelse($payments as $key => $payment)
<tr> <tr>
<td>{{ 1 + $key }}</td> <td>{{ 1 + $key }}</td>
<td>{{ $payment->project->present()->projectLink() }}</td> <td>{{ $payment->project->present()->projectLink() }}</td>
<td class="text-center">{{ $payment->date }}</td> <td class="text-center">{{ $payment->date }}</td>
<td class="text-right">{{ $payment->present()->amount }}</td> <td class="text-right">{{ $payment->present()->amount }}</td>
<td class="text-center">{{ $payment->customer->name }}</td>
<td class="text-center">{{ $payment->partner->name }}</td>
<td>{{ $payment->description }} [{{ $payment->type() }}]</td> <td>{{ $payment->description }} [{{ $payment->type() }}]</td>
<td> <td>
{!! link_to_route('payments.show','Lihat',[$payment->id],['title' => 'Lihat Detail Pembayaran','target' => '_blank','class'=>'btn btn-info btn-xs']) !!} {!! link_to_route('payments.show','Lihat',[$payment->id],['title' => 'Lihat Detail Pembayaran','target' => '_blank','class'=>'btn btn-info btn-xs']) !!}
</td> </td>
</tr> </tr>
<?php $total = $payment->in_out == 0 ? $total - $payment->amount : $total + $payment->amount ?>
<?php $total = $payment->in_out == 0 ? $total - $payment->amount : $total + $payment->amount?>
@empty @empty
<tr><td colspan="5">{{ trans('payment.not_found') }}</td></tr> <tr><td colspan="5">{{ trans('payment.not_found') }}</td></tr>
@endforelse @endforelse

2
tests/Feature/ManageProjectsTest.php

@ -80,7 +80,7 @@ class ManageProjectsTest extends TestCase
$project = factory(Project::class)->create(['owner_id' => $user->agency->id]); $project = factory(Project::class)->create(['owner_id' => $user->agency->id]);
$feature = factory(Feature::class)->create(['project_id' => $project->id]); $feature = factory(Feature::class)->create(['project_id' => $project->id]);
$task = factory(Task::class)->create(['feature_id' => $feature->id]); $task = factory(Task::class)->create(['feature_id' => $feature->id]);
$payment = factory(Payment::class)->create(['project_id' => $project->id, 'owner_id' => $user->agency->id]);
$payment = factory(Payment::class)->create(['project_id' => $project->id]);
$this->visit('projects/'.$project->id); $this->visit('projects/'.$project->id);
$this->click(trans('app.edit')); $this->click(trans('app.edit'));

6
tests/Feature/Payments/ManagePaymentsTest.php

@ -82,7 +82,6 @@ class ManagePaymentsTest extends TestCase
$payment = factory(Payment::class)->create([ $payment = factory(Payment::class)->create([
'partner_id' => $customer->id, 'partner_id' => $customer->id,
'project_id' => $project->id, 'project_id' => $project->id,
'owner_id' => $user->agency->id,
]); ]);
$this->visit(route('payments.edit', $payment->id)); $this->visit(route('payments.edit', $payment->id));
@ -111,7 +110,6 @@ class ManagePaymentsTest extends TestCase
$project = factory(Project::class)->create(['owner_id' => $user->agency->id]); $project = factory(Project::class)->create(['owner_id' => $user->agency->id]);
$payment = factory(Payment::class)->create([ $payment = factory(Payment::class)->create([
'project_id' => $project->id, 'project_id' => $project->id,
'owner_id' => $user->agency->id,
]); ]);
$this->visit(route('payments.index')); $this->visit(route('payments.index'));
@ -127,8 +125,8 @@ class ManagePaymentsTest extends TestCase
{ {
$user = $this->adminUserSigningIn(); $user = $this->adminUserSigningIn();
$project = factory(Project::class)->create(['owner_id' => $user->id]);
$payment = factory(Payment::class)->create(['project_id' => $project->id, 'owner_id' => $user->id]);
$project = factory(Project::class)->create(['owner_id' => $user->agency->id]);
$payment = factory(Payment::class)->create(['project_id' => $project->id]);
$this->visit(route('payments.index')); $this->visit(route('payments.index'));
$this->click(trans('app.show')); $this->click(trans('app.show'));

8
tests/Feature/Payments/PaymentSearchTest.php

@ -13,9 +13,9 @@ class PaymentSearchTest extends TestCase
{ {
$admin = $this->adminUserSigningIn(); $admin = $this->adminUserSigningIn();
$project = factory(Project::class)->create(['owner_id' => $admin->agency->id, 'name' => 'Project']); $project = factory(Project::class)->create(['owner_id' => $admin->agency->id, 'name' => 'Project']);
$payment = factory(Payment::class)->create(['owner_id' => $admin->agency->id, 'project_id' => $project->id]);
$payment = factory(Payment::class)->create(['project_id' => $project->id]);
$project2 = factory(Project::class)->create(['owner_id' => $admin->agency->id]); $project2 = factory(Project::class)->create(['owner_id' => $admin->agency->id]);
$unShownPayment = factory(Payment::class)->create(['owner_id' => $admin->agency->id, 'project_id' => $project2->id]);
$unShownPayment = factory(Payment::class)->create(['project_id' => $project2->id]);
$this->visit(route('payments.index')); $this->visit(route('payments.index'));
$this->submitForm(trans('app.search'), [ $this->submitForm(trans('app.search'), [
@ -33,9 +33,9 @@ class PaymentSearchTest extends TestCase
{ {
$admin = $this->adminUserSigningIn(); $admin = $this->adminUserSigningIn();
$project = factory(Project::class)->create(['owner_id' => $admin->agency->id, 'name' => 'Project']); $project = factory(Project::class)->create(['owner_id' => $admin->agency->id, 'name' => 'Project']);
$payment = factory(Payment::class)->create(['owner_id' => $admin->agency->id, 'project_id' => $project->id]);
$payment = factory(Payment::class)->create(['project_id' => $project->id]);
$project2 = factory(Project::class)->create(['owner_id' => $admin->agency->id]); $project2 = factory(Project::class)->create(['owner_id' => $admin->agency->id]);
$unShownPayment = factory(Payment::class)->create(['owner_id' => $admin->agency->id, 'project_id' => $project2->id]);
$unShownPayment = factory(Payment::class)->create(['project_id' => $project2->id]);
$this->visit(route('payments.index')); $this->visit(route('payments.index'));
$this->submitForm(trans('app.search'), [ $this->submitForm(trans('app.search'), [

12
tests/Unit/Models/AgencyTest.php

@ -3,7 +3,9 @@
namespace Tests\Unit\Models; namespace Tests\Unit\Models;
use App\Entities\Agencies\Agency; use App\Entities\Agencies\Agency;
use App\Entities\Projects\Project;
use App\Entities\Users\User; use App\Entities\Users\User;
use Illuminate\Support\Collection;
use Tests\TestCase; use Tests\TestCase;
class AgencyTest extends TestCase class AgencyTest extends TestCase
@ -14,4 +16,14 @@ class AgencyTest extends TestCase
$agency = factory(Agency::class)->create(); $agency = factory(Agency::class)->create();
$this->assertTrue($agency->owner instanceof User); $this->assertTrue($agency->owner instanceof User);
} }
/** @test */
public function agency_has_many_projects()
{
$agency = factory(Agency::class)->create();
$project = factory(Project::class)->create(['owner_id' => $agency->id]);
$this->assertTrue($agency->projects instanceof Collection);
$this->assertTrue($agency->projects->first() instanceof Project);
}
} }
Loading…
Cancel
Save