mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-10-31 13:41:09 -04:00 
			
		
		
		
	build version 400
This commit is contained in:
		
							
								
								
									
										146
									
								
								app/Http/Controllers/V1/Customer/CustomerStatsController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								app/Http/Controllers/V1/Customer/CustomerStatsController.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,146 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Crater\Http\Controllers\V1\Customer; | ||||
|  | ||||
| use Crater\Http\Controllers\Controller; | ||||
| use Crater\Models\Invoice; | ||||
| use Crater\Models\Expense; | ||||
| use Crater\Models\Payment; | ||||
| use Crater\Models\User; | ||||
| use Crater\Models\CompanySetting; | ||||
| use Carbon\Carbon; | ||||
| 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, | ||||
|         ]); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										122
									
								
								app/Http/Controllers/V1/Customer/CustomersController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								app/Http/Controllers/V1/Customer/CustomersController.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,122 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Crater\Http\Controllers\V1\Customer; | ||||
|  | ||||
| use Illuminate\Http\Request; | ||||
| use Crater\Http\Requests; | ||||
| use Crater\Models\User; | ||||
| use Crater\Http\Controllers\Controller; | ||||
| use Illuminate\Support\Facades\DB; | ||||
|  | ||||
|  | ||||
| class CustomersController extends Controller | ||||
| { | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function index(Request $request) | ||||
|     { | ||||
|         $limit = $request->has('limit') ? $request->limit : 10; | ||||
|  | ||||
|         $customers = User::with('creator') | ||||
|             ->customer() | ||||
|             ->applyFilters($request->only([ | ||||
|                 'search', | ||||
|                 'contact_name', | ||||
|                 'display_name', | ||||
|                 'phone', | ||||
|                 'customer_id', | ||||
|                 'orderByField', | ||||
|                 'orderBy' | ||||
|             ])) | ||||
|             ->whereCompany($request->header('company')) | ||||
|             ->select( | ||||
|                 'users.*', | ||||
|                 DB::raw('sum(invoices.due_amount) as due_amount') | ||||
|             ) | ||||
|             ->groupBy('users.id') | ||||
|             ->leftJoin('invoices', 'users.id', '=', 'invoices.user_id') | ||||
|             ->paginateData($limit); | ||||
|  | ||||
|         return response()->json([ | ||||
|             'customers' => $customers, | ||||
|             'customerTotalCount' => User::whereRole('customer')->count() | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store a newly created resource in storage. | ||||
|      * | ||||
|      * @param  \Illuminate\Http\Request  $request | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function store(Requests\CustomerRequest $request) | ||||
|     { | ||||
|         $customer = User::createCustomer($request); | ||||
|  | ||||
|         return response()->json([ | ||||
|             'customer' => $customer, | ||||
|             'success' => true | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display the specified resource. | ||||
|      * | ||||
|      * @param  User $customer | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function show(User $customer) | ||||
|     { | ||||
|         $customer->load([ | ||||
|             'billingAddress.country', | ||||
|             'shippingAddress.country', | ||||
|             'fields.customField', | ||||
|             'creator' | ||||
|         ]); | ||||
|  | ||||
|         $currency = $customer->currency; | ||||
|  | ||||
|         return response()->json([ | ||||
|             'customer' => $customer, | ||||
|             'currency' => $currency, | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Update the specified resource in storage. | ||||
|      * | ||||
|      * @param  \Illuminate\Http\Request $request | ||||
|      * @param  \Crater\Models\User $customer | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function update(Requests\CustomerRequest $request, User $customer) | ||||
|     { | ||||
|         $customer = User::updateCustomer($request, $customer); | ||||
|  | ||||
|         $customer = User::with('billingAddress', 'shippingAddress', 'fields')->find($customer->id); | ||||
|  | ||||
|         return response()->json([ | ||||
|             'customer' => $customer, | ||||
|             'success' => true | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove a list of Customers along side all their resources (ie. Estimates, Invoices, Payments and Addresses) | ||||
|      * | ||||
|      * @param  \Illuminate\Http\Request $request | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function delete(Request $request) | ||||
|     { | ||||
|         User::deleteCustomers($request->ids); | ||||
|  | ||||
|         return response()->json([ | ||||
|             'success' => true | ||||
|         ]); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user