resto-dhepot/app/Http/Controllers/Kasir/Transaksi.php

185 lines
7.1 KiB
PHP

<?php
namespace App\Http\Controllers\Kasir;
use App\Http\Controllers\Controller;
use App\Models\DetailPesanan;
use App\Models\KelompokKategori;
use App\Models\Pesanan;
use App\Models\Produk;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class Transaksi extends Controller
{
public function index()
{
$orderCode = "ORD -" . strtoupper(random_str(6, random_str()));
$KelompokKategori = KelompokKategori::with('kelompokKategoriPivot.produk')->get();
// foreach ($KelompokKategori as $item) {
// foreach ($item->kelompokKategoriPivot as $kelompokKategoriPivot) {
// // Query tambahan untuk mendapatkan total pembelian berdasarkan produk
// $totalPembelianByProduk[$kelompokKategoriPivot->produk->id] = DetailPesanan::select('detail_pesanans.produk_id', DB::raw('SUM(detail_pesanans.jumlah_produk) as total_beli'))
// ->where('detail_pesanans.produk_id', '=', $kelompokKategoriPivot->produk->id)
// ->groupBy('detail_pesanans.produk_id')
// ->first();
// }
// }
$produk = Produk::all();
// return view('pages.Kasir.transaksi', compact('orderCode', 'KelompokKategori', 'produk', 'totalPembelianByProduk'));
return view('pages.Kasir.transaksi', compact('orderCode', 'KelompokKategori', 'produk'));
}
public function getCetakTigaKali()
{
$data = Pesanan::with(['detailPesanan', 'user'])->where('status_printer', null)->get();
$nomor = 1;
return $datatables = datatables()
->of($data)
->addColumn('nomor', function ($data) use (&$nomor) {
return $nomor++;
})
->addColumn('nama_user', function ($data) {
return $data->user->name;
})
->addColumn('created_at', function ($data) {
return \Carbon\Carbon::parse($data->created_at)->format('d F Y H:i:s');
})
->addColumn('grand_total', function ($data) {
return 'Rp ' . number_format($data->grand_total, 0, ',', '.');
})
->addColumn('ubah', function ($data) {
return '<div class="btn-group">
<a href="javascript:void(0)" onclick="printTigaKali(\'' . $data->id . '\')"><span class="btn btn-xs btn-success"><i class="fas fa-print"></i></span></a></div>';
})
->rawColumns(['nomor', 'nama_user', 'created_at', 'grand_total', 'ubah'])
->make(true);
}
public function printTigaKali($id)
{
$pesanan = \App\Models\Pesanan::with('detailPesanan', 'user')->find($id);
$data = Pesanan::where('id', $id);
$data->update([
'status_printer' => 1
]);
return view('pages.Kasir.print_dapur_3x', compact('pesanan'));
}
public function store(Request $request)
{
$request->validate([
'orderCode' => 'required',
'namaPemesan' => 'required',
'nomorMeja' => 'required',
'orderMenus' => 'required',
], [
'orderCode.required' => 'Kode pesanan tidak boleh kosong',
'namaPemesan.required' => 'Nama pemesan tidak boleh kosong',
'nomorMeja.required' => 'Nomor meja tidak boleh kosong',
'orderMenus.required' => 'Pesanan tidak boleh kosong',
]);
try {
DB::beginTransaction();
$orderMenusQty = 0;
$orderMenusRupiah = 0;
foreach ($request->orderMenus as $key => $value) {
$orderMenusQty += $value['qty'];
$orderMenusRupiah += $value['total'];
}
$pesananDatas = [
'kode_pesanan' => $request->orderCode,
'nama_pemesan' => $request->namaPemesan,
'nomor_meja' => $request->nomorMeja,
'status_pesanan' => '1',
'tanggal_pesanan' => date('Y-m-d H:i:s'),
'keterangan_pesanan' => $request->keteranganPesanan ?? null,
'total_pesanan' => $orderMenusQty,
'total_bayar' => $orderMenusRupiah,
'grand_total' => $request->totalDiskon,
'nominal_bayar' => $request->nominalBayar,
'diskon_persen' => $request->diskon,
'nominal_kembali' => $request->kembali,
'status_bayar' => '1',
'user_id' => '1',
];
$pesananModels = \App\Models\Pesanan::create($pesananDatas);
foreach ($request->orderMenus as $key => $value) {
// calculate produk promo untuk mengurangi stok
$produk = Produk::find($value['id']);
foreach ($produk->kelompokKategori as $key => $value2) {
if ($value2->kode_kelompok_kategori == 'PROMO') {
$produk->stok_promo = $produk->stok_promo - $value['qty'];
$produk->save();
}
}
$oderDatas = [
'pesanan_id' => $pesananModels->id,
'produk_id' => $value['id'],
'nama_produk' => $value['nama'],
'jumlah_produk' => $value['qty'],
'harga_produk' => $value['harga'],
'total_harga_produk' => $value['total'],
'diskon_persen' => $value['diskonSatuan'] ?? null,
'keterangan_produk' => $value['keterangan'] ?? null,
];
$detailPesananModels = \App\Models\DetailPesanan::create($oderDatas);
}
DB::commit();
// return url link page print
return ['url' => route('transaksi.print', $pesananModels->id) . '?print=true', 'message' => 'Pesanan berhasil ditambahkan'];
} catch (\Throwable $th) {
DB::rollBack();
dd($th->getMessage());
return redirect()->back()->with('error', 'Terjadi kesalahan');
}
return redirect()->back()->with('success', 'Pesanan berhasil ditambahkan');
}
public function print($id)
{
$pesanan = \App\Models\Pesanan::with('detailPesanan', 'user')->find($id);
return view('pages.Kasir.print', compact('pesanan'));
}
public function detail($id)
{
$pesanan = \App\Models\Pesanan::with('detailPesanan', 'user')->find($id);
return view('pages.Kasir.detail', compact('pesanan'));
}
public function selectPaket(Request $request)
{
$arrayKodeProduk = $request->kodeProduk;
// tampung data kodeProduk dari request ke variabel $kodeProduk
$kodeProduk = [];
usort($arrayKodeProduk, function ($a, $b) {
return $a['urutan'] - $b['urutan'];
});
foreach ($arrayKodeProduk as $key => $value) {
$kodeProduk[] = $value['kode_produk'];
}
$hasil = [];
$hasil[] = implode(' ', $kodeProduk);
// cari data produk berdasarkan kodeProduk
$produk = Produk::where('kode_produk', $hasil)->first();
// dd($produk);
return response()->json($produk);
}
}