586 lines
18 KiB
PHP
586 lines
18 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\PenjualanDetailModel;
|
|
use App\models\ProduksiModel;
|
|
use App\models\ShowroomModel;
|
|
use App\Models\PembelianModel;
|
|
use App\Models\PenjualanModel;
|
|
use App\Models\StokOpnameModel;
|
|
use App\Models\ProdukModel;
|
|
use App\Models\StockopnameModel;
|
|
use App\Models\User;
|
|
use Barryvdh\DomPDF\Facade\Pdf;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\File;
|
|
use Illuminate\Support\Carbon;
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
|
use Picqer\Barcode\BarcodeGeneratorPNG;
|
|
use Symfony\Component\HttpFoundation\StreamedResponse;
|
|
|
|
class OwnerController extends Controller
|
|
{
|
|
public function dashboard()
|
|
{
|
|
$data['jumlahproduk'] = ProduksiModel::count();
|
|
$data['totalstokopname'] = StokOpnameModel::count();
|
|
$data['totalpenjualan'] = PenjualanModel::whereMonth('tanggalpenjualan', date('m'))->sum('grandtotal');
|
|
|
|
return view('owner.dashboard', $data);
|
|
}
|
|
|
|
|
|
public function produksidaftar()
|
|
{
|
|
$produksi = ProduksiModel::all();
|
|
return view('owner.produksidaftar', compact('produksi'));
|
|
}
|
|
|
|
public function produksireview($id)
|
|
{
|
|
$produksi = ProduksiModel::findOrFail($id);
|
|
|
|
// Hanya status "Menunggu" yang bisa direview
|
|
if ($produksi->status !== 'Menunggu') {
|
|
return redirect()->back()->with('error', 'Produksi sudah diproses atau belum siap diriview.');
|
|
}
|
|
|
|
return view('owner.produksireview', compact('produksi'));
|
|
}
|
|
|
|
public function produksireviewproses(Request $request, $id)
|
|
{
|
|
$produksi = ProduksiModel::findOrFail($id);
|
|
|
|
if ($produksi->status !== 'Menunggu') {
|
|
return redirect('owner/produksidaftar')->with('error', 'Status produksi tidak valid untuk diriview.');
|
|
}
|
|
|
|
$request->validate([
|
|
'hppfinal' => 'required|numeric|min:0',
|
|
'hargajual' => 'required|string|min:0',
|
|
]);
|
|
|
|
$produksi->hppfinal = $request->hppfinal;
|
|
$produksi->hargajual = $request->hargajual;
|
|
$produksi->status = 'Selesai';
|
|
$produksi->tanggalselesai = now();
|
|
|
|
$produksi->save();
|
|
|
|
return redirect('owner/produksidaftar')->with('success', 'Review produksi berhasil disimpan.');
|
|
}
|
|
|
|
public function showroomdaftar()
|
|
{
|
|
$data['showroom'] = ShowroomModel::with('produksi')->orderBy('tanggalmasuk', 'desc')->get();
|
|
return view('owner.showroomdaftar', $data);
|
|
}
|
|
|
|
public function penjualandaftar()
|
|
{
|
|
$data['penjualan'] = PenjualanModel::with('penjualandetail')->orderBy('tanggalpenjualan', 'desc')->get();
|
|
return view('owner.penjualandaftar', $data);
|
|
}
|
|
|
|
public function opnamedaftar()
|
|
{
|
|
$data = ShowroomModel::with('produksi')->get();
|
|
return view('owner.stokopnamedaftar', compact('data'));
|
|
}
|
|
|
|
public function opnameriwayat()
|
|
{
|
|
$data = StokOpnameModel::with('showroom.produksi')->latest()->get();
|
|
return view('owner.stokopnameriwayat', compact('data'));
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//public function produksireviewlist()
|
|
//{
|
|
//$produksi = ProduksiModel::where('status', 'Menunggu')->orderByDesc('tanggalproduksi')->get();
|
|
//return view('owner.produksireviewlist', compact('produksi'));
|
|
//}
|
|
|
|
|
|
|
|
public function produkdaftar()
|
|
{
|
|
$data['produk'] = ProdukModel::all();
|
|
|
|
return view('owner.produkdaftar', $data);
|
|
}
|
|
|
|
|
|
|
|
// 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('owner.barangmasukdaftar', $data);
|
|
}
|
|
|
|
|
|
|
|
/*public function barangmasukhapus($id)
|
|
{
|
|
PembelianModel::where('notabeli', $id)->delete();
|
|
|
|
return redirect('owner/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('owner.barangkeluardaftar', $data);
|
|
}
|
|
|
|
|
|
|
|
/* public function cetakNota($id)
|
|
{
|
|
$penjualan = PenjualanModel::where('notajual', $id)->get();
|
|
|
|
if ($penjualan->isEmpty()) {
|
|
return back()->with('error', 'Nota tidak ditemukan');
|
|
}
|
|
|
|
$pecah = $penjualan->first(); // Ambil data pertama
|
|
$subtotal = $penjualan->sum('total');
|
|
|
|
return view('owner.cetaknota', compact('penjualan', 'pecah', 'subtotal'));
|
|
}
|
|
|
|
public function cetakfaktur($id)
|
|
{
|
|
$penjualan = PenjualanModel::with(['produk'])->where('notajual', $id)->get();
|
|
|
|
// return response()->json($penjualan);
|
|
|
|
if ($penjualan->isEmpty()) {
|
|
return back()->with('error', 'Nota tidak ditemukan');
|
|
}
|
|
|
|
$pecah = $penjualan->first(); // Ambil data pertama
|
|
$subtotal = $penjualan->sum('total');
|
|
$grandtotal = $subtotal - ($subtotal * $pecah->diskon / 100);
|
|
|
|
return view('owner.cetakfaktur', compact('penjualan', 'pecah', 'subtotal', 'grandtotal'));
|
|
} */
|
|
|
|
|
|
/* public function ubahstatustransaksi(Request $request)
|
|
{
|
|
PenjualanModel::where('notajual', $request->notajual)->update([
|
|
'statustransaksi' => $request->statustransaksi
|
|
]);
|
|
|
|
return back()->with('success', 'Status Transaksi Berhasil Diubah');
|
|
}
|
|
|
|
public function barangkeluarhapus($id)
|
|
{
|
|
PenjualanModel::where('notajual', $id)->delete();
|
|
|
|
return back()->with('success', 'Barang Keluar Berhasil Dihapus');
|
|
}
|
|
*/
|
|
|
|
// stockopname
|
|
//public function stockopnamedaftar()
|
|
//{
|
|
//$stockOpnameDates = StockopnameModel::select('tanggalstockopname')
|
|
//->distinct()
|
|
//->orderBy('tanggalstockopname', 'DESC')
|
|
//->paginate(6);
|
|
|
|
//$produk = ProdukModel::withTrashed()->get();
|
|
|
|
//$stockOpnameData = [];
|
|
|
|
//foreach ($stockOpnameDates as $date) {
|
|
//$tanggalStockOpname = $date->tanggalstockopname;
|
|
|
|
//$stockOpnameData[$tanggalStockOpname] = StockopnameModel::with('produk')
|
|
//->where('tanggalstockopname', $tanggalStockOpname)
|
|
//->get();
|
|
//}
|
|
|
|
//return view('owner.stockopnamedaftar', compact('stockOpnameDates', 'produk', 'stockOpnameData'));
|
|
//}
|
|
|
|
/* 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::all();
|
|
|
|
// 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('owner.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])) {
|
|
StockopnameModel::create([
|
|
'tanggalstockopname' => $tanggalStockOpname,
|
|
'idproduk' => $idProduk[$i],
|
|
'stoksistem' => $stokSistem[$i],
|
|
'stokgudang' => $stokGudang[$i],
|
|
'selisih' => $selisih[$i],
|
|
'waktuinputstockopname' => now()
|
|
]);
|
|
}
|
|
}
|
|
|
|
return redirect('owner/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('owner/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('owner.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('owner.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('owner.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('owner.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('owner.internaldaftar', compact('users'));
|
|
}
|
|
|
|
|
|
|
|
public function internaledit($id)
|
|
{
|
|
$data['user'] = User::find($id);
|
|
|
|
return view('owner.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('owner/internaldaftar')->with('success', 'User berhasil diperbarui');
|
|
}
|
|
|
|
public function internalhapus($id)
|
|
{
|
|
User::where('id', $id)->delete();
|
|
|
|
return redirect('owner/internaldaftar')->with('success', 'User berhasil dihapus');
|
|
}
|
|
|
|
// profile
|
|
public function profile()
|
|
{
|
|
$data['profile'] = User::find(auth()->user()->id);
|
|
|
|
return view('owner.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('owner/profile')->with('success', 'Profile berhasil diperbarui');
|
|
}
|
|
}
|