SalesController.php 8.2KB

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