This commit is contained in:
glovetleong
2022-02-16 15:09:52 +08:00
parent cee0f99dc9
commit efc5811403
7 changed files with 91 additions and 7 deletions
@@ -0,0 +1,19 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;
class Frequency implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->whereHas('bookings', function ($query){}, '>=', $value);
}
}
@@ -0,0 +1,25 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;
class Monetary implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->whereHas('transactions', function ($query) use ($value){
$query->where('transactions.type', TransactionType::PAYMENT)->whereIn('transactions.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]);
$query->havingRaw('SUM(amount) >= ' . $value);
});
}
}
@@ -0,0 +1,22 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;
class Recency implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->where('transactions.created_at', '>=', $value);
}
}
@@ -19,8 +19,18 @@ class WithTotalPayments implements Filter
*/
public static function apply(Builder $builder, $value)
{
return $builder->leftJoin('bookings', 'companies.id', '=', 'bookings.company_id')->rightJoin('transactions', function ($join) {
$join->on('bookings.id', '=', 'transactions.owner_id')->where('owner_type', '=', Booking::class)->where('transactions.type', TransactionType::PAYMENT)->whereIn('transactions.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]);
})->addSelect(['companies.*', DB::raw('SUM(transactions.amount) as total_payments'), DB::raw('SUM(transactions.amount / DATEDIFF(companies.created_at, CURRENT_DATE)) as spending_average_per_day'), DB::raw('SUM(transactions.amount) / count(distinct bookings.id) as spending_average_booking')])->groupBy(['companies.id']);
return $builder->leftJoin('bookings', 'companies.id', '=', 'bookings.company_id')
->rightJoin('transactions', function ($join) {
$join->on('bookings.id', '=', 'transactions.owner_id')
->where('owner_type', '=', Booking::class)
->where('transactions.type', TransactionType::PAYMENT)
->whereIn('transactions.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]);
})->addSelect([
'companies.*',
DB::raw('SUM(transactions.amount) as total_payments'),
DB::raw('SUM(transactions.amount / DATEDIFF(companies.created_at, CURRENT_DATE)) as spending_average_per_day'),
DB::raw('SUM(transactions.amount) / count(distinct bookings.id) as spending_average_booking')
])
->groupBy(['companies.id']);
}
}
@@ -53,9 +53,12 @@ class ListCompaniesLogic extends AbstractControllerLogic
{
$this->canListCompanies->passes();
// dd($request->input('filters'));
// frequency = active bookings
// monetary = total spending/payment
$query = $this->listsCompanies->execute($this->listsCompanies->deserializeFilters($request->input('filters')));
// dd($query);
return $this->collectionResponse(CompanyResource::collection($query));
}
}
+1
View File
@@ -28,6 +28,7 @@ class CompanyResource extends JsonResource
{
$lastPayment = $this->transactions()->where('transactions.type', TransactionType::PAYMENT)->whereIn('transactions.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->orderBy('id', 'DESC')->first();
$totalPayments = $this->transactions()->where('transactions.type', TransactionType::PAYMENT)->whereIn('transactions.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->sum('amount');
return [
'id' => $this->id,
'name' => $this->name,
@@ -76,14 +76,18 @@
<div class="row no-margin">
<div class="col bg-white padding-25">
<div class="row tabsContainer tabContent m-l-0 m-r-0" tab-name="top-spenders">
<list-component key="2" section="topSpenders" :endpoint="route('api.company.list')" :options="{'with_total_payments': true, 'business_type': 2, with_bookings:true, order_by:{ column:'total_payments', DESC:true}}">
<list-component key="2" section="topSpenders" :endpoint="route('api.company.list')" :options="{'with_total_payments': true,
'recency':'2022-02-15',
'frequency': 15,
'business_type': 2, with_bookings:true, order_by:{ column:'total_payments', DESC:true}}">
<template slot="list" slot-scope="{data}">
<company-component :data="data"></company-component>
</template>
</list-component>
</div>
<div class="row tabsContainer tabContent hide m-l-0 m-r-0 hide" tab-name="top-average-spenders" v-if="$store.getters.isAdmin">
<list-component key="2" section="topAverageSpenders" :endpoint="route('api.company.list')" :options="{'with_total_payments': true, 'business_type': 2, with_bookings:true, order_by:{ column:'spending_average_per_day', DESC:false}}">
<list-component key="2" section="topAverageSpenders" :endpoint="route('api.company.list')" :options="{'with_total_payments': true, 'recency':'2022-02-15', 'business_type': 2, with_bookings:true, order_by:{ column:'spending_average_per_day', DESC:false}}">
<template slot="list" slot-scope="{data}">
<company-component :data="data"></company-component>
</template>