SalesController.php 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. "profit" => $stockProduct->product->profit,
  76. ]
  77. )
  78. ),
  79. ]);
  80. }
  81. /**
  82. * Store a newly created resource in storage.
  83. *
  84. * @param \Illuminate\Http\Request $request
  85. * @return \Illuminate\Http\Response
  86. */
  87. public function store(StoreSaleRequest $request)
  88. {
  89. DB::beginTransaction();
  90. try {
  91. $ppn = Ppn::first()->ppn;
  92. $validated = $request
  93. ->safe()
  94. ->merge([
  95. "user_id" => auth()->user()->id,
  96. "ppn" => $request->ppn ? $ppn : 0,
  97. ])
  98. ->all();
  99. $sale = Sale::create($validated);
  100. foreach ($request->products as $product) {
  101. $validated = [
  102. "product_number" => $product["number"],
  103. "price" => $product["price"],
  104. "qty" => $product["qty"],
  105. ];
  106. $sale->saleDetail()->create($validated);
  107. if ($request->status == "success") {
  108. StockProduct::where(
  109. "product_number",
  110. $product["number"]
  111. )->decrement("qty", $product["qty"]);
  112. }
  113. }
  114. DB::commit();
  115. return to_route("sales.show", $sale)->with(
  116. "success",
  117. __("messages.success.store.sale")
  118. );
  119. } catch (QueryException $e) {
  120. DB::rollBack();
  121. return back()->with("error", __("messages.error.store.sale"));
  122. }
  123. }
  124. /**
  125. * Display the specified resource.
  126. *
  127. * @param Sale $sale
  128. * @return \Illuminate\Http\Response
  129. */
  130. public function show(Sale $sale)
  131. {
  132. return inertia("Sales/Show", [
  133. "id" => $sale->id,
  134. "number" => $sale->number,
  135. "ppn" => Ppn::first()->ppn,
  136. "status" => $sale->status,
  137. "ppnChecked" => $sale->ppn ? true : false,
  138. "customer" => $sale->customer,
  139. "saleDetail" => $sale->saleDetail->transform(
  140. fn($sale) => [
  141. "id" => $sale->id,
  142. "number" => $sale->product_number,
  143. "name" => $sale->product->name,
  144. "price" => $sale->getRawOriginal("price"),
  145. "qty" => $sale->qty,
  146. "unit" => $sale->product->unit,
  147. ]
  148. ),
  149. ]);
  150. }
  151. /**
  152. * Show the form for editing the specified resource.
  153. *
  154. * @param Sale $sale
  155. * @return \Illuminate\Http\Response
  156. */
  157. public function edit(Sale $sale)
  158. {
  159. //
  160. }
  161. /**
  162. * Update the specified resource in storage.
  163. *
  164. * @param \Illuminate\Http\Request $request
  165. * @param Sale $sale
  166. * @return \Illuminate\Http\Response
  167. */
  168. public function update(UpdateSaleRequest $request, Sale $sale)
  169. {
  170. //
  171. }
  172. /**
  173. * Remove the specified resource from storage.
  174. *
  175. * @param Sale $sale
  176. * @return \Illuminate\Http\Response
  177. */
  178. public function destroy(Sale $sale)
  179. {
  180. //
  181. }
  182. }