0xCor3

PHP Cart

Dec 1st, 2021
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 22.53 KB | None | 0 0
  1. <?php
  2.  
  3. namespace App\Controllers;
  4.  
  5. use App\Models\Produk;
  6. use App\Models\Stok;
  7. use App\Models\TransaksiModel;
  8. use App\Models\UserModel;
  9.  
  10. class Pages extends BaseController
  11. {
  12.     public function __construct()
  13.     {
  14.         $this->produkModel      = new Produk();
  15.         $this->stokModel        = new Stok();
  16.         $this->userModel        = new UserModel();
  17.         $this->transaksiModel   = new TransaksiModel();
  18.         helper(['rupiah']);
  19.     }
  20.  
  21.     public function in_array_r($needle, $haystack, $strict = false) {
  22.         foreach ($haystack as $item) {
  23.             if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && $this->in_array_r($needle, $item, $strict))) {
  24.                 return true;
  25.             }
  26.         }
  27.         return false;
  28.     }
  29.  
  30.     public function searchUkuranIndex($ukuran, $array) {
  31.         foreach ($array as $key => $val) {
  32.             if ($val['ukuran'] === $ukuran) {
  33.                 return $key;
  34.             }
  35.         }
  36.         return null;
  37.      }
  38.  
  39.     public function searchStokBySlugAndVariasi($slug, $variasi)
  40.     {
  41.         $this->stokModel->select('*');
  42.         $this->stokModel->select('data_produk.*');
  43.         $this->stokModel->join('data_produk', 'data_stok_produk.id_produk = data_produk.id');
  44.         $this->stokModel->where('url_slug', $slug);
  45.         $this->stokModel->where('ukuran', $variasi);
  46.         return $this->stokModel->get()->getResultArray();
  47.     }
  48.  
  49.     public function index()
  50.     {
  51.         $data = [
  52.             'title' => 'Home'
  53.         ];
  54.         $data['produk'] = $this->produkModel->orderBy('id', 'RANDOM')->limit(3)->get()->getResultArray();
  55.         return view('home', $data);
  56.     }
  57.  
  58.     public function detail($slug)
  59.     {
  60.         $this->produkModel->select('*, data_produk.nama AS nama_produk');
  61.         $this->produkModel->select('data_kategori.nama AS nama_kategori');
  62.         $this->produkModel->join('data_kategori', 'data_produk.kategori = data_kategori.id_kategori');
  63.         $this->produkModel->where('url_slug', $slug);
  64.         $prod = $this->produkModel->get()->getResultArray();
  65.         if(!isset($prod[0])){
  66.             return view('errors/errors-404');
  67.         }
  68.         $data['stok'] = $this->stokModel->where('id_produk', $prod[0]['id'])->findAll();
  69.         if(session()->has('cartList') && count(session()->get('cartList')) > 0 && isset(session()->get('cartList')[$slug])) {
  70.             $cartList = session()->cartList;
  71.             $i = 0;
  72.             foreach($data['stok'] as $s){
  73.                 if($this->in_array_r($s['ukuran'], $cartList[$slug])){
  74.                     $searchKey = $this->searchUkuranIndex($s['ukuran'], $cartList[$slug]);
  75.                     $data['stok'][$i]['stok'] -= $cartList[$slug][$searchKey]['qty'];
  76.                     $data['stok'][$i]['in_cart'] = true;
  77.                 }else{
  78.                     $data['stok'][$i]['in_cart'] = false;
  79.                 }
  80.                 $i++;
  81.             }
  82.         }
  83.         $data['data_produk'] = $prod[0];
  84.         $data['title'] = $data['data_produk']['nama_produk'];
  85.  
  86.         return view('detail', $data);
  87.     }
  88.  
  89.     public function cart()  
  90.     {
  91.         $data = [
  92.             'title' => 'Keranjang'
  93.         ];
  94.         $cartList = session()->cartList;
  95.         $data['cartList'] = [];
  96.         $data['cartList_sold'] = [];
  97.         $data['cartCount'] = 0;
  98.         $data['cartCountSold'] = 0;
  99.         $i = 0;
  100.         foreach($cartList as $key => $value){
  101.             $data['cartList'][$key] = [];
  102.             $data['cartList_sold'][$key] = [];
  103.             foreach($value as $v){
  104.                 $stokInfo = $this->searchStokBySlugAndVariasi($key, $v['ukuran'])[0];
  105.                 $newV = array_merge($v, [
  106.                     'nama_barang' => $stokInfo['nama'],
  107.                     'gambar'      => $stokInfo['gambar'],
  108.                     'harga'       => $stokInfo['harga']
  109.                 ]);
  110.                 if($v['qty'] <= $stokInfo['stok']){
  111.                     $data['cartCount'] += 1;
  112.                     array_push($data['cartList'][$key], $newV);
  113.                 }else{
  114.                     $data['cartCountSold'] += 1;
  115.                     array_push($data['cartList_sold'][$key], $newV);
  116.                 }
  117.                 $i++;
  118.             }
  119.             $i = 0;
  120.         }
  121.         return view('cart', $data);
  122.     }
  123.  
  124.     public function removeFromCart()
  125.     {
  126.         if(!session()->isUserLogin){
  127.             return "need_login";
  128.         }
  129.         if($this->validate([
  130.             'idBarang'  => 'required',
  131.             'variasi'    => 'required'
  132.         ])){
  133.             $idBarang = $this->request->getPost('idBarang');
  134.             $variasi = $this->request->getPost('variasi');
  135.             $cartList = session()->get('cartList');
  136.             if(isset($cartList[$idBarang])){
  137.                 if($this->in_array_r($variasi, $cartList[$idBarang])){
  138.                     $searchKey = $this->searchUkuranIndex($variasi, $cartList[$idBarang]);
  139.                     if(count($cartList[$idBarang]) > 1){
  140.                         unset($cartList[$idBarang][$searchKey]);
  141.                     }else{
  142.                         unset($cartList[$idBarang]);
  143.                     }
  144.                     session()->set('cartList', $cartList);
  145.                     return "ok";
  146.                 }else{
  147.                     unset($cartList[$idBarang]);
  148.                     session()->push($cartList);
  149.                     return "ok";
  150.                 }
  151.             }else{
  152.                 return "okk";
  153.             }
  154.         }else{
  155.             return "400";
  156.         }
  157.     }
  158.  
  159.     public function tambahCart()
  160.     {
  161.         if(!session()->isUserLogin){
  162.             return "need_login";
  163.         }else{
  164.             if($this->validate([
  165.                 'idBarang' => 'required',
  166.                 'quantity' => 'required',
  167.                 'ukuran'   => 'required'
  168.             ])){
  169.                 $cartList = session()->get('cartList');
  170.                 $idBarang = $this->request->getPost('idBarang');
  171.                 $quantity = $this->request->getPost('quantity');
  172.                 $ukuran   = $this->request->getPost('ukuran');
  173.                 $stokInfo = $this->searchStokBySlugAndVariasi($idBarang, $ukuran);
  174.                 if(!$stokInfo){
  175.                     return "0000";
  176.                 }
  177.                 $stokInfo = $stokInfo[0];
  178.                 if($quantity > $stokInfo['stok']){
  179.                     return "4004";
  180.                 }
  181.                 if(count($cartList) > 0){
  182.                     if(isset($cartList[$idBarang])){
  183.                         if($this->in_array_r($ukuran, $cartList[$idBarang])){ // barang udah ada dan di update data quantitynya.
  184.                             $searchKey = $this->searchUkuranIndex($ukuran, $cartList[$idBarang]);
  185.                             if($cartList[$idBarang][$searchKey]['qty'] > $stokInfo['stok']){
  186.                                 return "4005";
  187.                             }
  188.                             $cartList[$idBarang][$searchKey] = [
  189.                                 'qty'       => $quantity + $cartList[$idBarang][$searchKey]['qty'],
  190.                                 'ukuran'    => $ukuran
  191.                             ];
  192.                             session()->push('cartList', $cartList);
  193.                         }else{ // kalo belum ada push barang baru
  194.                             array_push($cartList[$idBarang], [
  195.                                 'qty'       => $quantity,
  196.                                 'ukuran'    => $ukuran
  197.                             ]);
  198.                             session()->push('cartList', $cartList);
  199.                         }
  200.                     }else{
  201.                         session()->push('cartList', [$idBarang => [[
  202.                             'qty'       => $quantity,
  203.                             'ukuran'    => $ukuran
  204.                         ]]]);
  205.                     }
  206.                 }else{
  207.                     session()->push('cartList', [$idBarang => [[
  208.                         'qty'       => $quantity,
  209.                         'ukuran'    => $ukuran
  210.                     ]]]);
  211.                 }
  212.             }else{
  213.                 return "400";
  214.             }
  215.         }
  216.     }
  217.  
  218.     public function checkout()
  219.     {
  220.         if($this->request->getPost()){
  221.             $cartList = session()->get('cartList');
  222.             if(count($cartList) < 1){
  223.                 session()->setFlashdata('danger', 'Gagal Checkout karena tidak ada barang didalam keranjang.');
  224.                 return redirect()->to('keranjang');
  225.             }else{
  226.                 $produkKosong = 0;
  227.                 $produkFixCart = [];
  228.                 $generateTrxID = "HLM".strtoupper(uniqid());
  229.                 foreach($cartList as $key => $val){
  230.                     foreach($val as $v){
  231.                         $stokInfo = $this->searchStokBySlugAndVariasi($key, $v['ukuran']);
  232.                         if(!$stokInfo){
  233.                             if(isset($cartList[$key])){
  234.                                 if($this->in_array_r($v['ukuran'], $cartList[$key])){
  235.                                     $searchKey = $this->searchUkuranIndex($v['ukuran'], $cartList[$key]);
  236.                                     if(count($cartList[$key]) > 1){
  237.                                         unset($cartList[$key][$searchKey]);
  238.                                     }else{
  239.                                         unset($cartList[$key]);
  240.                                     }
  241.                                     session()->set('cartList', $cartList);
  242.                                 }else{
  243.                                     unset($cartList[$key]);
  244.                                     session()->set('cartList', $cartList);
  245.                                 }
  246.                             }
  247.                             $produkKosong = 1;
  248.                         }else{
  249.                             array_push($produkFixCart, [
  250.                                 'kode_trx'      => $generateTrxID,
  251.                                 'id_buyer'      => session()->userid,
  252.                                 'nama_produk'   => $stokInfo[0]['nama'],
  253.                                 'variasi'       => $v['ukuran'],
  254.                                 'kuantitas'     => $v['qty'],
  255.                                 'status'        => 'Menunggu Pembayaran',
  256.                                 'harga'         => $stokInfo[0]['harga'],
  257.                                 'alamat_jalan'  => $this->userModel->where('users_id', session()->userid)->first()['alamat_jalan']
  258.                             ]);
  259.                         }
  260.                     }
  261.                 }
  262.                 if($produkKosong > 0){
  263.                     session()->setFlashdata('danger', 'Gagal Checkout karena beberapa barang tidak tersedia saat ini, mohon coba kembali.');
  264.                     return redirect()->to('keranjang');
  265.                 }else{
  266.                     $cek = $this->userModel->where('email', session()->userEmail)->first();
  267.                     if(!$cek['no_hp'] || !$cek['alamat_jalan'] || !$cek['kecamatan'] || !$cek['kelurahan']){
  268.                         $data = [
  269.                             'title' => 'Tambah Alamat'
  270.                         ];
  271.                         $data['user_data'] = $this->userModel->where('email', session()->userEmail)->first();
  272.                         session()->setFlashdata('danger', 'Jika kamu ingin melakukan Checkout, harap isi alamat terlebih dahulu!');
  273.                         return view('tambah-alamat', $data);
  274.                     }else{
  275.                         if($this->transaksiModel->insertBatch($produkFixCart)){
  276.                             session()->set('cartList', []);
  277.                             session()->setFlashdata('success', 'Sukses melakukan checkout produk, harap melakukan pembayaran sebelum terjadi pembatalan otomatis 1x24 jam');
  278.                             return redirect()->to('detail-order/'.$generateTrxID);
  279.                         }else{
  280.                             session()->setFlashdata('danger', 'Gagal melakukan checkout');
  281.                             return redirect()->to('akun');
  282.                         }
  283.                     }
  284.                 }
  285.             }
  286.         }
  287.     }
  288.  
  289.     public function getProductByKategori($kategori)
  290.     {
  291.         $this->produkModel->select('*, data_produk.nama AS nama');
  292.         $this->produkModel->select('data_produk.id AS id');
  293.         $this->produkModel->select('data_kategori.nama AS nama_kategori');
  294.         $this->produkModel->select('data_stok_produk.harga AS harga');
  295.         $this->produkModel->join('data_kategori', 'data_produk.kategori = data_kategori.id_kategori');
  296.         $this->produkModel->join('data_stok_produk', 'data_produk.id = data_stok_produk.id_produk');
  297.         $this->produkModel->where('data_kategori.nama', $kategori);
  298.         $this->produkModel->selectMin('data_produk.id');
  299.         $this->produkModel->groupBy('url_slug');
  300.         $getResult = $this->produkModel->findAll();
  301.         return $getResult;
  302.     }
  303.  
  304.     public function produk()
  305.     {
  306.         $data = [
  307.             'title' => 'Produk',
  308.         ];
  309.  
  310.         $keyword = $this->request->getVar('keyword');
  311.         if($keyword) {
  312.             $data['produks'] = $this->produkModel->search($keyword);
  313.             $data['pager']   = $this->produkModel->pager;
  314.         } else if($this->request->getGet('kategori')) {
  315.             $data['produks'] = $this->getProductByKategori($this->request->getGet('kategori'));
  316.         } else {
  317.             $data['produks'] = $this->produkModel->paginate(5, 'produk_pagers');
  318.             $data['pager']   = $this->produkModel->pager;
  319.         }
  320.        
  321.         $this->produkModel->select('data_kategori.nama AS nama_kategori');
  322.         $this->produkModel->join('data_kategori', 'data_produk.kategori = data_kategori.id_kategori');
  323.         $kategori = $this->produkModel->findAll();
  324.         $kategoriUnique = [];
  325.         foreach($kategori as $k) {
  326.             array_push($kategoriUnique, $k['nama_kategori']);
  327.         }
  328.         $data['kategori'] = array_unique($kategoriUnique);
  329.  
  330.         $data['data_produk'] = [];
  331.         $i = 0;
  332.         foreach($data['produks'] as $data_produk){
  333.             $dataStok = $this->stokModel->where('id_produk', $data_produk['id'])->findAll();
  334.             $stokS = 0;
  335.             foreach($dataStok as $stok){
  336.                 if($stok['stok'] != 0){
  337.                     $stokS += $stok['stok'];
  338.                 }
  339.             }
  340.             if($stokS != 0){
  341.                 $data['data_produk'][$i++] = [
  342.                     'data_produk' => $data_produk,
  343.                     'data_stok' => $dataStok
  344.                 ];
  345.             }
  346.         }
  347.     //    dd($data['data_produk']);
  348.  
  349.         return view('produk', $data);
  350.     }
  351.  
  352.     public function akun()
  353.     {
  354.         $data['title'] = "Akun";
  355.         $data['akun'] = $this->userModel->where('email', session()->userEmail)->first();
  356.         $this->transaksiModel->select('*');
  357.         $this->transaksiModel->selectMin('id');
  358.         $this->transaksiModel->groupBy('kode_trx');
  359.         $this->transaksiModel->where('id_buyer', session()->userid);
  360.         // $this->transaksiModel->orderBy('created_at', 'ASC');
  361.         $data['data_trx'] = $this->transaksiModel->orderBy('created_at', 'ASC')->findAll();
  362.         return view('akun', $data);
  363.     }
  364.  
  365.     public function detailOrder($kode_trx = false)
  366.     {
  367.         $data = [
  368.             'title' => 'Detail order'
  369.         ];
  370.  
  371.         $data['data_trx'] = $this->transaksiModel->where('kode_trx', $kode_trx)->findAll();
  372.         if(!$data['data_trx']){
  373.             return view('errors/errors-404');
  374.         }
  375.         return view('detail-order', $data);
  376.     }
  377.  
  378.     public function cancelOrder()
  379.     {
  380.         if($this->validate([
  381.             'kode_trx' => 'required'
  382.         ])){
  383.             if(!$this->transaksiModel->where('kode_trx', $this->request->getPost('kode_trx'))->first()){
  384.                 session()->setFlashdata('danger', 'Data transaksi tidak ditemukan');
  385.                 return redirect()->to('akun');
  386.             }
  387.             if($this->transaksiModel->set('status', 'Dibatalkan')->where('kode_trx', $this->request->getPost('kode_trx'))->update()){
  388.                 session()->setFlashdata('success', 'Sukses membatalkan pesanan');
  389.             }else{
  390.                 session()->setFlashdata('danger', 'Gagal membatalkan pesanan');
  391.             }
  392.             return redirect()->to('detail-order/'.$this->request->getPost('kode_trx'));
  393.         }
  394.     }
  395.  
  396.     public function bayar($kode_trx)
  397.     {
  398.         if(!$this->validate([
  399.             'bukti_bayar' => [
  400.                 'rules' => 'uploaded[bukti_bayar]|max_size[bukti_bayar,2048]|mime_in[bukti_bayar,image/png,image/jpeg,image/jpg]|is_image[bukti_bayar]',
  401.                 'errors' => [
  402.                     'uploaded' => 'Bukti transfer wajib di upload',
  403.                     'max_size' => 'Ukuran gambar terlalu besar, max 2MB',
  404.                     'is_image' => 'Yang anda pilih bukan gambar',
  405.                     'mime_in' => 'Yang anda pilih bukan gambar'
  406.                 ]
  407.             ],
  408.         ])) {
  409.             return redirect()->back();
  410.         }
  411.  
  412.         $buktiBayar = $this->request->getFile('bukti_bayar');
  413.         $namaFile = $buktiBayar->getRandomName();
  414.         $buktiBayar->move('assets/img/bukti-bayar', $namaFile);
  415.  
  416.         $this->transaksiModel->set('bukti_bayar', $namaFile);
  417.         $this->transaksiModel->set('status', 'Sudah Membayar');
  418.         $this->transaksiModel->where('kode_trx', $kode_trx);
  419.         $this->transaksiModel->update();
  420.  
  421.         session()->setFlashdata('success', 'Pembayaran telah berhasil, kami akan memverifikasi pesanan anda, terimakasih.');
  422.         return redirect()->to('detail-order/'.$kode_trx);
  423.     }
  424.  
  425.     public function tambahAlamat()
  426.     {
  427.         $data = [
  428.             'title' => 'Tambah Alamat'
  429.         ];
  430.         $data['user_data'] = $this->userModel->where('email', session()->userEmail)->first();
  431.         if($this->validate([
  432.             'namaPenerima'  => [
  433.                 'rules' => 'required',
  434.                 'errors' => [
  435.                     'required' => 'Nama penerima wajib diisi'
  436.                 ]
  437.             ],
  438.             'noHp'         =>  [
  439.                 'rules' => 'required|integer',
  440.                 'errors' => [
  441.                     'required' => 'No. Handphone wajib diisi',
  442.                     'integer' => 'Hanya boleh berisi angka'
  443.                 ]
  444.             ],
  445.             'kota'          =>  [
  446.                 'rules' => 'required',
  447.                 'errors' => [
  448.                     'required' => 'Kota wajib diisi'
  449.                 ]
  450.             ],
  451.             'kecamatan'     =>  [
  452.                 'rules' => 'required',
  453.                 'errors' => [
  454.                     'required' => 'Kecamantan wajib diisi'
  455.                 ]
  456.             ],
  457.             'kelurahan'     =>  [
  458.                 'rules' => 'required',
  459.                 'errors' => [
  460.                     'required' => 'Kelurahan wajib diisi'
  461.                 ]
  462.             ],
  463.             'alamatLengkap' =>  [
  464.                 'rules' => 'required',
  465.                 'errors' => [
  466.                     'required' => 'Alamat Lengkap wajib diisi'
  467.                 ]
  468.             ],
  469.         ])){
  470.             if($this->userModel->where('email', session()->userEmail)->update(session()->userid, [
  471.                 'nama'          => $this->request->getPost('namaPenerima'),
  472.                 'no_hp'         => $this->request->getPost('noHp'),
  473.                 'kota'          => $this->request->getPost('kota'),
  474.                 'alamat_jalan'  => $this->request->getPost('alamatLengkap'),
  475.                 'kecamatan'     => $this->request->getPost('kecamatan'),
  476.                 'kelurahan'     => $this->request->getPost('kelurahan')
  477.             ])){
  478.                 session()->setFlashdata('success', 'Sukses menambahkan alamat');
  479.                 return redirect()->to('akun');
  480.             }else{
  481.                 session()->setFlashdata('danger', 'Gagal menambahkan alamat');
  482.                 return redirect()->to('tambah-alamat');
  483.             }
  484.         }
  485.         return view('tambah-alamat', $data);
  486.     }
  487.  
  488.     public function ubahAlamat()
  489.     {
  490.         $data = [
  491.             'title' => 'Ubah Alamat'
  492.         ];
  493.         $data['user_data'] = $this->userModel->where('email', session()->userEmail)->first();
  494.         if($this->validate([
  495.             'namaPenerima'  => [
  496.                 'rules' => 'required',
  497.                 'errors' => [
  498.                     'required' => 'Nama penerima wajib diisi'
  499.                 ]
  500.             ],
  501.             'noHp'         =>  [
  502.                 'rules' => 'required|integer',
  503.                 'errors' => [
  504.                     'required' => 'No. Handphone wajib diisi',
  505.                     'integer' => 'Hanya boleh berisi angka'
  506.                 ]
  507.             ],
  508.             'kota'          =>  [
  509.                 'rules' => 'required',
  510.                 'errors' => [
  511.                     'required' => 'Kota wajib diisi'
  512.                 ]
  513.             ],
  514.             'kecamatan'     =>  [
  515.                 'rules' => 'required',
  516.                 'errors' => [
  517.                     'required' => 'Kecamantan wajib diisi'
  518.                 ]
  519.             ],
  520.             'kelurahan'     =>  [
  521.                 'rules' => 'required',
  522.                 'errors' => [
  523.                     'required' => 'Kelurahan wajib diisi'
  524.                 ]
  525.             ],
  526.             'alamatLengkap' =>  [
  527.                 'rules' => 'required',
  528.                 'errors' => [
  529.                     'required' => 'Alamat Lengkap wajib diisi'
  530.                 ]
  531.             ],
  532.         ])){
  533.             if($this->userModel->where('email', session()->userEmail)->update(session()->userid, [
  534.                 'nama'          => $this->request->getPost('namaPenerima'),
  535.                 'no_hp'         => $this->request->getPost('noHp'),
  536.                 'kota'          => $this->request->getPost('kota'),
  537.                 'alamat_jalan'  => $this->request->getPost('alamatLengkap'),
  538.                 'kecamatan'     => $this->request->getPost('kecamatan'),
  539.                 'kelurahan'     => $this->request->getPost('kelurahan')
  540.             ])){
  541.                 session()->setFlashdata('success', 'Sukses mengubah alamat');
  542.                 return redirect()->to('akun');
  543.             }else{
  544.                 session()->setFlashdata('danger', 'Gagal mengubah alamat');
  545.                 return redirect()->to('ubah-alamat');
  546.             }
  547.         }
  548.  
  549.         return view('ubah-alamat', $data);
  550.     }
  551.  
  552.     public function tentang()
  553.     {
  554.         $data['title'] = 'Tentang Kami';
  555.  
  556.         return view('tentang', $data);
  557.     }
  558.  
  559.     public function bantuan()
  560.     {
  561.         $data['title'] = 'Bantuan';
  562.  
  563.         return view('bantuan', $data);
  564.     }
  565. }
  566.  
Add Comment
Please, Sign In to add comment