SalesController.php 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\Ppn;
  4. use App\Models\Sale;
  5. use Inertia\Inertia;
  6. use App\Models\Customer;
  7. use App\Models\StockProduct;
  8. use App\Services\HelperService;
  9. use Illuminate\Support\Facades\DB;
  10. use Illuminate\Database\QueryException;
  11. use App\Http\Requests\Sales\StoreSaleRequest;
  12. use App\Http\Requests\Sales\UpdateSaleRequest;
  13. class SalesController extends Controller
  14. {
  15. public function __construct()
  16. {
  17. $this->authorizeResource(Sale::class);
  18. }
  19. /**
  20. * Display a listing of the resource.
  21. *
  22. * @return \Illuminate\Http\Response
  23. */
  24. public function index()
  25. {
  26. return inertia("Sales/Index", [
  27. "initialSearch" => request("search"),
  28. "sales" => Sale::filter(request()->only("search"))
  29. ->latest()
  30. ->paginate(10)
  31. ->withQueryString()
  32. ->through(
  33. fn($sale) => [
  34. "id" => $sale->id,
  35. "updatedAt" => $sale->updated_at,
  36. "name" => $sale->customer->name,
  37. "phone" => $sale->customer->phone,
  38. "email" => $sale->customer->email,
  39. "price" => HelperService::setRupiahFormat(
  40. $sale->saleDetail->sum("price")
  41. ),
  42. "status" => $sale->status,
  43. ]
  44. ),
  45. ]);
  46. }
  47. /**
  48. * Show the form for creating a new resource.
  49. *
  50. * @return \Illuminate\Http\Response
  51. */
  52. public function create()
  53. {
  54. return inertia("Sales/Create", [
  55. "number" => "PJN" . now()->format("YmdHis"),
  56. "ppn" => Ppn::first()->ppn,
  57. "customers" => Inertia::lazy(
  58. fn() => Customer::filter([
  59. "search" => request("customer"),
  60. ])->get()
  61. ),
  62. "stockProducts" => Inertia::lazy(
  63. fn() => StockProduct::filter([
  64. "search" => request("stockProduct"),
  65. ])
  66. ->get()
  67. ->transform(
  68. fn($stockProduct) => [
  69. "number" => $stockProduct->product_number,
  70. "name" => $stockProduct->product->name,
  71. "price" => $stockProduct->price,
  72. "ppn" => $stockProduct->ppn,
  73. "qty" => $stockProduct->qty,
  74. "unit" => $stockProduct->product->unit,
  75. ]
  76. )
  77. ),
  78. ]);
  79. }
  80. /**
  81. * Store a newly created resource in storage.
  82. *
  83. * @param \Illuminate\Http\Request $request
  84. * @return \Illuminate\Http\Response
  85. */
  86. public function store(StoreSaleRequest $request)
  87. {
  88. DB::beginTransaction();
  89. try {
  90. $ppn = Ppn::first()->ppn;
  91. $validated = $request
  92. ->safe()
  93. ->merge([
  94. "user_id" => auth()->user()->id,
  95. "ppn" => $request->ppn ? $ppn : 0,
  96. ])
  97. ->all();
  98. $sale = Sale::create($validated);
  99. foreach ($request->products as $product) {
  100. $validated = [
  101. "product_number" => $product["number"],
  102. "price" => $product["price"],
  103. "qty" => $product["qty"],
  104. ];
  105. $sale->saleDetail()->create($validated);
  106. if ($request->status == "success") {
  107. StockProduct::where(
  108. "product_number",
  109. $product["number"]
  110. )->decrement("qty", $product["qty"]);
  111. }
  112. }
  113. DB::commit();
  114. return to_route("sales.show", $sale)->with(
  115. "success",
  116. __("messages.success.store.sale")
  117. );
  118. } catch (QueryException $e) {
  119. DB::rollBack();
  120. return back()->with("error", __("messages.error.store.sale"));
  121. }
  122. }
  123. /**
  124. * Display the specified resource.
  125. *
  126. * @param Sale $sale
  127. * @return \Illuminate\Http\Response
  128. */
  129. public function show(Sale $sale)
  130. {
  131. return inertia("Sales/Show", [
  132. "id" => $sale->id,
  133. "number" => $sale->number,
  134. "ppn" => Ppn::first()->ppn,
  135. "status" => $sale->status,
  136. "ppnChecked" => $sale->ppn ? true : false,
  137. "customer" => $sale->customer,
  138. "saleDetail" => $sale->saleDetail->transform(
  139. fn($sale) => [
  140. "id" => $sale->id,
  141. "number" => $sale->product_number,
  142. "name" => $sale->product->name,
  143. "price" => $sale->getRawOriginal("price"),
  144. "qty" => $sale->qty,
  145. "unit" => $sale->product->unit,
  146. ]
  147. ),
  148. ]);
  149. }
  150. /**
  151. * Show the form for editing the specified resource.
  152. *
  153. * @param Sale $sale
  154. * @return \Illuminate\Http\Response
  155. */
  156. public function edit(Sale $sale)
  157. {
  158. //
  159. }
  160. /**
  161. * Update the specified resource in storage.
  162. *
  163. * @param \Illuminate\Http\Request $request
  164. * @param Sale $sale
  165. * @return \Illuminate\Http\Response
  166. */
  167. public function update(UpdateSaleRequest $request, Sale $sale)
  168. {
  169. //
  170. }
  171. /**
  172. * Remove the specified resource from storage.
  173. *
  174. * @param Sale $sale
  175. * @return \Illuminate\Http\Response
  176. */
  177. public function destroy(Sale $sale)
  178. {
  179. //
  180. }
  181. }