diff --git a/app/Http/Controllers/Admin/Dashboard/OverviewController.php b/app/Http/Controllers/Admin/Dashboard/OverviewController.php index f353492..29917f6 100644 --- a/app/Http/Controllers/Admin/Dashboard/OverviewController.php +++ b/app/Http/Controllers/Admin/Dashboard/OverviewController.php @@ -3,13 +3,63 @@ namespace App\Http\Controllers\Admin\Dashboard; use App\Http\Controllers\Controller; +use App\Models\Barbershop; +use App\Models\Expense; +use App\Models\Transaction; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\DB; class OverviewController extends Controller { public function index() { + $todayIncome = Transaction::query()->barbershop()->whereDate('created_at', now()->today())->sum('total'); + $yesterdayIncome = Transaction::query()->barbershop()->whereDate('created_at', now()->yesterday())->sum('total'); + + $todayShaving = Transaction::query()->barbershop()->today()->count(); + $yesterdayShaving = Transaction::query()->barbershop()->yesterday()->count(); + + $todayExpense = Expense::query()->barbershop()->today()->sum('amount'); + $yesterdayExpense = Expense::query()->barbershop()->yesterday()->sum('amount'); + + $todayNewCustomer = Transaction::with('customer')->whereDoesntHave('customer.transactions', function ($query) { + $query->where('id', '<>', DB::raw('transactions.id')); + }) + ->barbershop() + ->today() + ->distinct('customer_id') + ->count('customer_id'); + + $yesterdayNewCustomer = Transaction::with('customer')->whereDoesntHave('customer.transactions', function ($query) { + $query->where('id', '<>', DB::raw('transactions.id')); + }) + ->barbershop() + ->yesterday() + ->distinct('customer_id') + ->count('customer_id'); + + $topCustomersByTotal = Transaction::groupBy('customer_id') + ->select( + 'customer_id', + DB::raw('SUM(total) as total_transaction'), + DB::raw('COUNT(*) as transaction_count') + ) + ->orderBy('total_transaction', 'desc') + ->limit(5) + ->get(); + return view('pages.admin.dashboard.overview', [ 'pageTitle' => 'Ringkasan', + 'todayIncome' => $todayIncome, + 'diffIncome' => $todayIncome - $yesterdayIncome, + 'todayShaving' => $todayShaving, + 'diffShaving' => $todayShaving - $yesterdayShaving, + 'todayExpense' => $todayExpense, + 'diffExpense' => $todayExpense - $yesterdayExpense, + 'todayNewCustomer' => $todayNewCustomer, + 'diffNewCustomer' => $todayNewCustomer - $yesterdayNewCustomer, + 'cash' => Barbershop::findOrFail(Auth::user()->barbershop_id)->cash, + 'topCustomersByTotal' => $topCustomersByTotal, ]); } } diff --git a/app/Models/Customer.php b/app/Models/Customer.php index e0d9a58..9ab7869 100644 --- a/app/Models/Customer.php +++ b/app/Models/Customer.php @@ -2,10 +2,13 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Facades\Auth; class Customer extends Model { @@ -18,6 +21,11 @@ class Customer extends Model 'contact_number', ]; + public function scopeBarbershop(Builder $query): Builder + { + return $query->where('barbershop_id', Auth::user()->barbershop_id); + } + public function user(): BelongsTo { return $this->belongsTo(User::class); @@ -27,4 +35,9 @@ public function barbershop(): BelongsTo { return $this->belongsTo(Barbershop::class); } + + public function transactions(): HasMany + { + return $this->hasMany(Transaction::class); + } } diff --git a/app/Models/Expense.php b/app/Models/Expense.php index 7c16546..b79fe0c 100644 --- a/app/Models/Expense.php +++ b/app/Models/Expense.php @@ -3,12 +3,15 @@ namespace App\Models; use App\Observers\ExpenseObserver; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Attributes\ObservedBy; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\MorphOne; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Facades\Auth; #[ObservedBy([ExpenseObserver::class])] class Expense extends Model @@ -23,6 +26,21 @@ class Expense extends Model 'use_cash', ]; + public function scopeBarbershop(Builder $query): Builder + { + return $query->where('barbershop_id', Auth::user()->barbershop_id); + } + + public function scopeToday(Builder $query): Builder + { + return $query->whereDate('created_at', Carbon::today()); + } + + public function scopeYesterday(Builder $query): Builder + { + return $query->whereDate('created_at', Carbon::yesterday()); + } + public function user(): BelongsTo { return $this->belongsTo(User::class); diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 260905d..0e3e994 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -2,11 +2,14 @@ namespace App\Models; +use Carbon\Carbon; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\MorphOne; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Facades\Auth; class Transaction extends Model { @@ -23,6 +26,21 @@ class Transaction extends Model 'payment_method', ]; + public function scopeBarbershop(Builder $query): Builder + { + return $query->where('barbershop_id', Auth::user()->barbershop_id); + } + + public function scopeToday(Builder $query): Builder + { + return $query->whereDate('created_at', Carbon::today()); + } + + public function scopeYesterday(Builder $query): Builder + { + return $query->whereDate('created_at', Carbon::yesterday()); + } + public function user(): BelongsTo { return $this->belongsTo(User::class); diff --git a/public/assets/admin/css/style.css b/public/assets/admin/css/style.css index 2fc3fe6..f1e1f93 100644 --- a/public/assets/admin/css/style.css +++ b/public/assets/admin/css/style.css @@ -18644,7 +18644,7 @@ .widget-decor { } .balance-widget { - background-image: url(../images/dashboard-2/balance-bg.png); + background-image: url(../images/balance-bg.png); background-size: cover; background-repeat: no-repeat; background-position: right; diff --git a/public/assets/admin/images/balance-bg.png b/public/assets/admin/images/balance-bg.png new file mode 100644 index 0000000..54eba6b Binary files /dev/null and b/public/assets/admin/images/balance-bg.png differ diff --git a/public/assets/admin/images/mobile.png b/public/assets/admin/images/mobile.png new file mode 100644 index 0000000..a4cad41 Binary files /dev/null and b/public/assets/admin/images/mobile.png differ diff --git a/resources/views/pages/admin/dashboard/overview.blade.php b/resources/views/pages/admin/dashboard/overview.blade.php index d39831a..b83bd97 100644 --- a/resources/views/pages/admin/dashboard/overview.blade.php +++ b/resources/views/pages/admin/dashboard/overview.blade.php @@ -2,49 +2,136 @@ @section('styles') @endsection @section('app') -