sum('grandtotal'); //$bulanIni = date('m'); //$tahunIni = date('Y'); //$tanggalHariIni = date('Y-m-d'); // Hitung total produk (jumlah row) di tabel ProdukModel //$data['jumlahproduk'] = ProdukModel::count(); // Bulanan // Hitung total pembelian bulan ini //$data['totalpembelian'] = PembelianModel::whereMonth('tanggalpembelian', $bulanIni) //->whereYear('tanggalpembelian', $tahunIni) //->sum('grandtotal'); // Hitung total penjualan bulan ini //$data['totalpenjualan'] = PenjualanModel::whereMonth('tanggalpenjualan', $bulanIni) //->whereYear('tanggalpenjualan', $tahunIni) //->sum('grandtotal'); // Harian // $data['totalpembelianhariini'] = PembelianModel::whereDate('tanggalpembelian', $tanggalHariIni) //->sum('grandtotal'); //$data['totalpenjualanhariini'] = PenjualanModel::whereDate('tanggalpenjualan', $tanggalHariIni) //->sum('grandtotal'); return view('admin.dashboard', $data); } public function produksidaftar() { $produksi = ProduksiModel::whereNotNull('tanggalselesai')->get(); return view('admin.produksidaftar', compact('produksi')); } // Menampilkan form tambah barang showroom public function showroomtambah() { $produksi = ProduksiModel::whereNotNull('tanggalselesai')->get(); // Ambil daftar idproduk yang sudah masuk showroom $produkYangSudahMasuk = ShowroomModel::pluck('idproduk')->toArray(); return view('admin.showroomtambah', compact('produksi', 'produkYangSudahMasuk')); } // Menyimpan barang showroom ke database public function showroomsimpan(Request $request) { $request->validate([ 'idproduksi' => 'required|exists:produksi,idproduksi', 'tanggalmasuk' => 'required|date', ]); $produksi = ProduksiModel::find($request->idproduksi); // cek apakah produk sudah pernah masuk showroom $cekDuplikat = ShowroomModel::where('idproduk', $produksi->idproduksi)->first(); if ($cekDuplikat) { return redirect()->back()->withErrors(['Produk ini sudah pernah ditambahkan ke showroom.']); } // ✅ Validasi bahwa tanggal masuk showroom tidak boleh sebelum tanggal selesai produksi if (Carbon::parse($request->tanggalmasuk)->lt(Carbon::parse($produksi->tanggalselesai))) { return redirect()->back()->withErrors(['Tanggal masuk showroom tidak boleh sebelum tanggal selesai produksi.']); } // Generate barcode $barcode = date('YmdHis') . rand(100, 999); $link = url('scanqr/kode/' . $barcode); $barcodeFilename = $barcode . '.png'; $barcodePath = public_path('assets/foto/qr/' . $barcodeFilename); File::ensureDirectoryExists(public_path('assets/foto/qr')); $generator = new BarcodeGeneratorPNG(); file_put_contents($barcodePath, $generator->getBarcode($barcode, $generator::TYPE_CODE_128)); // Tambahkan teks di bawah barcode $barcodeImage = imagecreatefrompng($barcodePath); $imageWidth = imagesx($barcodeImage); $imageHeight = imagesy($barcodeImage); $newHeight = $imageHeight + 30; $newImage = imagecreatetruecolor($imageWidth, $newHeight); $white = imagecolorallocate($newImage, 255, 255, 255); imagefilledrectangle($newImage, 0, 0, $imageWidth, $newHeight, $white); imagecopy($newImage, $barcodeImage, 0, 0, 0, 0, $imageWidth, $imageHeight); $black = imagecolorallocate($newImage, 0, 0, 0); $fontPath = public_path('assets/font/arial.ttf'); if (file_exists($fontPath)) { $fontSize = 14; $textX = ($imageWidth / 2) - (strlen($barcode) * 4); $textY = $newHeight - 5; imagettftext($newImage, $fontSize, 0, $textX, $textY, $black, $fontPath, $barcode); } else { imagestring($newImage, 5, ($imageWidth / 2) - (strlen($barcode) * 3), $newHeight - 20, $barcode, $black); } imagepng($newImage, $barcodePath); imagedestroy($barcodeImage); imagedestroy($newImage); // Simpan data ke showroom ShowroomModel::create([ 'idproduk' => $produksi->idproduksi, 'stok_awal' => $produksi->stok, 'stok_tambahan' => 0, 'stok_terjual' => 0, 'stok_sisa' => $produksi->stok, 'barcode' => $barcode, 'link' => $link, 'kodeqr' => $barcodeFilename, 'tanggalmasuk' => Carbon::parse($request->tanggalmasuk), ]); return redirect('admin/showroomdaftar')->with('success', 'Barang berhasil ditambahkan ke showroom.'); } // Menampilkan daftar barang showroom public function showroomdaftar() { $showrooms = ShowroomModel::with('produksi')->orderBy('tanggalmasuk', 'desc')->get(); foreach ($showrooms as $item) { if ($item->produksi) { $stokProduksi = $item->produksi->stok; // stok total terbaru dari produksi $stokAwal = $item->stok_awal ?? 0; $stokTerjual = $item->stok_terjual ?? 0; //$stokTambahan = max(0, $stokProduksi - $stokAwal); //$stokTotal = $stokAwal + $stokTambahan; $stokSisa = $stokAwal - $stokTerjual; // Sinkronisasi ke database showroom jika data berubah if ( //$item->stok_tambahan != $stokTambahan || //$item->stok_total != $stokTotal || $item->stok_sisa != $stokSisa ) { //$item->stok_tambahan = $stokTambahan; //$item->stok_total = $stokTotal; $item->stok_sisa = $stokSisa; $item->save(); } } } return view('admin.showroomdaftar', ['showroom' => $showrooms]); } public function penjualandaftar() { $data['penjualan'] = PenjualanModel::with('penjualandetail')->orderBy('tanggalpenjualan', 'desc')->get(); return view('admin.penjualandaftar', $data); } public function penjualanupdate(Request $request, $id) { $penjualan = PenjualanModel::findOrFail($id); // Hanya proses pelunasan jika ada input uang pembeli if ($request->has('uangpembeli')) { $uangPembeli = (int) str_replace(['.', ',', 'Rp', ' '], '', $request->uangpembeli); $dp = $penjualan->dp ?? 0; $grandTotal = $penjualan->grandtotal ?? 0; $totalBayar = $dp + $uangPembeli; $sisaBayar = $grandTotal - $totalBayar; $kembalian = $uangPembeli - ($grandTotal - $dp); $penjualan->bayar = $uangPembeli; // Jangan timpa sisabayar, biarkan nilai awal tetap ada if ($sisaBayar > 0) { $penjualan->sisabayar = $sisaBayar; } $penjualan->kembali = $kembalian > 0 ? $kembalian : 0; $penjualan->statuspembayaran = $sisaBayar <= 0 ? 'Lunas' : 'DP'; } // Ini tetap dilakukan (update status pengiriman) $penjualan->statuspengiriman = $request->statuspengiriman; $penjualan->save(); return redirect()->back()->with('success', 'Transaksi berhasil diperbarui.'); } public function Nota($notajual) { $penjualan = PenjualanModel::with('penjualandetail')->where('notajual', $notajual)->firstOrFail(); return view('admin.nota', compact('penjualan')); } public function Faktur($notajual) { $penjualan = PenjualanModel::with('penjualandetail')->where('notajual', $notajual)->firstOrFail(); $subtotal = $penjualan->penjualandetail->sum('total'); $grandtotal = $penjualan->grandtotal; $dp = $penjualan->dp ?? 0; $bayarPelunasan = $penjualan->bayar ?? 0; // Fokus ke informasi pelunasan $sisaSebelumPelunasan = $grandtotal - $dp; $kembalian = $penjualan->kembali ?? 0; return view('admin.faktur', compact( 'penjualan', 'subtotal', 'grandtotal', 'dp', 'bayarPelunasan', 'sisaSebelumPelunasan', 'kembalian' )); } public function ubahStatusTransaksi(Request $request) { $request->validate([ 'notajual' => 'required|string', 'statustransaksi' => 'required|string|in:Dikirim,Selesai', ]); $penjualan = PenjualanModel::where('notajual', $request->notajual)->firstOrFail(); $penjualan->statuspengiriman = $request->statustransaksi; $penjualan->save(); return redirect()->back()->with('success', 'Status pengiriman berhasil diperbarui.'); } public function produkdaftar() { $data['produk'] = ProdukModel::all(); return view('admin.produkdaftar', $data); } public function produktambah() { $data['barangmasuk'] = PembelianModel::select(DB::raw('sum(jumlah) as jumlah'), 'namabarang')->groupBy('namabarang')->get(); return view('admin.produktambah', $data); } public function produksimpan(Request $request) { // Validasi input $request->validate([ 'namaproduk' => 'required|string|max:255', 'hargajual' => 'required|numeric', 'foto' => 'required|image|mimes:jpg,jpeg,png,gif|max:2048', ]); // Ambil total stok dari tabel pembelian berdasarkan nama produk $stok = PembelianModel::where('namabarang', $request->namaproduk)->sum('jumlah'); $barcode = date('Ymdhis'); $link = url('scanqr/kode/' . $barcode); if ($request->hasFile('foto')) { $foto = $request->file('foto'); $namafoto = time() . '.' . $foto->getClientOriginalExtension(); $foto->move(public_path('assets/foto'), $namafoto); } // Barcode Generator $generator = new BarcodeGeneratorPNG(); $barcodeFilename = $barcode . '.png'; $barcodePath = public_path('assets/foto/qr/' . $barcodeFilename); File::ensureDirectoryExists(public_path('assets/foto/qr')); file_put_contents($barcodePath, $generator->getBarcode($barcode, $generator::TYPE_CODE_128)); // Tambah teks ke barcode $barcodeImage = imagecreatefrompng($barcodePath); $imageWidth = imagesx($barcodeImage); $imageHeight = imagesy($barcodeImage); $newHeight = $imageHeight + 30; $newImage = imagecreatetruecolor($imageWidth, $newHeight); $white = imagecolorallocate($newImage, 255, 255, 255); imagefilledrectangle($newImage, 0, 0, $imageWidth, $newHeight, $white); imagecopy($newImage, $barcodeImage, 0, 0, 0, 0, $imageWidth, $imageHeight); $black = imagecolorallocate($newImage, 0, 0, 0); $fontPath = public_path('assets/font/arial.ttf'); if (file_exists($fontPath)) { $fontSize = 14; $textX = ($imageWidth / 2) - (strlen($barcode) * 4); $textY = $newHeight - 5; imagettftext($newImage, $fontSize, 0, $textX, $textY, $black, $fontPath, $barcode); } else { imagestring($newImage, 5, ($imageWidth / 2) - (strlen($barcode) * 3), $newHeight - 20, $barcode, $black); } imagepng($newImage, $barcodePath); imagedestroy($barcodeImage); imagedestroy($newImage); // Simpan produk ProdukModel::create([ 'namaproduk' => $request->namaproduk, 'stok' => $stok, // Diambil otomatis dari pembelian 'hargajual' => $request->hargajual, 'fotoproduk' => $namafoto, 'barcode' => $barcode, 'link' => $link, 'kodeqr' => $barcodeFilename, ]); return redirect('admin/produkdaftar')->with('success', 'Produk berhasil ditambahkan!'); } public function produkedit($id) { $data['produk'] = ProdukModel::find($id); return view('admin.produkedit', $data); } public function produkupdate(Request $request, $id) { // Validasi input $request->validate([ 'namaproduk' => 'required|string|max:255', 'stok' => 'required|integer', 'hargajual' => 'required|numeric', ]); $data = [ 'namaproduk' => $request->namaproduk, 'stok' => $request->stok, 'hargajual' => $request->hargajual, ]; $produk = ProdukModel::find($id); if (!empty($request->file('foto'))) { if ($produk->foto && file_exists(public_path('assets/foto/' . $produk->fotoproduk))) { unlink(public_path('assets/foto/' . $produk->fotoproduk)); } $foto = $request->file('foto'); $namafoto = time() . '.' . $foto->getClientOriginalExtension(); $foto->move(public_path('assets/foto'), $namafoto); $data['fotoproduk'] = $namafoto; } ProdukModel::where('idproduk', $id)->update($data); return redirect('admin/produkdaftar')->with('success', 'Produk berhasil diperbarui!'); } public function produkhapus($id) { $produk = ProdukModel::find($id); if ($produk->foto && file_exists(public_path('assets/foto/' . $produk->fotoproduk))) { unlink(public_path('assets/foto/' . $produk->fotoproduk)); } ProdukModel::destroy($id); return redirect('admin/produkdaftar')->with('success', 'Produk berhasil dihapus!'); } // barang masuk public function barangmasukdaftar() { $data['pembelian'] = PembelianModel::groupBy('notabeli')->orderBy('tanggalpembelian', 'desc')->get(); $pembeliandetail = []; foreach ($data['pembelian'] as $key => $value) { $pembeliandetail[$value->notabeli] = PembelianModel::where('notabeli', $value->notabeli)->get(); } $data['pembeliandetail'] = $pembeliandetail; // return response()->Json($data); return view('admin.barangmasukdaftar', $data); } public function barangmasuktambah() { $data['produk'] = ProdukModel::all(); return view('admin.barangmasuktambah', $data); } public function barangmasuksimpan(Request $request) { if ($request->has('harga')) { $request->merge([ 'harga' => array_map(function ($harga) { return str_replace('.', '', $harga); }, $request->input('harga')), ]); } if ($request->has('total')) { $request->merge([ 'total' => array_map(function ($total) { return str_replace('.', '', $total); }, $request->input('total')), ]); } $request->validate([ 'tanggalpembelian' => 'required|date', 'namabarang' => 'required|array', 'namabarang.*' => 'required|string', 'harga' => 'required|array', 'harga.*' => 'required|numeric|min:1', 'jumlah' => 'required|array', 'jumlah.*' => 'required|integer|min:1', 'total' => 'required|array', 'total.*' => 'required|numeric|min:0', ]); try { DB::beginTransaction(); $notaBeli = date('YmdHis'); foreach ($request->namabarang as $key => $namaBarang) { $harga = $request->harga[$key]; $jumlah = $request->jumlah[$key]; $total = $harga * $jumlah; if ($total != $request->total[$key]) { throw new \Exception("Total tidak valid untuk item $namaBarang"); } // Simpan data pembelian PembelianModel::create([ 'tanggalpembelian' => $request->tanggalpembelian, 'notabeli' => $notaBeli, 'namabarang' => $namaBarang, 'harga' => $harga, 'jumlah' => $jumlah, 'total' => $total, 'grandtotal' => $request->grandtotalnon, ]); } // Update stok produk setelah pembelian tersimpan // Dapatkan semua nama produk unik dari pembelian yang baru disimpan $produkNamaList = array_unique($request->namabarang); foreach ($produkNamaList as $produkNama) { // Hitung total stok produk dari tabel pembelian $stokTerbaru = PembelianModel::where('namabarang', $produkNama)->sum('jumlah'); // Update stok di produk model ProdukModel::where('namaproduk', $produkNama)->update(['stok' => $stokTerbaru]); } DB::commit(); return redirect('admin/barangmasukdaftar')->with('success', 'Data barang masuk berhasil disimpan dan stok diperbarui.'); } catch (\Exception $e) { DB::rollBack(); return back()->with('error', 'Gagal menyimpan data: ' . $e->getMessage()); } } public function barangmasukedit($id) { // Ambil data pembelian berdasarkan notabeli $data['pembeliandetail'] = PembelianModel::where('notabeli', $id)->get(); if ($data['pembeliandetail']->isEmpty()) { return redirect('admin/barangmasukdaftar')->with('error', 'Data tidak ditemukan'); } $data['produk'] = ProdukModel::all(); $data['notabeli'] = $id; $data['tanggalpembelian'] = $data['pembeliandetail']->first()->tanggalpembelian; return view('admin.barangmasukedit', $data); } public function barangmasukupdate(Request $request, $id) { $request->validate([ 'tanggalpembelian' => 'required|date', 'namabarang' => 'required|array', 'harga' => 'required|array', 'jumlah' => 'required|array', 'total' => 'required|array', ]); if (!$request->tanggalpembelian || $request->tanggalpembelian === '0000-00-00') { return back()->with('error', 'Tanggal pembelian tidak valid atau kosong.'); } DB::beginTransaction(); try { // Hapus data lama terlebih dahulu PembelianModel::where('notabeli', $id)->delete(); foreach ($request->namabarang as $key => $namaBarang) { $harga = str_replace('.', '', $request->harga[$key]); $jumlah = $request->jumlah[$key]; $total = str_replace('.', '', $request->total[$key]); PembelianModel::create([ 'tanggalpembelian' => $request->tanggalpembelian, 'notabeli' => $id, 'namabarang' => $namaBarang, 'harga' => $harga, 'jumlah' => $jumlah, 'total' => $total, 'grandtotal' => str_replace('.', '', $request->grandtotalnon), ]); } // Update stok foreach (array_unique($request->namabarang) as $produkNama) { $stokTerbaru = PembelianModel::where('namabarang', $produkNama)->sum('jumlah'); ProdukModel::where('namaproduk', $produkNama)->update(['stok' => $stokTerbaru]); } DB::commit(); return redirect('admin/barangmasukdaftar')->with('success', 'Data berhasil diperbarui.'); } catch (\Exception $e) { DB::rollBack(); return back()->with('error', 'Gagal memperbarui data: ' . $e->getMessage()); } } public function barangmasukhapus($id) { PembelianModel::where('notabeli', $id)->delete(); return redirect('admin/barangmasukdaftar')->with('success', 'Data Berhasil Dihapus'); } // barangkeluar //public function barangkeluardaftar() //{ //$data['penjualan'] = PenjualanModel::with(['penjualandetail']) //->groupBy('notajual') //->orderBy('tanggalpenjualan', 'desc') //->get(); // return response()->Json($data); //return view('admin.barangkeluardaftar', $data); //} public function updatecustomproduk(Request $request) { $idDetails = $request->idpenjualan; $customs = $request->custom; foreach ($idDetails as $index => $id) { DB::table('penjualan')->where('idpenjualan', $id)->update([ 'custom' => $customs[$index], ]); } return back()->with('success', 'Data custom produk berhasil diperbarui.'); } public function ubahstatuspembelian(Request $request) { $notajual = $request->notajual; $status = 'Lunas'; // Hilangkan titik dari input ribuan $uangpembeli = str_replace('.', '', $request->uangpembeli); $kembalian = str_replace('.', '', $request->kembalian); DB::table('penjualan')->where('notajual', $notajual)->update([ 'statuspembelian' => $status, 'uangpembeli' => $uangpembeli, 'kembalian' => $kembalian, ]); return back()->with('success', 'Status pembelian berhasil diperbarui.'); } //public function barangkeluartambah() //{ //$data['produk'] = ProdukModel::all(); //return view('admin.barangkeluartambah', $data); //} //public function barangkeluarsimpan(Request $request) //{ //$request->validate([ //'tanggalpenjualan' => 'required|date', //'grandtotalnon' => 'required|numeric', //'uangpembeli' => 'nullable|numeric', //'kembalian' => 'required|numeric', //'diskon' => 'nullable|numeric', //'metodepembayaran' => 'required|string', //'namabarang' => 'required|array', //'namabarang.*' => 'string', //'harga' => 'required|array', //'harga.*' => 'numeric', //'jumlah' => 'required|array', //'jumlah.*' => 'integer|min:1', //'total' => 'required|array', //'total.*' => 'numeric' //]); //try { //DB::beginTransaction(); //$tanggalPenjualan = $request->tanggalpenjualan; //$grandTotal = $request->grandtotalnon; //$uangPembeli = $request->uangpembeli ?? 0; //$kembalian = $request->kembalian; //$notaJual = now()->format('YmdHis'); //$kodeNota = $this->getKodeNota($tanggalPenjualan); //$diskon = $request->diskon ?? 0; //$metodePembayaran = $request->metodepembayaran; //$statusTransaksi = 'Menunggu Konfirmasi Admin'; //foreach ($request->namabarang as $i => $namaBarang) { //$harga = $request->harga[$i]; //$jumlah = $request->jumlah[$i]; //$total = $request->total[$i]; // Simpan penjualan //PenjualanModel::create([ //'notajual' => $notaJual, //'kodenota' => $kodeNota, //'namabarang' => $namaBarang, //'harga' => $harga, //'jumlah' => $jumlah, //'total' => $total, //'tanggalpenjualan' => $tanggalPenjualan, //'grandtotal' => $grandTotal, //'uangpembeli' => $uangPembeli, //'kembalian' => $kembalian, //'diskon' => $diskon, //'metodepembayaran' => $metodePembayaran, //'statustransaksi' => $statusTransaksi //]); // Update stok produk //ProdukModel::where('namaproduk', $namaBarang)->decrement('stok', $jumlah); //} //DB::commit(); //return redirect('admin/cetaknota/' . $notaJual)->with('success', 'Penjualan Barang Berhasil Disimpan'); //} catch (\Exception $e) { //DB::rollback(); //return back()->with('error', $e->getMessage()); //} //} private function getKodeNota($tanggalPenjualan) { $tahun = date('Y', strtotime($tanggalPenjualan)); $baseCode = $tahun . '1'; $lastNota = PenjualanModel::whereYear('tanggalpenjualan', $tahun) ->orderByDesc('idpenjualan') ->first(); if ($lastNota) { // Ambil angka setelah tahun (misal: 20241 -> ambil 1) // lalu tambah 1 dan gabungkan kembali $lastNumber = (int)substr($lastNota->kodenota, 4); return $tahun . ($lastNumber + 1); } return $baseCode; } //public function barangkeluarhapus($id) //{ //PenjualanModel::where('notajual', $id)->delete(); //return back()->with('success', 'Barang Keluar Berhasil Dihapus'); //} // stockopname /* public function stockopnamedaftar() { // Get unique stock opname dates in descending order $stockOpnameDates = StockopnameModel::select('tanggalstockopname') ->distinct() ->orderBy('tanggalstockopname', 'DESC') ->paginate(6); // Get products for the form dropdown $produk = ProdukModel::withTrashed()->get(); // Menggunakan withTrashed() untuk mengambil produk yg dihapus juga // Get all stock opname data grouped by date $stockOpnameData = []; foreach ($stockOpnameDates as $date) { $tanggalStockOpname = $date->tanggalstockopname; $stockOpnameData[$tanggalStockOpname] = StockopnameModel::with('produk') ->where('tanggalstockopname', $tanggalStockOpname) ->get(); } return view('admin.stockopnamedaftar', compact('stockOpnameDates', 'produk', 'stockOpnameData')); } public function stockopnamesimpan(Request $request) { if ($request->isMethod('post')) { $tanggalStockOpname = $request->input('tanggalstockopname'); $idProduk = $request->input('idproduk'); $stokSistem = $request->input('stok'); $stokGudang = $request->input('stokgudang'); $selisih = $request->input('selisih'); // Loop through all products and save stock opname data for ($i = 0; $i < count($idProduk); $i++) { if (!empty($idProduk[$i])) { // Periksa apakah produk ada atau telah dihapus $produk = ProdukModel::withTrashed()->find($idProduk[$i]); if ($produk) { StockopnameModel::create([ 'tanggalstockopname' => $tanggalStockOpname, 'idproduk' => $idProduk[$i], 'stoksistem' => $stokSistem[$i], 'stokgudang' => $stokGudang[$i], 'selisih' => $selisih[$i], 'waktuinputstockopname' => now() ]); } } } return redirect('admin/stockopnamedaftar') ->with('success', 'Stock Opname berhasil disimpan'); } } public function stockopnamehapus($tanggalstockopname) { // Delete all stock opname entries for the given date StockopnameModel::where('tanggalstockopname', $tanggalstockopname)->delete(); return redirect('admin/stockopnamedaftar') ->with('success', 'Data Stock Opname berhasil dihapus'); } */ public function getProdukByBarcode(Request $request, $barcode) { // $barcode = $request->input('barcode'); $produk = ProdukModel::where('barcode', $barcode)->first(); if ($produk) { return response()->json([ 'success' => true, 'data' => $produk ]); } else { return response()->json([ 'success' => false, 'message' => 'Produk tidak ditemukan' ]); } } //public function laporanpembelian(Request $request) //{ //$tanggalAwal = $request->input('tanggalawal', now()->startOfMonth()->format('Y-m-d')); //$tanggalAkhir = $request->input('tanggalakhir', now()->endOfMonth()->format('Y-m-d')); //$pembelian = PembelianModel::whereBetween('tanggalpembelian', [$tanggalAwal, $tanggalAkhir])->get(); //$totalPengeluaran = $pembelian->sum('total'); //if ($request->cetak == 'cetak') { //$pdf = PDF::loadView('admin.laporanpembeliancetak', compact('pembelian', 'tanggalAwal', 'tanggalAkhir', 'totalPengeluaran')); //return $pdf->stream('Laporan_Pembelian_' . $tanggalAwal . '_sd_' . $tanggalAkhir . '.pdf'); //} //if ($request->cetak == 'excel') { //return $this->exportExcel($pembelian, $tanggalAwal, $tanggalAkhir, $totalPengeluaran); //} //return view('admin.laporanpembelian', compact('pembelian', 'tanggalAwal', 'tanggalAkhir', 'totalPengeluaran')); //} //public function exportExcel($pembelian, $tanggalAwal, $tanggalAkhir, $totalPengeluaran) //{ //$spreadsheet = new Spreadsheet(); //$sheet = $spreadsheet->getActiveSheet(); // Header //$sheet->setCellValue('A1', 'No'); //$sheet->setCellValue('B1', 'Tanggal Pembelian'); //$sheet->setCellValue('C1', 'Nama Produk'); //$sheet->setCellValue('D1', 'Harga'); //$sheet->setCellValue('E1', 'Jumlah'); //$sheet->setCellValue('F1', 'Total'); //$row = 2; //$nomor = 1; //foreach ($pembelian as $item) { //$sheet->setCellValue('A' . $row, $nomor++); //$sheet->setCellValue('B' . $row, date('d-m-Y', strtotime($item->tanggalpembelian))); //$sheet->setCellValue('C' . $row, $item->namabarang); //$sheet->setCellValue('D' . $row, $item->harga); //$sheet->setCellValue('E' . $row, $item->jumlah); //$sheet->setCellValue('F' . $row, $item->total); //$row++; //} // Total //$sheet->setCellValue('E' . $row, 'Total Pengeluaran:'); //$sheet->setCellValue('F' . $row, $totalPengeluaran); //$writer = new Xlsx($spreadsheet); //$fileName = 'Laporan_Pembelian_' . $tanggalAwal . '_sd_' . $tanggalAkhir . '.xlsx'; //$response = new StreamedResponse(function () use ($writer) { //$writer->save('php://output'); //}); //$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); //$response->headers->set('Content-Disposition', 'attachment;filename="' . $fileName . '"'); //$response->headers->set('Cache-Control', 'max-age=0'); //return $response; //} //public function laporanpenjualan(Request $request) //{ //$tahun = $request->input('tahun'); //$bulan = $request->input('bulan'); //$namabarang = $request->input('namabarang', ''); // Ambil daftar produk untuk dropdown //$produk = ProdukModel::all(); // Cek ID produk jika nama produk dipilih //$idbarang = null; //if ($namabarang) { //$produkItem = ProdukModel::where('namaproduk', $namabarang)->first(); //$idbarang = $produkItem ? $produkItem->idproduk : null; //} //$query = PenjualanModel::query(); // Filter tahun jika ada input tahun //if ($tahun) { //$query->whereYear('tanggalpenjualan', $tahun); //} // Filter bulan jika ada input bulan //if ($bulan) { //$query->whereMonth('tanggalpenjualan', $bulan); //} // Filter produk jika ada //if ($idbarang) { //$query->where('namabarang', $namabarang); //} //$penjualan = $query->orderBy('tanggalpenjualan', 'desc')->get(); //return view('admin.laporanpenjualan', compact('penjualan', 'tahun', 'bulan', 'namabarang', 'produk')); //} //public function laporanPenjualanCetak(Request $request, $tahun, $bulan, $namabarang) //{ //$bulanArr = ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"]; //$namabulan = $bulanArr[intval($bulan) - 1]; //$produk = ProdukModel::where('namaproduk', $namabarang)->first(); //$namaproduk = $produk ? $produk->namaproduk : "Semua Produk"; //$query = PenjualanModel::whereYear('tanggalpenjualan', $tahun) //->whereMonth('tanggalpenjualan', $bulan); //if ($namabarang != 'all') { //$query->where('namabarang', $namaproduk); //} //$penjualan = $query->orderBy('tanggalpenjualan', 'desc')->get(); //$totalPemasukan = $penjualan->sum('total'); // Generate PDF menggunakan Barryvdh DomPDF //$pdf = PDF::loadView('admin.laporanpenjualancetak', compact('penjualan', 'tahun', 'bulan', 'namabulan', 'namaproduk', 'totalPemasukan')); //return $pdf->stream('Laporan_Penjualan_' . $tahun . '_' . $namabulan . '.pdf'); //} //public function laporanpenjualanexcel(Request $request, $tahun, $bulan, $namabarang) //{ //$bulanArr = ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"]; //$namabulan = $bulanArr[intval($bulan) - 1]; //$query = PenjualanModel::whereYear('tanggalpenjualan', $tahun) //->whereMonth('tanggalpenjualan', $bulan); //if ($namabarang != 'all') { //$query->where('namabarang', $namabarang); //} //$penjualan = $query->orderBy('tanggalpenjualan', 'desc')->get(); //$totalPemasukan = $penjualan->sum('total'); // Membuat objek spreadsheet baru //$spreadsheet = new Spreadsheet(); //$sheet = $spreadsheet->getActiveSheet(); // Menambahkan header ke Excel //$sheet->setCellValue('A1', 'No'); //$sheet->setCellValue('B1', 'Tanggal Penjualan'); //$sheet->setCellValue('C1', 'Nama Produk'); //$sheet->setCellValue('D1', 'Harga'); //$sheet->setCellValue('E1', 'Jumlah'); //$sheet->setCellValue('F1', 'Total'); //$row = 2; //$nomor = 1; //foreach ($penjualan as $item) { //$sheet->setCellValue('A' . $row, $nomor++); //$sheet->setCellValue('B' . $row, date('d-m-Y', strtotime($item->tanggalpenjualan))); //$sheet->setCellValue('C' . $row, $item->namabarang); //$sheet->setCellValue('D' . $row, $item->harga); //$sheet->setCellValue('E' . $row, $item->jumlah); //$sheet->setCellValue('F' . $row, $item->total); //$row++; //} // Menambahkan total pemasukan //$sheet->setCellValue('E' . $row, 'Total Pemasukan:'); //$sheet->setCellValue('F' . $row, $totalPemasukan); // Menulis file Excel //$writer = new Xlsx($spreadsheet); //$fileName = 'Laporan_Penjualan_' . $tahun . '_' . $namabulan . '.xlsx'; // Menyiapkan response untuk download file //$response = new StreamedResponse(function () use ($writer) { //$writer->save('php://output'); //}); // Set header untuk mengunduh file Excel //$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); //$response->headers->set('Content-Disposition', 'attachment;filename="' . $fileName . '"'); //$response->headers->set('Cache-Control', 'max-age=0'); //return $response; //} // internal public function internaldaftar() { $users = User::whereIn('role', ['Admin', 'Kasir', 'Owner', 'Gudang'])->get(); return view('admin.internaldaftar', compact('users')); } public function internaltambah() { return view('admin.internaltambah'); } public function internalsimpan(Request $request) { $request->validate([ 'name' => 'required', 'email' => 'required|email|unique:users,email', 'password' => 'required', 'role' => 'required', ]); $user = User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => bcrypt($request->password), 'role' => $request->role, ]); return redirect('admin/internaldaftar')->with('success', 'User berhasil ditambahkan'); } public function internaledit($id) { $data['user'] = User::find($id); return view('admin.internaledit', $data); } public function internalupdate(Request $request, $id) { $request->validate([ 'name' => 'required', 'email' => 'required|email|unique:users,email,' . $id, 'role' => 'required', ]); $data = [ 'name' => $request->name, 'email' => $request->email, 'role' => $request->role, ]; if (!empty($request->password)) { $data['password'] = bcrypt($request->password); } User::where('id', $id)->update($data); return redirect('admin/internaldaftar')->with('success', 'User berhasil diperbarui'); } public function internalhapus($id) { User::where('id', $id)->delete(); return redirect('admin/internaldaftar')->with('success', 'User berhasil dihapus'); } // profile public function profile() { $data['profile'] = User::find(auth()->user()->id); return view('admin.profile', $data); } public function profileupdate(Request $request) { $request->validate([ 'name' => 'required', 'email' => 'required|email|unique:users,email,' . auth()->user()->id, ]); $data = [ 'name' => $request->name, 'email' => $request->email, ]; if (!empty($request->password)) { $data['password'] = bcrypt($request->password); } User::where('id', auth()->user()->id)->update($data); return redirect('admin/profile')->with('success', 'Profile berhasil diperbarui'); } public function updateProfileImage(Request $request) { $request->validate([ 'file' => ['required', 'image', 'max:2048'], ]); $user = $request->user(); $path = $request->file('file')->store('profile', 'public'); if ($user->file) { Storage::disk('public')->delete($user->file); } $user->file = $path; $user->save(); return response()->json(['message' => 'Gambar berhasil diupdate', 'path' => $path]); } }