SalesController.php 6.5KB

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