CustomerController.php 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\Ppn;
  4. use App\Models\Sale;
  5. use App\Models\Customer;
  6. use App\Models\SaleDetail;
  7. use App\Exports\CustomerHistoryExport;
  8. use App\Http\Requests\Customer\StoreCustomerRequest;
  9. use App\Http\Requests\Customer\UpdateCustomerRequest;
  10. class CustomerController extends Controller
  11. {
  12. public function __construct()
  13. {
  14. $this->authorizeResource(Customer::class);
  15. }
  16. /**
  17. * Display a listing of the resource.
  18. *
  19. * @return \Illuminate\Http\Response
  20. */
  21. public function index()
  22. {
  23. return inertia("Customers/Index", [
  24. "initialFilters" => request()->only("search"),
  25. "customers" => Customer::search(request()->only("search"))
  26. ->latest()
  27. ->paginate(10)
  28. ->withQueryString()
  29. ->through(
  30. fn($customer) => [
  31. "id" => $customer->id,
  32. "name" => $customer->name,
  33. "address" => $customer->address,
  34. "phone" => $customer->phone,
  35. "npwp" => $customer->npwp,
  36. "isUsed" => $customer->sales()->exists(),
  37. ]
  38. ),
  39. ]);
  40. }
  41. /**
  42. * Show the form for creating a new resource.
  43. *
  44. * @return \Illuminate\Http\Response
  45. */
  46. public function create()
  47. {
  48. return inertia("Customers/Create");
  49. }
  50. /**
  51. * Store a newly created resource in storage.
  52. *
  53. * @param \Illuminate\Http\Request $request
  54. * @return \Illuminate\Http\Response
  55. */
  56. public function store(StoreCustomerRequest $request)
  57. {
  58. Customer::create($request->validated());
  59. return back()->with("success", __("messages.success.store.customer"));
  60. }
  61. /**
  62. * Display the specified resource.
  63. *
  64. * @param Customer $customer
  65. * @return \Illuminate\Http\Response
  66. */
  67. public function show(Customer $customer)
  68. {
  69. return inertia("Customers/Show", [
  70. "initialFilters" => request()->only(
  71. "start_date",
  72. "end_date",
  73. "number_product"
  74. ),
  75. "customer" => $customer,
  76. "historyPurchase" => $customer
  77. ->sales()
  78. ->filter(
  79. request()->only("start_date", "end_date", "product_number")
  80. )
  81. ->latest()
  82. ->paginate(10)
  83. ->withQueryString()
  84. ->through(
  85. fn($sale) => [
  86. "id" => $sale->id,
  87. "createdAt" => $sale->created_at,
  88. "number" => $sale->number,
  89. "status" => $sale->status,
  90. "ppn" => $sale->ppn,
  91. ]
  92. ),
  93. ]);
  94. }
  95. /**
  96. * Show the form for editing the specified resource.
  97. *
  98. * @param Customer $customer
  99. * @return \Illuminate\Http\Response
  100. */
  101. public function edit(Customer $customer)
  102. {
  103. return inertia("Customers/Edit", compact("customer"));
  104. }
  105. /**
  106. * Update the specified resource in storage.
  107. *
  108. * @param \Illuminate\Http\Request $request
  109. * @param Customer $customer
  110. * @return \Illuminate\Http\Response
  111. */
  112. public function update(UpdateCustomerRequest $request, Customer $customer)
  113. {
  114. $customer->update($request->validated());
  115. return back()->with("success", __("messages.success.update.customer"));
  116. }
  117. /**
  118. * Remove the specified resource from storage.
  119. *
  120. * @param Customer $customer
  121. * @return \Illuminate\Http\Response
  122. */
  123. public function destroy(Customer $customer)
  124. {
  125. $customer->delete();
  126. return back()->with("success", __("messages.success.destroy.customer"));
  127. }
  128. public function historyPurchase(Sale $sale)
  129. {
  130. return inertia("Customers/HistoryPurchase", [
  131. "id" => $sale->id,
  132. "number" => $sale->number,
  133. "ppn" => Ppn::first()->ppn,
  134. "status" => $sale->status,
  135. "ppnChecked" => $sale->ppn ? true : false,
  136. "customer" => $sale->customer,
  137. "saleDetail" => $sale->saleDetail->transform(
  138. fn($sale) => [
  139. "id" => $sale->id,
  140. "number" => $sale->product_number,
  141. "name" => $sale->product->name,
  142. "price" => $sale->getRawOriginal("price"),
  143. "qty" => $sale->qty,
  144. "unit" => $sale->product->unit,
  145. ]
  146. ),
  147. ]);
  148. }
  149. public function historyPurchaseExcel()
  150. {
  151. $this->authorize("viewAny", Customer::class);
  152. return new CustomerHistoryExport([
  153. "sales" => SaleDetail::filter(
  154. request()->only("start_date", "end_date", "product_number")
  155. )
  156. ->latest()
  157. ->get()
  158. ->map(
  159. fn($saleDetail) => [
  160. "createdAt" => $saleDetail->created_at,
  161. "name" => $saleDetail->product->name,
  162. "number" => $saleDetail->sale->number,
  163. "qty" => $saleDetail->qty,
  164. "status" => $saleDetail->sale->status,
  165. "ppn" => $saleDetail->sale->ppn,
  166. "price" => $saleDetail->price * $saleDetail->qty,
  167. ]
  168. ),
  169. ]);
  170. }
  171. }