SalesController.php 6.1KB

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