Anons79 Mini Shell

Directory : /home/aplikasiposinfo/public_html/joglocell.fixmate.id/app/Http/Controllers/
Upload File :
Current File : /home/aplikasiposinfo/public_html/joglocell.fixmate.id/app/Http/Controllers/PenjualanController.php

<?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]