Browse Source

Fill out dashboard items with AdminDashboardQuery object

pull/1/head
Nafies Luthfi 8 years ago
parent
commit
910232f4d3
  1. 4
      app/Http/Controllers/PagesController.php
  2. 78
      app/Queries/AdminDashboardQuery.php
  3. 53
      resources/views/pages/home.blade.php
  4. 2
      resources/views/reports/payments/yearly.blade.php
  5. 69
      tests/Unit/Queries/AdminDashboardQueryTest.php

4
app/Http/Controllers/PagesController.php

@ -6,7 +6,9 @@ class PagesController extends Controller
{ {
public function home() public function home()
{ {
return view('pages.home');
return view('pages.home', [
'queriedYear' => request('year', date('Y')),
]);
} }
public function about() public function about()

78
app/Queries/AdminDashboardQuery.php

@ -0,0 +1,78 @@
<?php
namespace App\Queries;
use App\Entities\Payments\Payment;
use App\Entities\Projects\Project;
use App\Entities\Subscriptions\Subscription;
use Carbon\Carbon;
/**
* AdminDashboardQuery
*/
class AdminDashboardQuery
{
/**
* Get total money earned on an year
*
* @param string|integer $year
* @return integer Amount of earnings
*/
public function totalEarnings($year)
{
$totalEarnings = 0;
$payments = Payment::where('date', 'like', $year.'%')->get();
foreach ($payments as $payment) {
if ($payment->in_out == 1) {
$totalEarnings += $payment->amount;
} else {
$totalEarnings -= $payment->amount;
}
}
return $totalEarnings;
}
/**
* Get number of projects that has been finished on a year
*
* @param string|integer $year
* @return integer Number of finished projects
*/
public function totalFinishedProjects($year)
{
return Project::where('status_id', 4)->where('start_date', 'like', $year.'%')->count();
}
public function currentOutstandingCustomerPayment($year)
{
// On Progress, Done, On Hold
$projects = Project::whereIn('status_id', [2, 3, 6])
->where('start_date', 'like', $year.'%')
->with('payments')
->get();
$filteredProjects = $projects->filter(function ($project) {
return $project->cashInTotal() < $project->project_value;
})->values();
$oustandingPaymentTotal = 0;
foreach ($filteredProjects as $project) {
$oustandingPaymentTotal += $project->project_value - $project->cashInTotal();
}
return $oustandingPaymentTotal;
}
public function upcomingSubscriptionDueDatesList()
{
$subscriptions = Subscription::get();
$filteredSubscriptions = $subscriptions->filter(function ($subscription) {
return $subscription->status_id == 1
&& Carbon::parse($subscription->due_date)->diffInDays(Carbon::now()) < 60;
});
return $filteredSubscriptions;
}
}

53
resources/views/pages/home.blade.php

@ -6,15 +6,14 @@
@section('content-dashboard') @section('content-dashboard')
<?php use Facades\App\Queries\AdminDashboardQuery;?>
<div class="row"> <div class="row">
<div class="col-md-6">
<div class="col-lg-6">
<legend style="border-bottom: none" class="text-center">Project Status Stats</legend> <legend style="border-bottom: none" class="text-center">Project Status Stats</legend>
<div class="row"> <div class="row">
@foreach($projectStatuses::all() as $statusId => $status) @foreach($projectStatuses::all() as $statusId => $status)
@if ($statusId == 4)
<div class="row">
@endif
<div class="col-md-4">
<div class="col-md-4 col-xs-6">
@include('view-components.dashboard-panel', [ @include('view-components.dashboard-panel', [
'class' => $projectStatuses->getColorById($statusId), 'class' => $projectStatuses->getColorById($statusId),
'icon' => $projectStatuses->getIconById($statusId), 'icon' => $projectStatuses->getIconById($statusId),
@ -23,51 +22,51 @@
'linkRoute' => route('projects.index', ['status' => $statusId]), 'linkRoute' => route('projects.index', ['status' => $statusId]),
]) ])
</div> </div>
@if ($statusId == 3)
</div>
@endif
@endforeach @endforeach
</div> </div>
</div> </div>
<div class="col-md-6">
<div class="col-lg-6">
<legend style="border-bottom: none" class="text-center">Earnings Stats</legend> <legend style="border-bottom: none" class="text-center">Earnings Stats</legend>
<div class="panel panel-default table-responsive hidden-xs"> <div class="panel panel-default table-responsive hidden-xs">
<table class="table table-condensed table-bordered"> <table class="table table-condensed table-bordered">
<tr> <tr>
<td class="col-xs-2 text-center">Yearly Earnings (2017)</td>
<td class="col-xs-2 text-center">Finished Project (2017)</td>
<td class="col-xs-2 text-center">Yearly Earnings ({{ $queriedYear }})</td>
<td class="col-xs-2 text-center">Finished Projects ({{ $queriedYear }})</td>
<td class="col-xs-2 text-center">Receiveable Earnings</td> <td class="col-xs-2 text-center">Receiveable Earnings</td>
</tr> </tr>
<tr> <tr>
<td class="text-center lead" style="border-top: none;">{{ formatRp(1000000) }}</td>
<td class="text-center lead" style="border-top: none;">0 Projects</td>
<td class="text-center lead" style="border-top: none;">{{ formatRp(1000000) }}</td>
<td class="text-center text-primary lead" style="border-top: none;">{{ $totalEarnings = formatRp(AdminDashboardQuery::totalEarnings($queriedYear)) }}</td>
<td class="text-center text-primary lead" style="border-top: none;">{{ $totalFinishedProjects = AdminDashboardQuery::totalFinishedProjects($queriedYear) }} Projects</td>
<td class="text-center text-primary lead" style="border-top: none;">{{ $currentOutstandingCustomerPayment = formatRp(AdminDashboardQuery::currentOutstandingCustomerPayment($queriedYear)) }}</td>
</tr> </tr>
</table> </table>
</div> </div>
<ul class="list-group visible-xs"> <ul class="list-group visible-xs">
<li class="list-group-item">Earnings (2017) <span class="pull-right">{{ formatRp(1000000) }}</span></li>
<li class="list-group-item">Finished Project (2017) <span class="pull-right">0 Projects</span></li>
<li class="list-group-item">Receiveable Earnings <span class="pull-right">{{ formatRp(1000000) }}</span></li>
<li class="list-group-item">Yearly Earnings ({{ $queriedYear }}) <span class="pull-right text-primary">{{ $totalEarnings }}</span></li>
<li class="list-group-item">Finished Projects ({{ $queriedYear }}) <span class="pull-right text-primary">{{ $totalFinishedProjects }} Projects</span></li>
<li class="list-group-item">Receiveable Earnings <span class="pull-right text-primary">{{ $currentOutstandingCustomerPayment }}</span></li>
</ul> </ul>
<legend style="border-bottom: none" class="text-center">Upcoming Subscriptions Due Dates</legend> <legend style="border-bottom: none" class="text-center">Upcoming Subscriptions Due Dates</legend>
<div class="panel panel-default">
<div class="panel panel-default table-responsive">
<table class="table table-condensed"> <table class="table table-condensed">
<tr> <tr>
<th class="col-xs-2">Project</th>
<th class="col-xs-3">Items</th>
<th class="col-xs-2 text-right">Tagihan</th>
<th class="col-xs-2 text-center">Due Date</th>
<th class="col-xs-3">@lang('customer.customer')</th>
<th class="col-xs-3 text-right">@lang('invoice.amount')</th>
<th class="col-xs-5 text-center">@lang('subscription.due_date')</th>
</tr> </tr>
@foreach(range(1, 4) as $subscription)
@foreach(AdminDashboardQuery::upcomingSubscriptionDueDatesList() as $subscription)
<tr> <tr>
<td>Project {{ $subscription }}</td>
<td>Hosting &amp; Domain</td>
<td class="text-right">{{ formatRp(rand(1, 3).'000000') }}</td>
<td class="text-center">2017-12-01</td>
<td>{{ link_to_route('subscriptions.show', $subscription->domain_name, [$subscription->id]) }}</td>
<td class="text-right">{{ formatRp($subscription->domain_price + $subscription->hosting_price) }}</td>
<td class="text-center">
{{ $subscription->due_date }}
<strong class="text-danger hidden-xs">
({{ Carbon::parse($subscription->due_date)->diffForHumans() }})
</strong>
</td>
</tr> </tr>
@endforeach @endforeach
</table> </table>

2
resources/views/reports/payments/yearly.blade.php

@ -26,7 +26,7 @@
</div> </div>
<div class="panel panel-success"> <div class="panel panel-success">
<div class="panel-heading"><h3 class="panel-title">Detail Laporan</h3></div> <div class="panel-heading"><h3 class="panel-title">Detail Laporan</h3></div>
<div class="panel-body">
<div class="panel-body table-responsive">
<table class="table table-condensed"> <table class="table table-condensed">
<thead> <thead>
<th class="text-center">Bulan</th> <th class="text-center">Bulan</th>

69
tests/Unit/Queries/AdminDashboardQueryTest.php

@ -0,0 +1,69 @@
<?php
namespace Tests\Unit\Queries;
use App\Entities\Payments\Payment;
use App\Entities\Projects\Project;
use App\Entities\Subscriptions\Subscription;
use App\Queries\AdminDashboardQuery;
use Carbon\Carbon;
use Tests\TestCase;
class AdminDashboardQueryTest extends TestCase
{
/** @test */
public function retrieve_total_earnings_on_the_year()
{
factory(Payment::class)->create(['in_out' => 1, 'amount' => 500, 'date' => '2015-01-04']);
factory(Payment::class, 2)->create(['in_out' => 1, 'amount' => 1000, 'date' => '2015-03-04']);
factory(Payment::class, 2)->create(['in_out' => 0, 'amount' => 200, 'date' => '2015-09-04']);
factory(Payment::class)->create(['in_out' => 1, 'amount' => 500, 'date' => '2016-01-04']);
$this->assertEquals(2100, (new AdminDashboardQuery)->totalEarnings('2015'));
$this->assertEquals(500, (new AdminDashboardQuery)->totalEarnings('2016'));
}
/** @test */
public function retrieve_total_finished_projects_on_the_year()
{
factory(Project::class)->create(['status_id' => 4, 'start_date' => '2015-01-04']);
factory(Project::class, 2)->create(['status_id' => 4, 'start_date' => '2015-03-04']);
factory(Project::class, 2)->create(['status_id' => 5, 'start_date' => '2015-09-04']);
factory(Project::class)->create(['status_id' => 4, 'start_date' => '2016-01-04']);
$this->assertEquals(3, (new AdminDashboardQuery)->totalFinishedProjects('2015'));
$this->assertEquals(1, (new AdminDashboardQuery)->totalFinishedProjects('2016'));
}
/** @test */
public function retrieve_current_outstanding_customer_payment()
{
$project = factory(Project::class)->create(['project_value' => 2000, 'status_id' => 2, 'start_date' => '2015-01-04']);
factory(Payment::class)->create(['project_id' => $project->id, 'amount' => 1000]);
$project = factory(Project::class)->create(['project_value' => 2000, 'status_id' => 3, 'start_date' => '2015-03-04']);
factory(Payment::class)->create(['project_id' => $project->id, 'amount' => 1000]);
$project = factory(Project::class)->create(['project_value' => 2000, 'status_id' => 1, 'start_date' => '2015-09-04']);
factory(Payment::class)->create(['project_id' => $project->id, 'amount' => 1000]);
$project = factory(Project::class)->create(['project_value' => 2000, 'status_id' => 3, 'start_date' => '2016-01-04']);
factory(Payment::class)->create(['project_id' => $project->id, 'amount' => 1000]);
$this->assertEquals(2000, (new AdminDashboardQuery)->currentOutstandingCustomerPayment('2015'));
$this->assertEquals(1000, (new AdminDashboardQuery)->currentOutstandingCustomerPayment('2016'));
}
/** @test */
public function retrieve_upcoming_customer_subscription_due_dates_list()
{
$dueDate = Carbon::now()->addMonth()->format('Y-m-d');
factory(Subscription::class)->create(['due_date' => $dueDate]);
factory(Subscription::class)->create(['due_date' => $dueDate]);
factory(Subscription::class)->create(['due_date' => $dueDate, 'status_id' => 0]);
factory(Subscription::class)->create(['due_date' => Carbon::now()->addMonths(3)->format('Y-m-d')]);
$this->assertCount(2, (new AdminDashboardQuery)->upcomingSubscriptionDueDatesList());
}
}
Loading…
Cancel
Save