<?php
namespace App\Http\Controllers;
use App\Exports\TransaksiPenjualanExport;
use App\Helpers\Helper;
use App\Models\DetailGaransi;
use App\Models\Penjualan;
use App\Models\Profil;
use App\Models\DetailPenjualan;
use App\Models\DetailReturPenjualan;
use App\Models\Garansi;
use App\Models\Pelanggan;
use App\Models\Item;
use App\Models\PembayaranPiutang;
use App\Models\Pengguna;
use App\Models\ReferralPelanggan;
use App\Models\ReturPenjualan;
use App\Models\RiwayatPoinPelanggan;
use App\Models\RiwayatTransaksi;
use App\Models\Sale;
use App\Models\Toko;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use DateInterval;
use DatePeriod;
use DateTime;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log;
use Maatwebsite\Excel\Facades\Excel;
class PenjualanController extends Controller
{
public function guest()
{
$tokos = auth()->user()->role->tokos;
return response()->view('penjualan.guest', compact('tokos'));
}
public function guestStore(Request $request)
{
DB::beginTransaction();
try {
$findPelanggan = Pelanggan::where('telp_pelanggan', $request->kontak)->first();
if ($findPelanggan) {
$request->validate([
'nama' => 'required',
'kontak' => 'required',
'kecamatan_pelanggan' => 'required',
'alamat' => 'required',
]);
$update = $findPelanggan->update([
'nama_pelanggan' => $request->nama,
'telp_pelanggan' => $request->kontak,
'kecamatan_pelanggan' => $request->kecamatan_pelanggan,
'alamat_pelanggan' => $request->alamat,
'pengguna_id' => 0
]);
$pelanggan_id = $findPelanggan->id;
} else {
$request->validate([
'nama' => 'required',
'kontak' => 'required',
'kecamatan_pelanggan' => 'required',
'alamat' => 'required',
]);
$pelanggan = Pelanggan::create([
'nama_pelanggan' => $request->nama,
'telp_pelanggan' => $request->kontak,
'kecamatan_pelanggan' => $request->kecamatan_pelanggan,
'alamat_pelanggan' => $request->alamat,
'pengguna_id' => 0
]);
$pelanggan->save();
$pelanggan_id = $pelanggan->id;
}
$uang_kembali = (int) str_replace(".", "", $request->kembali);
if ($request->uang_bayar > $request->grand_total) {
$uang_masuk = $request->uang_bayar - $uang_kembali;
} else {
$uang_masuk = $request->uang_bayar;
}
$data = [
"pelanggan_id" => $pelanggan_id,
"tanggal_penjualan" => $request->tanggal,
"nomor_nota" => $request->no_penjualan,
"metode_bayar" => $request->metode_bayar,
"status" => $request->status,
"uang_awal" => $uang_masuk,
"uang_masuk" => $uang_masuk,
"status_pesan" => 0,
"uang_bayar" => $request->uang_bayar,
"pengguna_id" => auth()->user()->id,
"sale_id" => auth()->user()->id,
];
if ($request->uang_bayar < $request->grand_total) {
$data['status_pembayaran'] = 'belum lunas';
} else {
$now = now();
// $now->modify('+8 hours');
$data['status_pembayaran'] = 'lunas';
$data['jam_selesai'] = $now;
}
$penjualan = Penjualan::create($data);
$penjualan->save();
$penjualan->tokos()->sync($request->toko_id);
if ($request->has('referral_code')) {
$referral = ReferralPelanggan::where('code', $request->referral_code)->first();
if ($referral) {
$penjualan->referrrals()->sync([$referral->id => ['code' => $request->referral_code, 'bonus_value' => (int)str_contains($referral->type, 'percent') ? (int)($request->grand_total ?? $request->biaya) * ($referral->value / 100) : $referral->value]]);
}
}
RiwayatTransaksi::create([
"pelanggan_id" => $pelanggan_id,
"no_transaksi" => $request->no_penjualan,
"jenis_transaksi" => "Pembelian",
"tanggal" => $request->tanggal,
"biaya" => $request->grand_total,
]);
if (isset($request->jumlah)) {
for ($i = 0; $i < count($request->jumlah); $i++) {
$item = Item::with('stok_item_tokos')->find($request->id[$i]);
$detail = [
"penjualan_id" => $penjualan->id,
"item_id" => $request->id[$i],
"qty" => $request->jumlah[$i],
"diskon" => $request->diskon[$i],
"harga_item" => $item->harga_item,
"nama_item" => $item->nama_item,
"biaya_item" => $item->biaya_item,
];
$today = date("Y-m-d");
$akhir_garansi = date("Y-m-d", strtotime($today . " + " . $item->durasi_garansi . " " . $item->ket_waktu));
$detail['akhir_garansi'] = $akhir_garansi;
DetailPenjualan::create($detail);
$item->update([
"stok" => $item->stok - $request->jumlah[$i],
]);
$item->stok_item_tokos()->updateOrCreate(['toko_id' => $request->toko_id], [
"stok" => (@$item->stok_item_tokos->where("toko_id", $request->toko_id)->first()->stok ?? 0) - $request->jumlah[$i],
]);
}
}
Helper::addUserLog('Menambah Penjualan Untuk Pelanggan ' . $penjualan->pelanggan->nama_pelanggan, $penjualan->toArray());
DB::commit();
return redirect()->route('penjualan.index')->with('success', 'Penjualan berhasil ditambah');
} catch (\Throwable $th) {
DB::rollback();
Log::error($th);
return redirect()->with('error', $th->getMessage());
}
}
public function index(Request $request): Response
{
// this will default to a time of 00:00:00
$begin = new DateTime('-1 month');
$end = new DateTime();
$periode = [
$begin->format('d/m/Y'),
$end->format('d/m/Y'),
];
if (request()->periode) {
$periode = explode(" - ", request()->periode);
$begin = DateTime::createFromFormat('d/m/Y', $periode[0]);
$end = DateTime::createFromFormat('d/m/Y', $periode[1]);
}
// $penjualan = new Penjualan();
// $datas = $penjualan->whereBetween("created_at", [$begin->format('Y-m-d'), $end->format('Y-m-d')]);
// $omset = 0;
// $omset_kotor = $datas->get();
// foreach ($omset_kotor as $ok) {
// $omset += $ok->total;
// }
$datas = Penjualan::whereDateBetween("tanggal_penjualan", [$begin->format('Y-m-d'), $end->format('Y-m-d')]);
if (isset($request->cari)) {
$datas = $datas->cari($request->cari);
}
$terjual = 0;
foreach ($datas->get() as $data) {
foreach ($data->detail_penjualan as $detail) {
$terjual += $detail->qty;
}
}
if (isset($request->pengguna_id)) {
$datas = $datas->where('pengguna_id', $request->pengguna_id);
}
$jumlah_penjualan = $datas->count();
$penjualan = Penjualan::whereDateBetween("jam_selesai", [$begin->format('Y-m-d'), $end->format('Y-m-d')])->where('status_pembayaran', 'lunas')->whereNull('status_lanjutan')->get();
$omset = 0;
foreach ($penjualan as $penjualan) {
$omset += $penjualan->total;
}
$penjualan_cash = Penjualan::whereDateBetween("jam_selesai", [$begin->format('Y-m-d'), $end->format('Y-m-d')])->where('metode_bayar', 'cash')->where('status_pembayaran', 'lunas')->whereNull('status_lanjutan')->get();
$omset_cash = 0;
foreach ($penjualan_cash as $pc) {
$omset_cash += $pc->total;
}
$penjualan_transfer = Penjualan::whereDateBetween("jam_selesai", [$begin->format('Y-m-d'), $end->format('Y-m-d')])->where('metode_bayar', 'transfer')->where('status_pembayaran', 'lunas')->whereNull('status_lanjutan')->get();
$omset_transfer = 0;
foreach ($penjualan_transfer as $pt) {
$omset_transfer += $pt->uang_masuk;
}
$penjualan_kredit = Penjualan::whereDateBetween("jam_selesai", [$begin->format('Y-m-d'), $end->format('Y-m-d')])->where('metode_bayar', 'kredit')->where('status_pembayaran', 'lunas')->get();
$omset_kredit = 0;
foreach ($penjualan_kredit as $pt) {
$omset_kredit += $pt->uang_masuk;
}
$jumlah_penjualan = Penjualan::whereDateBetween("jam_selesai", [$begin->format('Y-m-d'), $end->format('Y-m-d')])->count();
$jumlah_retur_penjualan = ReturPenjualan::whereBetween("created_at", [$begin->format('Y-m-d'), $end->format('Y-m-d')])->count();
$dp_penjualan = Penjualan::whereDateBetween("tanggal_penjualan", [$begin->format('Y-m-d'), $end->format('Y-m-d')])->where('status_pembayaran', 'belum lunas')->get();
$dp = 0;
foreach ($dp_penjualan as $dp_p) {
$dp += $dp_p->uang_masuk;
}
$dp_penjualan_cash = Penjualan::whereDateBetween("tanggal_penjualan", [$begin->format('Y-m-d'), $end->format('Y-m-d')])->where('metode_bayar', 'cash')->where('status_pembayaran', 'belum lunas')->get();
$dp_cash = 0;
foreach ($dp_penjualan_cash as $dp_p) {
$dp_cash += $dp_p->uang_masuk;
}
$dp_penjualan_transfer = Penjualan::whereDateBetween("tanggal_penjualan", [$begin->format('Y-m-d'), $end->format('Y-m-d')])->where('metode_bayar', 'transfer')->where('status_pembayaran', 'belum lunas')->get();
$dp_transfer = 0;
foreach ($dp_penjualan_transfer as $dp_p) {
$dp_transfer += $dp_p->uang_masuk;
}
$dp_penjualan_kredit = Penjualan::whereDateBetween("tanggal_penjualan", [$begin->format('Y-m-d'), $end->format('Y-m-d')])->where('metode_bayar', 'kredit')->where('status_pembayaran', 'belum lunas')->get();
$dp_kredit = 0;
foreach ($dp_penjualan_kredit as $dp_p) {
$dp_kredit += $dp_p->uang_masuk;
}
$total_dp_penjualan = Penjualan::where('status_pembayaran', 'belum lunas')->get();
$total_dp = 0;
foreach ($total_dp_penjualan as $dp_p) {
$total_dp += $dp_p->uang_masuk;
}
$total_dp_penjualan_cash = Penjualan::where('metode_bayar', 'cash')->where('status_pembayaran', 'belum lunas')->get();
$total_dp_cash = 0;
foreach ($total_dp_penjualan_cash as $dp_p) {
$total_dp_cash += $dp_p->uang_masuk;
}
$total_dp_penjualan_transfer = Penjualan::where('metode_bayar', 'transfer')->where('status_pembayaran', 'belum lunas')->get();
$total_dp_transfer = 0;
foreach ($total_dp_penjualan_transfer as $dp_p) {
$total_dp_transfer += $dp_p->uang_masuk;
}
$total_dp_penjualan_kredit = Penjualan::where('metode_bayar', 'kredit')->where('status_pembayaran', 'belum lunas')->get();
$total_dp_kredit = 0;
foreach ($total_dp_penjualan_kredit as $dp_p) {
$total_dp_kredit += $dp_p->uang_masuk;
}
$datas = $datas->latest()->get();
$profil = Profil::first();
$data = [
'datas' => $datas,
'request' => $request,
'profil' => $profil,
'omset' => $omset,
'omset_cash' => $omset_cash,
'jumlah_penjualan' => $jumlah_penjualan,
'barang_terjual' => $terjual,
'jumlah_retur_penjualan' => $jumlah_retur_penjualan,
'omset_transfer' => $omset_transfer,
'omset_kredit' => $omset_kredit,
'dp' => $dp,
'dp_cash' => $dp_cash,
'dp_transfer' => $dp_transfer,
'dp_kredit' => $dp_kredit,
'total_dp' => $total_dp,
'total_dp_cash' => $total_dp_cash,
'total_dp_transfer' => $total_dp_transfer,
'total_dp_kredit' => $total_dp_kredit,
"periode" => $periode,
];
return response()->view('penjualan.index', $data);
}
/**
* Show the form for creating a new resource.
*/
public function create(): Response
{
$pelanggans = Pelanggan::all();
$penggunas = Pengguna::all();
$tokos = auth()->user()->role->tokos;
$datas = [
"pelanggans" => $pelanggans,
"pengguna" => $penggunas,
"tokos" => $tokos,
];
return response()->view('penjualan.create', $datas);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request): RedirectResponse
{
$request->validate([
'nama' => 'required',
'kontak' => 'required',
'kecamatan_pelanggan' => 'required',
'alamat' => 'required',
"bukti_transfer" => 'nullable|file|mimes:jpg,jpeg,png,pdf,tiff,webp',
]);
DB::beginTransaction();
try {
$findPelanggan = Pelanggan::where('telp_pelanggan', $request->kontak)->first();
if ($findPelanggan) {
$update = $findPelanggan->update([
'nama_pelanggan' => $request->nama,
'telp_pelanggan' => $request->kontak,
'kecamatan_pelanggan' => $request->kecamatan_pelanggan,
'alamat_pelanggan' => $request->alamat,
'pengguna_id' => 0
]);
$pelanggan_id = $findPelanggan->id;
} else {
$pelanggan = Pelanggan::create([
'nama_pelanggan' => $request->nama,
'telp_pelanggan' => $request->kontak,
'kecamatan_pelanggan' => $request->kecamatan_pelanggan,
'alamat_pelanggan' => $request->alamat,
'pengguna_id' => 0
]);
$pelanggan->save();
$pelanggan_id = $pelanggan->id;
}
$uang_kembali = (int) str_replace(".", "", $request->kembali);
if ($request->uang_bayar > $request->grand_total) {
$uang_masuk = $request->uang_bayar - $uang_kembali;
} else {
$uang_masuk = $request->uang_bayar;
}
$data = [
"pelanggan_id" => $pelanggan_id,
"tanggal_penjualan" => $request->tanggal,
"nomor_nota" => $request->no_penjualan,
"metode_bayar" => $request->metode_bayar,
"status" => $request->status,
"uang_awal" => $uang_masuk,
"uang_masuk" => $uang_masuk,
"status_pesan" => 0,
"uang_bayar" => $request->uang_bayar,
"diskon" => @$request->diskon_total ?? 0,
"diskon_persen" => @$request->diskon_persen_total ?? 0,
"diskon_poin" => @$request->diskon_poin ?? 0,
"pengguna_id" => auth()->user()->id,
"sale_id" => auth()->user()->id,
];
if ($request->uang_bayar < $request->grand_total) {
$data['status_pembayaran'] = 'belum lunas';
} else {
$now = now();
//$now->addHours(8);
$data['status_pembayaran'] = 'lunas';
$data['jam_selesai'] = $now;
}
if ($request->hasFile('bukti_transfer')) {
$file = $request->file('bukti_transfer');
$ekstensi = $file->extension();
$baru = "BuktiTF-Penjualan-" . date('ymdhis') . ".$ekstensi";
$file->move(public_path('images/Bukti_transfer'), $baru);
$data['bukti_transfer'] = $baru;
}
// dd($data);
$penjualan = Penjualan::create($data);
$penjualan->tokos()->sync($request->toko_id);
// dd(Penjualan::create($data));
// $penjualan->save();
if ($request->has('referral_code')) {
$referral = ReferralPelanggan::where('code', $request->referral_code)->first();
if ($referral && $referral->pelanggan_id != $pelanggan_id) {
$penjualan->referrrals()->sync([$referral->id => ['code' => $request->referral_code, 'bonus_value' => (int)str_contains($referral->type, 'percent') ? (int)($request->grand_total ?? $request->biaya) * ($referral->value / 100) : $referral->value]]);
RiwayatPoinPelanggan::create([
'pelanggan_id' => $referral->pelanggan_id,
'bertambah' => (int)str_contains($referral->type, 'percent') ? (int)($request->grand_total ?? $request->biaya) * ($referral->value / 100) : $referral->value,
'keterangan' => 'tambah penjualan ' . $penjualan->nomor_nota
]);
}
}
if ($request->diskon_poin > 0) {
$pelanggan = Pelanggan::with('riwayat_poin_pelanggans')->findOrFail($penjualan->pelanggan_id);
if($request->diskon_poin > $pelanggan->total_point){
DB::rollBack();
return redirect()->back()->withInput($request->all())->with('error', "Poin Pelanggan Tidak Cukup");
} else {
RiwayatPoinPelanggan::create([
'pelanggan_id' => $penjualan->pelanggan_id,
'berkurang' => $request->diskon_poin,
'keterangan' => 'tambah penjualan ' . $penjualan->nomor_nota
]);
}
}
RiwayatTransaksi::create([
"pelanggan_id" => $pelanggan_id,
"no_transaksi" => $request->no_penjualan,
"jenis_transaksi" => "Pembelian",
"tanggal" => $request->tanggal,
"biaya" => $request->grand_total,
]);
if (isset($request->jumlah)) {
for ($i = 0; $i < count($request->jumlah); $i++) {
$item = Item::with('stok_item_tokos')->find($request->id[$i]);
$detail = [
"penjualan_id" => $penjualan->id,
"item_id" => $request->id[$i],
"qty" => $request->jumlah[$i],
"diskon" => $request->diskon[$i],
"diskon_persen" => @$request->diskon_persen[$i] ?? 0,
"harga_item" => $item->harga_item,
"nama_item" => $item->nama_item,
"biaya_item" => $item->biaya_item,
];
$today = date("Y-m-d");
$akhir_garansi = date("Y-m-d", strtotime($today . " + " . $item->durasi_garansi . " " . $item->ket_waktu));
$detail['akhir_garansi'] = $akhir_garansi;
DetailPenjualan::create($detail);
$item->update([
"stok" => $item->stok - $request->jumlah[$i],
]);
$item->stok_item_tokos()->updateOrCreate(['toko_id' => $request->toko_id], [
"stok" => (@$item->stok_item_tokos->where("toko_id", $request->toko_id)->first()->stok ?? 0) - $request->jumlah[$i],
]);
}
}
Helper::addUserLog('Menambah Penjualan Untuk Pelanggan ' . $penjualan->pelanggan->nama_pelanggan, $penjualan->toArray());
DB::commit();
// return redirect(route("penjualan.index"));
return redirect()->route('penjualan.index')->with('success', 'Penjualan berhasil ditambah');
} catch (\Throwable $th) {
DB::rollback();
Log::error($th);
return redirect()->back()->withInput($request->all())->with('error', $th->getMessage());
}
}
/**
* Display the specified resource.
*/
public function show(string $id): Response
{
$datas = Penjualan::find($id);
$data = [
'datas' => $datas,
];
return response()->view('penjualan.show', $data);
}
public function nota(string $id): Response
{
$datas = Penjualan::find($id);
$profil = Profil::first();
$data = [
'datas' => $datas,
'profil' => $profil,
];
$pdf = Pdf::loadView('penjualan.nota', $data);
$fileName = 'NotaPenjualan-' . $data['datas']->pelanggan->telp_pelanggan . date('his') . '.pdf';
$pdf->setPaper('A4', 'landscape');
$pdf->render();
$path = public_path('pdf/Nota/' . $fileName);
return $pdf->stream($path, array("Attachment" => false));
}
public function notaSend(string $id)
{
$datas = Penjualan::find($id);
$profil = Profil::first();
$data = [
'datas' => $datas,
'profil' => $profil,
];
$pdf = Pdf::loadView('penjualan.nota', $data);
$fileName = 'NotaPenjualan-' . $data['datas']->pelanggan->telp_pelanggan . date('his') . '.pdf';
$pdf->setPaper('A4', 'landscape');
$pdf->render();
$path = public_path('pdf/Nota/' . $fileName);
$pdf->save($path);
$pdfUrl = url('pdf/Nota/' . $fileName);
$pesan = Helper::sendNotaPDF($data['datas']->pelanggan->telp_pelanggan, $pdfUrl);
File::delete($path);
if ($pesan) {
return redirect()->back()->with('success', "Nota Berhasil Terkirim ");
} else {
return redirect()->back()->with('error', "Nota Gagal Terkirim ");
}
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id): Response
{
$datas = Penjualan::find($id);
$pelanggans = Pelanggan::all();
$penggunas = Pengguna::all();
$tokos = auth()->user()->role->tokos;
$data = [
'datas' => $datas,
'pelanggans' => $pelanggans,
'pengguna' => $penggunas,
'tokos' => $tokos,
];
return response()->view('penjualan.edit', $data);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id): RedirectResponse
{
$request->validate([
'nama' => 'required',
'kontak' => 'required',
'kecamatan_pelanggan' => 'required',
'alamat' => 'required',
"bukti_transfer" => 'nullable|file|mimes:jpg,jpeg,png,pdf,tiff,webp',
]);
$penjualan = Penjualan::findOrFail($id);
$old_total = $penjualan->total;
$old_poin = $penjualan->diskon_poin;
DB::beginTransaction();
try {
$findPelanggan = Pelanggan::where('telp_pelanggan', $request->kontak)->first();
if ($findPelanggan) {
$update = $findPelanggan->update([
'nama_pelanggan' => $request->nama,
'telp_pelanggan' => $request->kontak,
'kecamatan_pelanggan' => $request->kecamatan_pelanggan,
'alamat_pelanggan' => $request->alamat,
'pengguna_id' => 0
]);
$pelanggan_id = $findPelanggan->id;
} else {
$pelanggan = Pelanggan::create([
'nama_pelanggan' => $request->nama,
'telp_pelanggan' => $request->kontak,
'kecamatan_pelanggan' => $request->kecamatan_pelanggan,
'alamat_pelanggan' => $request->alamat,
'pengguna_id' => 0
]);
$pelanggan->save();
$pelanggan_id = $pelanggan->id;
}
$old_detail = DetailPenjualan::where("penjualan_id", $penjualan->id);
$uang_kembali = (int) str_replace(".", "", $request->kembali);
if ($request->uang_bayar > $request->grand_total) {
$uang_masuk = $request->uang_bayar - $uang_kembali;
} else {
$uang_masuk = $request->uang_bayar;
}
$data = [
"pelanggan_id" => $pelanggan_id,
"tanggal_penjualan" => $request->tanggal,
"nomor_nota" => $request->no_penjualan,
"metode_bayar" => $request->metode_bayar,
"uang_bayar" => $request->uang_bayar,
"uang_masuk" => $uang_masuk,
"status" => $request->status,
"pengguna_id" => $request->pengguna_id,
"sale_id" => $request->sale_id,
"diskon" => @$request->diskon_total ?? 0,
"diskon_persen" => @$request->diskon_persen_total ?? 0,
"diskon_poin" => @$request->diskon_poin ?? 0,
];
if ($request->uang_bayar < $request->grand_total) {
$data['status_pembayaran'] = 'belum lunas';
} else {
$now = now();
$data['status_pembayaran'] = 'lunas';
$data['jam_selesai'] = $now;
}
if ($request->hasFile('bukti_transfer')) {
$file = $request->file('bukti_transfer');
$ekstensi = $file->extension();
$baru = "BuktiTF-Penjualan-" . date('ymdhis') . ".$ekstensi";
$file->move(public_path('images/Bukti_transfer'), $baru);
$data['bukti_transfer'] = $baru;
$tf_lama = $penjualan->bukti_transfer;
File::delete(public_path('images/Bukti_transfer') . "/" . $tf_lama);
}
$penjualan->update($data);
$penjualan->tokos()->sync($request->toko_id);
if ($request->has('referral_code')) {
$referral = ReferralPelanggan::where('code', $request->referral_code)->first();
if ($referral && $referral->pelanggan_id != $pelanggan_id) {
$penjualan->referrrals()->sync([$referral->id => ['code' => $request->referral_code, 'bonus_value' => (int)str_contains($referral->type, 'percent') ? (int)($request->grand_total ?? $request->biaya) * ($referral->value / 100) : $referral->value]]);
RiwayatPoinPelanggan::create([
'pelanggan_id' => $referral->pelanggan_id,
'berkurang' => (int)str_contains($referral->type, 'percent') ? (int)($old_total ?? $request->biaya) * ($referral->value / 100) : $referral->value,
'keterangan' => 'edit penjualan ' . $penjualan->nomor_nota
]);
RiwayatPoinPelanggan::create([
'pelanggan_id' => $referral->pelanggan_id,
'bertambah' => (int)str_contains($referral->type, 'percent') ? (int)($request->grand_total ?? $request->biaya) * ($referral->value / 100) : $referral->value,
'keterangan' => 'edit penjualan ' . $request->no_penjualan
]);
}
}
if ($request->diskon_poin != $old_poin) {
$pelanggan = Pelanggan::with('riwayat_poin_pelanggans')->findOrFail($penjualan->pelanggan_id);
if($request->diskon_poin > $pelanggan->total_point){
DB::rollBack();
return redirect()->back()->withInput($request->all())->with('error', "Poin Pelanggan Tidak Cukup");
} else {
RiwayatPoinPelanggan::create([
'pelanggan_id' => $pelanggan_id,
'bertambah' => $old_poin,
'keterangan' => 'edit penjualan ' . $penjualan->nomor_nota
]);
RiwayatPoinPelanggan::create([
'pelanggan_id' => $penjualan->pelanggan_id,
'berkurang' => $request->diskon_poin,
'keterangan' => 'edit penjualan ' . $request->no_penjualan
]);
}
}
foreach ($old_detail->get() as $o) {
$item_old = Item::with('stok_item_tokos')->find($o->item_id);
if (isset($item_old)) {
$item_old->update([
"stok" => $item_old->stok + $o->qty
]);
$item_old->stok_item_tokos()->updateOrCreate(['toko_id' => $request->toko_id], [
"stok" => (@$item_old->stok_item_tokos->where("toko_id", $request->toko_id)->first()->stok ?? 0) + $o->qty,
]);
}
}
$old_detail->delete();
if (isset($request->jumlah)) {
for ($i = 0; $i < count($request->jumlah); $i++) {
$item = Item::with('stok_item_tokos')->find($request->id[$i]);
$detail = [
"penjualan_id" => $penjualan->id,
"item_id" => $request->id[$i],
"qty" => $request->jumlah[$i],
"diskon" => @$request->diskon[$i] ?? 0,
"diskon_persen" => @$request->diskon_persen[$i] ?? 0,
"harga_item" => $request->harga[$i],
"biaya_item" => $request->biaya_item[$i],
"nama_item" => $request->nama_item[$i],
];
if (isset($item)) {
$akhir_garansi = date("Y-m-d", strtotime($penjualan->tanggal_penjualan . " + " . $item->durasi_garansi . " " . $item->ket_waktu));
$detail['akhir_garansi'] = $akhir_garansi;
$item->update([
"stok" => $item->stok - $request->jumlah[$i],
]);
$item->stok_item_tokos()->updateOrCreate(['toko_id' => $request->toko_id], [
"stok" => (@$item->stok_item_tokos->where("toko_id", $request->toko_id)->first()->stok ?? 0) - $request->jumlah[$i],
]);
} else {
$detail['akhir_garansi'] = now();
}
DetailPenjualan::create($detail);
}
}
Helper::addUserLog('Mengubah Penjualan Untuk Pelanggan ' . $penjualan->pelanggan->nama_pelanggan, $penjualan->toArray());
DB::commit();
return redirect()->route("penjualan.index")->with("success", "Penjualan Berhasil Diubah");
} catch (\Throwable $th) {
DB::rollback();
Log::error($th);
return redirect()->back()->with("error", $th->getMessage())->withInput($request->all());
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id): RedirectResponse
{
DB::beginTransaction();
try {
$data = Penjualan::with('tokos')->find($id);
$pembayaran_piutang = PembayaranPiutang::where("penjualan_id", $data->id);
$detail = DetailPenjualan::where("penjualan_id", $data->id);
// delete mengembalikan stok
if (isset($detail)) {
foreach ($detail->get() as $o) {
$item_old = Item::with('stok_item_tokos')->find($o->item_id);
if (isset($item_old)) {
$item_old->update([
"stok" => $item_old->stok + $o->qty
]);
$toko_id = @$data->tokos->first()->id ?? 0;
if ($toko_id) {
$item_old->stok_item_tokos()->where("toko_id", $toko_id)->update([
"stok" => (@$item_old->stok_item_tokos->where("toko_id", $toko_id)->first()->stok ?? 0) + $o->qty,
]);
}
}
}
}
$data->tokos()->detach();;
$pembayaran_piutang->delete();
$detail->delete();
$data->delete();
Helper::addUserLog('Menghapus Penjualan Untuk Pelanggan ' . $data->pelanggan->nama_pelanggan, $data->toArray());
DB::commit();
return redirect()->route('penjualan.index')->with('success', 'Penjualan berhasil dihapus');
} catch (\Throwable $th) {
DB::rollback();
Log::error($th);
return redirect()->back()->with('error', 'Penjualan gagal dihapus');
}
}
public function multiDelete(Request $request): RedirectResponse
{
if($request->data_id == "" || $request->data_id == null){
return redirect()->back()->with('error', 'Silahkan pilih data yang ingin dihapus');
}
DB::beginTransaction();
try {
$data_ids = explode(",",$request->data_id);
foreach ($data_ids as $id) {
$data = Penjualan::with('tokos')->find($id);
$pembayaran_piutang = PembayaranPiutang::where("penjualan_id", $data->id);
$detail = DetailPenjualan::where("penjualan_id", $data->id);
// delete mengembalikan stok
if (isset($detail)) {
foreach ($detail->get() as $o) {
$item_old = Item::with('stok_item_tokos')->find($o->item_id);
if (isset($item_old)) {
$item_old->update([
"stok" => $item_old->stok + $o->qty
]);
$toko_id = @$data->tokos->first()->id ?? 0;
if ($toko_id) {
$item_old->stok_item_tokos()->where("toko_id", $toko_id)->update([
"stok" => (@$item_old->stok_item_tokos->where("toko_id", $toko_id)->first()->stok ?? 0) + $o->qty,
]);
}
}
}
}
$data->tokos()->detach();;
$pembayaran_piutang->delete();
$detail->delete();
$data->delete();
}
Helper::addUserLog('Menghapus '.count($data_ids).' Penjualan');
DB::commit();
return redirect()->route('penjualan.index')->with('success', count($data_ids).' Penjualan berhasil dihapus');
} catch (\Throwable $th) {
DB::rollback();
Log::error($th);
return redirect()->back()->with('error', 'Penjualan gagal dihapus');
}
}
public function retur_penjualan(string $id)
{
DB::beginTransaction();
try {
$detail_penjualan = DetailPenjualan::with('penjualan.tokos')->find($id);
$penjualan = $detail_penjualan->penjualan_id;
$item = Item::with('stok_item_tokos')->find($detail_penjualan->item_id);
$item->update([
'stok' => $item->stok + $detail_penjualan->qty,
]);
if ($item->stok_item_tokos->count() > 0 && $detail_penjualan->penjualan->tokos->count() > 0) {
if ($item->stok_item_tokos->where("toko_id", $detail_penjualan->penjualan->tokos->first()->id)->count() > 0) {
$item->stok_item_tokos()->where("toko_id", $detail_penjualan->penjualan->tokos->first()->id)->update([
"stok" => $item->stok_item_tokos->where("toko_id", $detail_penjualan->penjualan->tokos->first()->id)->first()->stok + $detail_penjualan->qty,
]);
}
}
$detail_penjualan->delete();
DB::commit();
return redirect()->route('penjualan.show', $penjualan)->with('success', 'Barang Berhasil diretur');
} catch (\Throwable $th) {
DB::rollback();
return redirect()->route('penjualan.show', $penjualan)->with('error', 'Barang gagal diretur');
}
}
public function list_detail(Request $request)
{
$penjualan = Penjualan::find($request->id_penjualan);
return response()->json([
'data' => $penjualan->detail_penjualan->get()
]);
}
public function garansi(string $id)
{
// $penjualan = Penjualan::all();
$penjualan = $id;
$datas = Penjualan::find($id);
$pelanggan_id = $datas->pelanggan_id;
$pelanggan = Pelanggan::find($pelanggan_id);
$sales = Sale::all();
$data = [
// "penjualans" => $penjualan,
"datas" => $datas,
"penjualan" => $datas,
"pelanggan" => $pelanggan,
"sales" => $sales,
"penjualan_id" => $penjualan,
"deskripsi" => "Claim Garansi"
];
return response()->view('penjualan.create_garansi', $data);
}
public function garansi_store($id, Request $request)
{
$penjualan = Penjualan::findOrFail($id);
DB::beginTransaction();
try {
// $findPelanggan = Pelanggan::where('telp_pelanggan', $request->kontak)->first();
// if ($findPelanggan) {
// $request->validate([
// 'nama' => 'required',
// 'kontak' => 'required',
// 'kecamatan_pelanggan' => 'required',
// 'alamat' => 'required',
// ]);
// $update = $findPelanggan->update([
// 'nama_pelanggan' => $request->nama,
// 'telp_pelanggan' => $request->kontak,
// 'kecamatan_pelanggan' => $request->kecamatan_pelanggan,
// 'alamat_pelanggan' => $request->alamat,
// 'pengguna_id' => 0
// ]);
// $pelanggan_id = $findPelanggan->id;
// } else {
// $request->validate([
// 'nama' => 'required',
// 'kontak' => 'required',
// 'kecamatan_pelanggan' => 'required',
// 'alamat' => 'required',
// ]);
// $pelanggan = Pelanggan::create([
// 'nama_pelanggan' => $request->nama,
// 'telp_pelanggan' => $request->kontak,
// 'kecamatan_pelanggan' => $request->kecamatan_pelanggan,
// 'alamat_pelanggan' => $request->alamat,
// 'pengguna_id' => 0
// ]);
// $pelanggan->save();
// $pelanggan_id = $pelanggan->id;
// }
// $retur_penjualan = ReturPenjualan::create([
// "pelanggan_id" => $pelanggan_id,
// "no_retur" => $request->no_penjualan ?? "GR-".date("YmdHis"),
// "sale_id" => $request->sale_id,
// "tanggal_penjualan" => $request->tanggal,
// "keterangan" => $request->keterangan,
// "no_penjualan" => @$penjualan->nomor_nota,
// "penjualan_id" => @$penjualan->id,
// "pengguna_id" => auth()->user()->id
// ]);
// if (isset($request->jumlah)) {
// for ($i = 0; $i < count($request->jumlah); $i++) {
// $item = Item::find($request->id[$i]);
// if (isset($item)) {
// DetailReturPenjualan::create([
// "retur_penjualan_id" => $retur_penjualan->id,
// "item_id" => $request->id[$i],
// "nama_item" => $item->nama_item,
// "qty" => $request->jumlah[$i],
// ]);
// } else {
// DB::rollback();
// return redirect()->back()->with('error', 'terdapat barang yang tidak tercatat di data master barang!');
// }
// // $item->update([
// // "stok" => $item->stok + $request->jumlah[$i],
// // ]);
// }
// }
$garansi = Garansi::create([
'no_garansi' => "GR-P-".date("YmdHis"),
'pengguna_id'=>auth()->user()->id,
'penjualan_id'=>$penjualan->id,
'tanggal_garansi'=>$request->tanggal,
"keterangan_garansi" => $request->keterangan,
"status_garansi" => 'pending'
]);
if (isset($request->jumlah)) {
for ($i = 0; $i < count($request->jumlah); $i++) {
$item = Item::find($request->id[$i]);
if (isset($item)) {
DetailGaransi::create([
"garansi_id" => $garansi->id,
"item_id" => $request->id[$i],
"nama_item" => $item->nama_item,
"harga_item" => $item->harga_item,
"qty" => $request->jumlah[$i],
]);
} else {
DB::rollback();
return redirect()->back()->with('error', 'terdapat barang yang tidak tercatat di data master barang!');
}
}
}
$penjualan->update([
'status_lanjutan'=>'garansi'
]);
Helper::addUserLog("Membuat garansi : ".$garansi->no_garansi." dari penjualan : ".$penjualan->nomor_nota,$garansi->toArray());
DB::commit();
return redirect(route("penjualan.index"))->with('success', 'Garansi Berhasil Tercatat dengan nomor : '.$garansi->no_garansi);
} catch (\Throwable $th) {
DB::rollback();
Log::error($th);
return redirect()->back()->with('error', 'Gagal membuat garansi');
}
}
public function cetak(Request $request)
{
$penjualan = new Penjualan;
// $data =
$begin = new DateTime('-1 month');
$end = new DateTime();
$periode = [
$begin->format('d/m/Y'),
$end->format('d/m/Y'),
];
if (request()->periode) {
$periode = explode(" - ", request()->periode);
$begin = DateTime::createFromFormat('d/m/Y', $periode[0]);
$end = DateTime::createFromFormat('d/m/Y', $periode[1]);
}
$end->modify('+1 day');
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval, $end);
$periodeTanggals = [];
foreach ($daterange as $date) {
$periodeTanggals[] = strftime("%d-%b", strtotime($date->format("Y-m-d")));
}
$datas = Penjualan::whereDateBetween("jam_selesai", [$begin->format('Y-m-d'), $end->format('Y-m-d')]);
if (isset($request->pengguna_id)) {
$datas = $datas->where('pengguna_id', $request->pengguna_id);
}
$penjualan = $datas->get();
$pendapatan = 0;
$modal = 0;
$jual = 0;
$laba_rugi = 0;
foreach ($penjualan as $penjualan) {
$pendapatan += $penjualan->total;
$modal += $penjualan->total_modal;
$jual += $penjualan->total;
$laba_rugi += $penjualan->total - $penjualan->total_modal;
}
$datas = $datas->get();
$export = [];
$detail = "";
$akhir_garansi = "";
foreach ($datas as $data) {
$detail = "";
foreach ($data->detail_penjualan as $d) {
$detail .= $d->nama_item . ',';
$akhir_garansi .= $d->akhir_garansi . ',';
}
$export[] = [
$data->nomor_nota,
$data->tanggal_penjualan,
$data->pelanggan->nama_pelanggan,
$detail,
$akhir_garansi,
$data->metode_bayar,
$data->status_pembayaran,
"-",
optional($data->sales)->nama_pengguna,
$data->pengguna->nama_pengguna,
$data->total_modal,
$data->total,
$data->total - $data->total_modal,
$data->uang_bayar,
];
}
if ($request->excel == 1) {
return Excel::download(new TransaksiPenjualanExport($export), 'Laporan Transaksi Penjualan.xlsx');
} else {
$data = [
'datas' => $datas,
"periode" => $periode,
"periodeTanggals" => $periodeTanggals,
"pendapatan" => $pendapatan,
"modal" => $modal,
"jual" => $jual,
"laba_rugi" => $laba_rugi,
];
// $pdf = Pdf::loadView('laporan.penjualan.cetak', $data);
// return $pdf->download('Laporan Penjualan.pdf');
return response()->view("penjualan.cetak", $data);
}
}
}
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]