mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-11-04 06:23:17 -05:00 
			
		
		
		
	* Create PHP CS Fixer config and add to CI workflow * Run php cs fixer on project * Add newline at end of file * Update to use PHP CS Fixer v3 * Run v3 config on project * Run seperate config in CI
		
			
				
	
	
		
			147 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Crater\Http\Controllers\V1\Customer;
 | 
						|
 | 
						|
use Carbon\Carbon;
 | 
						|
use Crater\Http\Controllers\Controller;
 | 
						|
use Crater\Models\CompanySetting;
 | 
						|
use Crater\Models\Expense;
 | 
						|
use Crater\Models\Invoice;
 | 
						|
use Crater\Models\Payment;
 | 
						|
use Crater\Models\User;
 | 
						|
use Illuminate\Http\Request;
 | 
						|
 | 
						|
class CustomerStatsController extends Controller
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Handle the incoming request.
 | 
						|
     *
 | 
						|
     * @param  \Illuminate\Http\Request  $request
 | 
						|
     * @return \Illuminate\Http\Response
 | 
						|
     */
 | 
						|
    public function __invoke(Request $request, User $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);
 | 
						|
 | 
						|
        if ($terms[0] <= $start->month) {
 | 
						|
            $startDate->month($terms[0])->startOfMonth();
 | 
						|
            $start->month($terms[0])->startOfMonth();
 | 
						|
            $end->month($terms[0])->endOfMonth();
 | 
						|
        } else {
 | 
						|
            $startDate->subYear()->month($terms[0])->startOfMonth();
 | 
						|
            $start->subYear()->month($terms[0])->startOfMonth();
 | 
						|
            $end->subYear()->month($terms[0])->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($request->header('company'))
 | 
						|
                    ->whereCustomer($customer->id)
 | 
						|
                    ->sum('total') ?? 0
 | 
						|
            );
 | 
						|
            array_push(
 | 
						|
                $expenseTotals,
 | 
						|
                Expense::whereBetween(
 | 
						|
                    'expense_date',
 | 
						|
                    [$start->format('Y-m-d'), $end->format('Y-m-d')]
 | 
						|
                )
 | 
						|
                    ->whereCompany($request->header('company'))
 | 
						|
                    ->whereUser($customer->id)
 | 
						|
                    ->sum('amount') ?? 0
 | 
						|
            );
 | 
						|
            array_push(
 | 
						|
                $receiptTotals,
 | 
						|
                Payment::whereBetween(
 | 
						|
                    'payment_date',
 | 
						|
                    [$start->format('Y-m-d'), $end->format('Y-m-d')]
 | 
						|
                )
 | 
						|
                    ->whereCompany($request->header('company'))
 | 
						|
                    ->whereCustomer($customer->id)
 | 
						|
                    ->sum('amount') ?? 0
 | 
						|
            );
 | 
						|
            array_push(
 | 
						|
                $netProfits,
 | 
						|
                ($receiptTotals[$i] - $expenseTotals[$i])
 | 
						|
            );
 | 
						|
            $i++;
 | 
						|
            array_push($months, $start->format('M'));
 | 
						|
            $monthCounter++;
 | 
						|
            $end->startOfMonth();
 | 
						|
            $start->addMonth()->startOfMonth();
 | 
						|
            $end->addMonth()->endOfMonth();
 | 
						|
        }
 | 
						|
 | 
						|
        $start->subMonth()->endOfMonth();
 | 
						|
 | 
						|
        $salesTotal = Invoice::whereCompany($request->header('company'))
 | 
						|
            ->whereBetween(
 | 
						|
                'invoice_date',
 | 
						|
                [$startDate->format('Y-m-d'), $start->format('Y-m-d')]
 | 
						|
            )
 | 
						|
            ->whereCustomer($customer->id)
 | 
						|
            ->sum('total');
 | 
						|
        $totalReceipts = Payment::whereCompany($request->header('company'))
 | 
						|
            ->whereBetween(
 | 
						|
                'payment_date',
 | 
						|
                [$startDate->format('Y-m-d'), $start->format('Y-m-d')]
 | 
						|
            )
 | 
						|
            ->whereCustomer($customer->id)
 | 
						|
            ->sum('amount');
 | 
						|
        $totalExpenses = Expense::whereCompany($request->header('company'))
 | 
						|
            ->whereBetween(
 | 
						|
                'expense_date',
 | 
						|
                [$startDate->format('Y-m-d'), $start->format('Y-m-d')]
 | 
						|
            )
 | 
						|
            ->whereUser($customer->id)
 | 
						|
            ->sum('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,
 | 
						|
        ];
 | 
						|
 | 
						|
        $customer = User::with([
 | 
						|
            'billingAddress',
 | 
						|
            'shippingAddress',
 | 
						|
            'billingAddress.country',
 | 
						|
            'shippingAddress.country',
 | 
						|
            'currency',
 | 
						|
            'fields.customField',
 | 
						|
        ])->find($customer->id);
 | 
						|
 | 
						|
        return response()->json([
 | 
						|
            'customer' => $customer,
 | 
						|
            'chartData' => $chartData,
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
}
 |