From c0454613a8457ca2b1fc590a4befc3f04e751fb9 Mon Sep 17 00:00:00 2001 From: Darko Gjorgjijoski Date: Fri, 3 Apr 2026 18:10:59 +0200 Subject: [PATCH] Move customer stats logic from CustomerStatsController to CustomerService --- .../Customer/CustomerStatsController.php | 129 ++---------------- app/Services/CustomerService.php | 118 ++++++++++++++++ 2 files changed, 128 insertions(+), 119 deletions(-) diff --git a/app/Http/Controllers/V1/Admin/Customer/CustomerStatsController.php b/app/Http/Controllers/V1/Admin/Customer/CustomerStatsController.php index 2e001a07..b4d6691d 100644 --- a/app/Http/Controllers/V1/Admin/Customer/CustomerStatsController.php +++ b/app/Http/Controllers/V1/Admin/Customer/CustomerStatsController.php @@ -4,134 +4,25 @@ namespace App\Http\Controllers\V1\Admin\Customer; use App\Http\Controllers\Controller; use App\Http\Resources\CustomerResource; -use App\Models\CompanySetting; use App\Models\Customer; -use App\Models\Expense; -use App\Models\Invoice; -use App\Models\Payment; -use Carbon\Carbon; +use App\Services\CustomerService; use Illuminate\Http\Request; -use Illuminate\Http\Response; class CustomerStatsController extends Controller { - /** - * Handle the incoming request. - * - * @return Response - */ + public function __construct( + private readonly CustomerService $customerService, + ) {} + public function __invoke(Request $request, Customer $customer) { $this->authorize('view', $customer); - $i = 0; - $months = []; - $invoiceTotals = []; - $expenseTotals = []; - $receiptTotals = []; - $netProfits = []; - $monthCounter = 0; - $fiscalYear = CompanySetting::getSetting('fiscal_year', $request->header('company')); - $startDate = Carbon::now(); - $start = Carbon::now(); - $end = Carbon::now(); - $terms = explode('-', $fiscalYear); - $companyStartMonth = intval($terms[0]); - - if ($companyStartMonth <= $start->month) { - $startDate->month($companyStartMonth)->startOfMonth(); - $start->month($companyStartMonth)->startOfMonth(); - $end->month($companyStartMonth)->endOfMonth(); - } else { - $startDate->subYear()->month($companyStartMonth)->startOfMonth(); - $start->subYear()->month($companyStartMonth)->startOfMonth(); - $end->subYear()->month($companyStartMonth)->endOfMonth(); - } - - if ($request->has('previous_year')) { - $startDate->subYear()->startOfMonth(); - $start->subYear()->startOfMonth(); - $end->subYear()->endOfMonth(); - } - while ($monthCounter < 12) { - array_push( - $invoiceTotals, - Invoice::whereBetween( - 'invoice_date', - [$start->format('Y-m-d'), $end->format('Y-m-d')] - ) - ->whereCompany() - ->whereCustomer($customer->id) - ->sum('base_total') ?? 0 - ); - array_push( - $expenseTotals, - Expense::whereBetween( - 'expense_date', - [$start->format('Y-m-d'), $end->format('Y-m-d')] - ) - ->whereCompany() - ->whereUser($customer->id) - ->sum('base_amount') ?? 0 - ); - array_push( - $receiptTotals, - Payment::whereBetween( - 'payment_date', - [$start->format('Y-m-d'), $end->format('Y-m-d')] - ) - ->whereCompany() - ->whereCustomer($customer->id) - ->sum('base_amount') ?? 0 - ); - array_push( - $netProfits, - ($receiptTotals[$i] - $expenseTotals[$i]) - ); - $i++; - array_push($months, $start->translatedFormat('M')); - $monthCounter++; - $end->startOfMonth(); - $start->addMonth()->startOfMonth(); - $end->addMonth()->endOfMonth(); - } - - $start->subMonth()->endOfMonth(); - - $salesTotal = Invoice::whereBetween( - 'invoice_date', - [$startDate->format('Y-m-d'), $start->format('Y-m-d')] - ) - ->whereCompany() - ->whereCustomer($customer->id) - ->sum('base_total'); - $totalReceipts = Payment::whereBetween( - 'payment_date', - [$startDate->format('Y-m-d'), $start->format('Y-m-d')] - ) - ->whereCompany() - ->whereCustomer($customer->id) - ->sum('base_amount'); - $totalExpenses = Expense::whereBetween( - 'expense_date', - [$startDate->format('Y-m-d'), $start->format('Y-m-d')] - ) - ->whereCompany() - ->whereUser($customer->id) - ->sum('base_amount'); - $netProfit = (int) $totalReceipts - (int) $totalExpenses; - - $chartData = [ - 'months' => $months, - 'invoiceTotals' => $invoiceTotals, - 'expenseTotals' => $expenseTotals, - 'receiptTotals' => $receiptTotals, - 'netProfit' => $netProfit, - 'netProfits' => $netProfits, - 'salesTotal' => $salesTotal, - 'totalReceipts' => $totalReceipts, - 'totalExpenses' => $totalExpenses, - ]; + $chartData = $this->customerService->getStats( + $customer, + $request->header('company'), + $request->has('previous_year') + ); $customer = Customer::find($customer->id); diff --git a/app/Services/CustomerService.php b/app/Services/CustomerService.php index a811e86d..34673eb7 100644 --- a/app/Services/CustomerService.php +++ b/app/Services/CustomerService.php @@ -2,7 +2,12 @@ namespace App\Services; +use App\Models\CompanySetting; use App\Models\Customer; +use App\Models\Expense; +use App\Models\Invoice; +use App\Models\Payment; +use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Collection; use Illuminate\Validation\ValidationException; @@ -117,4 +122,117 @@ class CustomerService return true; } + + public function getStats(Customer $customer, int $companyId, bool $previousYear = false): array + { + $i = 0; + $months = []; + $invoiceTotals = []; + $expenseTotals = []; + $receiptTotals = []; + $netProfits = []; + $monthCounter = 0; + $fiscalYear = CompanySetting::getSetting('fiscal_year', $companyId); + $startDate = Carbon::now(); + $start = Carbon::now(); + $end = Carbon::now(); + $terms = explode('-', $fiscalYear); + $companyStartMonth = intval($terms[0]); + + if ($companyStartMonth <= $start->month) { + $startDate->month($companyStartMonth)->startOfMonth(); + $start->month($companyStartMonth)->startOfMonth(); + $end->month($companyStartMonth)->endOfMonth(); + } else { + $startDate->subYear()->month($companyStartMonth)->startOfMonth(); + $start->subYear()->month($companyStartMonth)->startOfMonth(); + $end->subYear()->month($companyStartMonth)->endOfMonth(); + } + + if ($previousYear) { + $startDate->subYear()->startOfMonth(); + $start->subYear()->startOfMonth(); + $end->subYear()->endOfMonth(); + } + + while ($monthCounter < 12) { + array_push( + $invoiceTotals, + Invoice::whereBetween( + 'invoice_date', + [$start->format('Y-m-d'), $end->format('Y-m-d')] + ) + ->whereCompany() + ->whereCustomer($customer->id) + ->sum('base_total') ?? 0 + ); + array_push( + $expenseTotals, + Expense::whereBetween( + 'expense_date', + [$start->format('Y-m-d'), $end->format('Y-m-d')] + ) + ->whereCompany() + ->whereUser($customer->id) + ->sum('base_amount') ?? 0 + ); + array_push( + $receiptTotals, + Payment::whereBetween( + 'payment_date', + [$start->format('Y-m-d'), $end->format('Y-m-d')] + ) + ->whereCompany() + ->whereCustomer($customer->id) + ->sum('base_amount') ?? 0 + ); + array_push( + $netProfits, + ($receiptTotals[$i] - $expenseTotals[$i]) + ); + $i++; + array_push($months, $start->translatedFormat('M')); + $monthCounter++; + $end->startOfMonth(); + $start->addMonth()->startOfMonth(); + $end->addMonth()->endOfMonth(); + } + + $start->subMonth()->endOfMonth(); + + $salesTotal = Invoice::whereBetween( + 'invoice_date', + [$startDate->format('Y-m-d'), $start->format('Y-m-d')] + ) + ->whereCompany() + ->whereCustomer($customer->id) + ->sum('base_total'); + $totalReceipts = Payment::whereBetween( + 'payment_date', + [$startDate->format('Y-m-d'), $start->format('Y-m-d')] + ) + ->whereCompany() + ->whereCustomer($customer->id) + ->sum('base_amount'); + $totalExpenses = Expense::whereBetween( + 'expense_date', + [$startDate->format('Y-m-d'), $start->format('Y-m-d')] + ) + ->whereCompany() + ->whereUser($customer->id) + ->sum('base_amount'); + $netProfit = (int) $totalReceipts - (int) $totalExpenses; + + return [ + 'months' => $months, + 'invoiceTotals' => $invoiceTotals, + 'expenseTotals' => $expenseTotals, + 'receiptTotals' => $receiptTotals, + 'netProfit' => $netProfit, + 'netProfits' => $netProfits, + 'salesTotal' => $salesTotal, + 'totalReceipts' => $totalReceipts, + 'totalExpenses' => $totalExpenses, + ]; + } }