[php] SaleController

Viewer

copydownloadembedprintName: SaleController
  1. <?php
  2.  
  3. namespace App\Http\Controllers;
  4.  
  5. use App\Enums\SaleMethod;
  6. use App\Models\Sale;
  7. use App\Http\Requests\StoreSaleRequest;
  8. use App\Http\Requests\UpdateSaleRequest;
  9. use App\Models\Bank;
  10. use App\Models\NoRekening;
  11. use App\Models\Product;
  12. use App\Models\ProductPrice;
  13. use App\Models\SaleDetail;
  14. use App\Services\SaleService;
  15. use Illuminate\Database\Eloquent\Builder;
  16. use Illuminate\Database\Eloquent\Collection;
  17. use Illuminate\Support\Facades\DB;
  18.  
  19. class SaleController extends Controller
  20. {
  21.     protected Collection $products;
  22.     public function __construct()
  23.     {
  24.         $this->products = Product::query()
  25.             ->with(['productPrices', 'productPrice'])
  26.             ->get();
  27.     }
  28.     public function cashIndex()
  29.     {
  30.         $sales = Sale::with('saleDetails.productPrice.product')->where('method', SaleMethod::CASH)->latest()->get();
  31.         return view('sale.cash.index', compact('sales'));
  32.     }
  33.  
  34.     public function cashCreate()
  35.     {
  36.         return view('sale.cash.create')->with('products', $this->products);
  37.     }
  38.  
  39.     public function receivableIndex()
  40.     {
  41.         $sales = Sale::with(['saleDetails.productPrice.product', 'receivableSale'])->where('method', SaleMethod::PIUTANG)->latest()->get();
  42.         return view('sale.receivable.index', compact('sales'));
  43.     }
  44.  
  45.     public function receivableCreate()
  46.     {
  47.         return view('sale.receivable.create')->with('products', $this->products);
  48.     }
  49.  
  50.     public function transferIndex()
  51.     {
  52.         $sales = Sale::with(['saleDetails.productPrice.product', 'transferSale'])->where('method', SaleMethod::TRANSFER)->latest()->get();
  53.         return view('sale.transfer.index', compact('sales'));
  54.     }
  55.  
  56.     public function transferCreate()
  57.     {
  58.         $banks = Bank::all();
  59.         return view('sale.transfer.create')->with([
  60.             'products' => $this->products,
  61.             'banks' => $banks
  62.         ]);
  63.     }
  64.  
  65.     /**
  66.      * Store a newly created resource in storage.
  67.      */
  68.     public function store(StoreSaleRequest $request)
  69.     {
  70.         DB::beginTransaction();
  71.  
  72.         try {
  73.             $saleService = new SaleService($request->validated());
  74.             $sale = $saleService->saveSale();
  75.  
  76.             $route = '';
  77.             if ($sale->method->value == 0) {
  78.                 $route = 'sales.cash.index';
  79.             } elseif ($sale->method->value == 1) {
  80.                 $route = 'sales.receivable.index';
  81.                 $saleService->saveReceivable($sale);
  82.             } elseif ($sale->method->value == 2) {
  83.                 $route = 'sales.transfer.index';
  84.                 $saleService->saveTransfer($sale);
  85.             }
  86.  
  87.             DB::commit();
  88.             return to_route($route)->with('success-sale', route('sale.print', $sale->id));
  89.         } catch (\Exception $e) {
  90.             DB::rollBack();
  91.             return back()->withErrors(['error' => $e->getMessage()])->withInput();
  92.         }
  93.     }
  94.  
  95.     /**
  96.      * Display the specified resource.
  97.      */
  98.     public function show(Sale $sale)
  99.     {
  100.         return view('sale.show')->with([
  101.             'sale' => $sale->load('saleDetails.product', 'receivableSale', 'transferSale')
  102.         ]);
  103.     }
  104.  
  105.     /**
  106.      * Show the form for editing the specified resource.
  107.      */
  108.     public function edit(Sale $sale)
  109.     {
  110.         //
  111.     }
  112.  
  113.     /**
  114.      * Update the specified resource in storage.
  115.      */
  116.     public function update(UpdateSaleRequest $request, Sale $sale)
  117.     {
  118.         //
  119.     }
  120.  
  121.     /**
  122.      * Remove the specified resource from storage.
  123.      */
  124.     public function destroy(Sale $sale)
  125.     {
  126.         $route = '';
  127.  
  128.         DB::beginTransaction();
  129.         try {
  130.             switch ($sale->method->value) {
  131.                 case 0:
  132.                     $route = 'sales.cash.index';
  133.                     break;
  134.                 case 1:
  135.                     $route = 'sales.receivable.index';
  136.                     $sale->receivableSale()->delete();
  137.                     break;
  138.                 case 2:
  139.                     $route = 'sales.transfer.index';
  140.                     $sale->transferSale()->delete();
  141.                     break;
  142.             }
  143.  
  144.             foreach ($sale->saleDetails as $saleDetail) {
  145.                 $saleDetail->delete();
  146.             }
  147.  
  148.             $sale->delete();
  149.             DB::commit();
  150.             return to_route($route);
  151.         } catch (\Exception $e) {
  152.             DB::rollBack();
  153.             return back()->withErrors(['error' => $e->getMessage()]);
  154.         }
  155.     }
  156.  
  157.     public function print(Sale $sale)
  158.     {
  159.         return view('sale.print')->with([
  160.             'sale' => $sale->load('saleDetails.productPrice.product')
  161.         ]);
  162.     }
  163.  
  164.     public function reportIndex()
  165.     {
  166.         $saleDetails = SaleDetail::query()
  167.             ->whereHas('sale')
  168.             ->with(['sale', 'productPrice.product'])
  169.             ->when(request()->filled('start_date'), function (Builder $query) {
  170.                 $query->whereHas('sale', function (Builder $saleQuery) {
  171.                     $saleQuery->whereDate('date', '>=', request()->input('start_date'));
  172.                 });
  173.             })
  174.             ->when(request()->filled('end_date'), function (Builder $query) {
  175.                 $query->whereHas('sale', function (Builder $saleQuery) {
  176.                     $saleQuery->whereDate('date', '<=', request()->input('end_date'));
  177.                 });
  178.             })
  179.             ->latest()
  180.             ->get();
  181.         return view('report.sale', compact('saleDetails'));
  182.     }
  183. }
  184.  

Editor

You can edit this paste and save as new:


File Description
  • SaleController
  • Paste Code
  • 18 Apr-2024
  • 5.5 Kb
You can Share it: