SalesController.php 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  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\SaleDetail;
  8. use App\Models\StockProduct;
  9. use App\Services\HelperService;
  10. use Illuminate\Support\Facades\DB;
  11. use Illuminate\Database\QueryException;
  12. use App\Http\Requests\Sales\StoreSaleRequest;
  13. use App\Http\Requests\Sales\UpdateSaleRequest;
  14. class SalesController extends Controller
  15. {
  16. public function __construct()
  17. {
  18. $this->authorizeResource(Sale::class);
  19. }
  20. /**
  21. * Display a listing of the resource.
  22. *
  23. * @return \Illuminate\Http\Response
  24. */
  25. public function index()
  26. {
  27. return inertia("Sales/Index", [
  28. "initialSearch" => request("search"),
  29. "sales" => Sale::filter(request()->only("search"))
  30. ->latest()
  31. ->paginate(10)
  32. ->withQueryString()
  33. ->through(
  34. fn($sale) => [
  35. "id" => $sale->id,
  36. "updatedAt" => $sale->updated_at,
  37. "name" => $sale->customer->name,
  38. "phone" => $sale->customer->phone,
  39. "email" => $sale->customer->email,
  40. "price" => HelperService::setRupiahFormat(
  41. SaleDetail::totalPrice($sale)
  42. ),
  43. "status" => $sale->status,
  44. ]
  45. ),
  46. ]);
  47. }
  48. /**
  49. * Show the form for creating a new resource.
  50. *
  51. * @return \Illuminate\Http\Response
  52. */
  53. public function create()
  54. {
  55. return inertia("Sales/Create", [
  56. "number" => "PJN" . now()->format("YmdHis"),
  57. "ppn" => Ppn::first()->ppn,
  58. "customers" => Inertia::lazy(
  59. fn() => Customer::filter([
  60. "search" => request("customer"),
  61. ])->get()
  62. ),
  63. "stockProducts" => Inertia::lazy(
  64. fn() => StockProduct::filter([
  65. "search" => request("stockProduct"),
  66. ])
  67. ->get()
  68. ->transform(
  69. fn($stockProduct) => [
  70. "number" => $stockProduct->product_number,
  71. "name" => $stockProduct->product->name,
  72. "price" => $stockProduct->price,
  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. dd($request->validated());
  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. $validated = [
  109. "sale_number" => $sale->number,
  110. "price" => $product["price"],
  111. "qty" => $product["qty"],
  112. "product_number" => $product["number"],
  113. ];
  114. StockProduct::create($validated);
  115. }
  116. }
  117. DB::commit();
  118. return back()->with("success", __("messages.success.store.sale"));
  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. //
  133. }
  134. /**
  135. * Show the form for editing the specified resource.
  136. *
  137. * @param Sale $sale
  138. * @return \Illuminate\Http\Response
  139. */
  140. public function edit(Sale $sale)
  141. {
  142. return inertia("Sales/Edit", [
  143. "id" => $sale->id,
  144. "number" => $sale->number,
  145. "ppn" => Ppn::first()->ppn,
  146. "status" => $sale->status,
  147. "ppnChecked" => $sale->ppn ? true : false,
  148. "customer" => $sale->customer,
  149. "stockProducts" => Inertia::lazy(
  150. fn() => StockProduct::filter([
  151. "search" => request("stockProduct"),
  152. ])
  153. ->get()
  154. ->transform(
  155. fn($stockProduct) => [
  156. "number" => $stockProduct->product_number,
  157. "name" => $stockProduct->product->name,
  158. "price" => $stockProduct->price,
  159. "qty" => $stockProduct->qty,
  160. "unit" => $stockProduct->product->unit,
  161. "profit" => $stockProduct->product->profit,
  162. ]
  163. )
  164. ),
  165. "saleDetail" => $sale->saleDetail->transform(
  166. fn($sale) => [
  167. "id" => $sale->id,
  168. "number" => $sale->product_number,
  169. "name" => $sale->product->name,
  170. "price" => $sale->price,
  171. "qty" => $sale->qty,
  172. "unit" => $sale->product->unit,
  173. ]
  174. ),
  175. ]);
  176. }
  177. /**
  178. * Update the specified resource in storage.
  179. *
  180. * @param \Illuminate\Http\Request $request
  181. * @param Sale $sale
  182. * @return \Illuminate\Http\Response
  183. */
  184. public function update(UpdateSaleRequest $request, Sale $sale)
  185. {
  186. dd($sale);
  187. DB::beginTransaction();
  188. try {
  189. $ppn = Ppn::first()->ppn;
  190. $validated = $request
  191. ->safe()
  192. ->merge([
  193. "ppn" => $request->ppn ? $ppn : 0,
  194. ])
  195. ->all();
  196. $sale->update($validated);
  197. foreach ($request->products as $product) {
  198. $validated = [
  199. "product_number" => $product["number"],
  200. "price" => $product["price"],
  201. "qty" => $product["qty"],
  202. ];
  203. if (!empty($product["label"])) {
  204. if ($product["label"] == "add") {
  205. $sale->saleDetail()->create($validated);
  206. }
  207. if ($product["label"] == "edit") {
  208. $sale->saleDetail
  209. ->find($product["id"])
  210. ->update($validated);
  211. }
  212. if ($product["label"] == "delete") {
  213. $sale->saleDetail->find($product["id"])->delete();
  214. }
  215. }
  216. if ($request->status == "success") {
  217. $validated = [
  218. "sale_number" => $sale->number,
  219. "price" => $product["price"],
  220. "qty" => $product["qty"],
  221. "product_number" => $product["number"],
  222. ];
  223. StockProduct::create($validated);
  224. }
  225. }
  226. DB::commit();
  227. return back()->with("success", __("messages.success.update.sale"));
  228. } catch (QueryException $e) {
  229. DB::rollBack();
  230. return back()->with("error", __("messages.error.update.sale"));
  231. }
  232. }
  233. /**
  234. * Remove the specified resource from storage.
  235. *
  236. * @param Sale $sale
  237. * @return \Illuminate\Http\Response
  238. */
  239. public function destroy(Sale $sale)
  240. {
  241. //
  242. }
  243. }