MIF_E31211949/app/Http/Controllers/PinjamanController.php

488 lines
18 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Anggota;
use App\Models\DetailPinjaman;
use App\Models\DetailSimpanan;
use App\Models\HistoryTransaksi;
use App\Models\Laporan;
use App\Models\Pinjaman;
use Carbon\Carbon;
use Dompdf\Dompdf;
use Dompdf\Options;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Yajra\DataTables\DataTables;
class PinjamanController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
return view('pages.pinjaman.index');
}
public function belumLunas(Request $request)
{
$pinjaman = Pinjaman::where('status_pinjaman', 'Belum Lunas')->with('anggota')->get();
if ($request->ajax()) {
return DataTables::of($pinjaman)
->addColumn('DT_RowIndex', function ($pinjaman) {
return $pinjaman->id_pinjaman;
})
->addColumn('nama', function ($pinjaman) {
return $pinjaman->anggota->nama;
})
->addColumn('jenis_anggota', function ($pinjaman) {
return $pinjaman->anggota->jenis_anggota;
})
->toJson();
}
}
public function Lunas(Request $request)
{
$pinjaman = Pinjaman::where('status_pinjaman', 'Lunas')->with('anggota')->get();
if ($request->ajax()) {
return DataTables::of($pinjaman)
->addColumn('DT_RowIndex', function ($pinjaman) {
return $pinjaman->id_pinjaman;
})
->addColumn('nama', function ($pinjaman) {
return $pinjaman->anggota->nama;
})
->addColumn('jenis_anggota', function ($pinjaman) {
return $pinjaman->anggota->jenis_anggota;
})
->toJson();
}
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
return view('pages.pinjaman.create');
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'id_anggota' => 'required|exists:anggota,id_anggota',
'angsuran' => 'required|max:12|min:1',
'nominal_pinjaman' => 'required|numeric|regex:/^\d+(\.\d{1,2})?$/|max:5000000',
'bunga_pinjaman' => 'required|max:100|min:1'
]);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
$pinjaman_belum_lunas = Pinjaman::where('id_anggota', $request->id_anggota)
->where('status_pinjaman', 'Belum Lunas')
->first();
if ($pinjaman_belum_lunas) {
return redirect()->back()->with(['error' => 'Anggota memiliki pinjaman yang belum lunas.']);
}
try {
DB::transaction(function () use ($request) {
$angsuran_pokok = ceil($request->nominal_pinjaman / $request->angsuran);
$bunga = ceil($request->nominal_pinjaman * $request->bunga_pinjaman / 100);
$subtotal_angsuran = ceil($angsuran_pokok + $bunga);
$sisa_lancar_angsuran = ceil($subtotal_angsuran * $request->angsuran);
$pendapatan = $this->hitungKas();
if ($request->nominal_pinjaman > $pendapatan) {
throw new \Exception('Saldo koperasi tidak cukup untuk melanjutkan pengajuan pinjaman.');
}
$pinjaman = new Pinjaman();
$pinjaman->id_anggota = $request->id_anggota;
$pinjaman->no_pinjaman = $this->generateMemberNumber();
$pinjaman->total_pinjaman = $request->nominal_pinjaman;
$pinjaman->angsuran = $request->angsuran;
$pinjaman->sisa_lancar_keseluruhan = round($sisa_lancar_angsuran);
$pinjaman->status_pinjaman = 'Belum Lunas';
$pinjaman->tanggal_realisasi = Carbon::now();
if ($pinjaman->save()) {
$id_pinjaman = $pinjaman->id_pinjaman;
$history = new HistoryTransaksi();
$history->id_users = Auth::user()->id_users;
$history->id_anggota = $request->id_anggota;
$history->id_pinjaman = $id_pinjaman;
$history->tipe_transaksi = 'Pengeluaran';
if (!$history->save()) {
throw new \Exception('Gagal menyimpan data history transaksi.');
}
for ($i = 1; $i <= $request->angsuran; $i++) {
$detail_pinjaman = new DetailPinjaman();
$detail_pinjaman->id_pinjaman = $id_pinjaman;
$detail_pinjaman->id_users = Auth::id();
$detail_pinjaman->angsuran_pokok = round($angsuran_pokok);
$detail_pinjaman->bunga = round($bunga);
$detail_pinjaman->subtotal_angsuran = round($subtotal_angsuran);
$detail_pinjaman->angsuran_ke_ = $i;
$tanggal_jatuh_tempo = Carbon::now()->addMonths($i)->startOfDay();
$detail_pinjaman->tanggal_jatuh_tempo = $tanggal_jatuh_tempo;
if (!$detail_pinjaman->save()) {
throw new \Exception('Gagal menyimpan data detail simpanan.');
}
}
} else {
throw new \Exception('Gagal menyimpan data simpanan.');
}
});
if (Auth::user()->id_role == 2) {
return redirect()->route('pinjaman')->with('success', 'Data pinjaman berhasil ditambahkan.');
} else {
return redirect()->route('pegawai.pinjaman')->with('success', 'Data pinjaman berhasil ditambahkan.');
}
} catch (\Exception $e) {
return back()->withErrors(['error' => $e->getMessage()]);
}
}
/**
* Display the specified resource.
*/
public function show(Request $request, string $id)
{
$pinjaman = Pinjaman::where('id_pinjaman', $id)->with(['anggota', 'detail_pinjaman'])->first();
$detail_pinjaman = DetailPinjaman::where('id_pinjaman', $id)->with(['pinjaman', 'users'])->get();
$rowData = [];
if ($request->ajax()) {
foreach ($detail_pinjaman as $row) {
if ($row->status_pelunasan == 'Belum Lunas') {
if ($row->tanggal_jatuh_tempo < Carbon::now()) {
$row->status_pelunasan = 'Lewat Jatuh Tempo';
$row->save();
}
}
if ($row->status_pelunasan == 'Lewat Jatuh Tempo') {
if ($row->tanggal_jatuh_tempo > Carbon::now()) {
$row->status_pelunasan = 'Belum Lunas';
$row->save();
}
}
$pinjaman = $row->pinjaman;
$rowData[] = [
'DT_RowIndex' => $row->id_pinjaman,
'id_pinjaman' => $pinjaman->id_pinjaman,
'tanggal_jatuh_tempo' => $row->tanggal_jatuh_tempo,
'angsuran_ke_' => $row->angsuran_ke_,
'angsuran_pokok' => $row->angsuran_pokok,
'bunga' => $row->bunga,
'subtotal_angsuran' => $row->subtotal_angsuran,
'status_pelunasan' => $row->status_pelunasan,
'keterangan' => $row->keterangan
];
}
return DataTables::of($rowData)->toJson();
}
$angsuran = DetailPinjaman::where('id_pinjaman', $id)->first();
return view('pages.pinjaman.show', ['pinjaman' => $pinjaman, 'angsuran' => $angsuran]);
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Request $request)
{
return view('pages.pinjaman.edit');
}
public function dataLancar(Request $request)
{
$today = Carbon::now()->startOfDay();
$pinjaman = Pinjaman::whereHas('detail_pinjaman', function ($query) {
$query->where('status_pelunasan', 'Lewat Jatuh Tempo');
})->with('anggota')->get();
$rowData = [];
foreach ($pinjaman as $value) {
$jumlahTerlambat = $value->detail_pinjaman()->where('keterangan', 'Terlambat')->count();
$rowData[] = [
'DT_RowIndex' => $value->id_pinjaman,
'id_pinjaman' => $value->id_pinjaman,
'no_pinjaman' => $value->no_pinjaman,
'nama' => $value->anggota->nama,
'total_pinjaman' => $value->total_pinjaman,
'angsuran' => $value->angsuran,
'sisa_lancar_keseluruhan' => $value->sisa_lancar_keseluruhan,
'status_pinjaman' => $value->status_pinjaman,
'jumlah_terlambat' => $jumlahTerlambat,
];
}
return DataTables::of($rowData)->toJson();
}
public function dataDiragukan(Request $request)
{
$pinjaman = Pinjaman::whereHas('detail_pinjaman', function ($query) {
$query->where('status_pelunasan', 'Lewat Jatuh Tempo');
})->with('anggota')->get();
$rowData = [];
foreach ($pinjaman as $value) {
$jumlahTerlambat = $value->detail_pinjaman()->where('keterangan', 'Terlambat')->count();
$rowData[] = [
'DT_RowIndex' => $value->id_pinjaman,
'id_pinjaman' => $value->id_pinjaman,
'no_pinjaman' => $value->no_pinjaman,
'nama' => $value->anggota->nama,
'total_pinjaman' => $value->total_pinjaman,
'angsuran' => $value->angsuran,
'sisa_lancar_keseluruhan' => $value->sisa_lancar_keseluruhan,
'status_pinjaman' => $value->status_pinjaman,
'jumlah_terlambat' => $jumlahTerlambat,
];
}
return DataTables::of($rowData)->toJson();
}
public function dataMacet(Request $request)
{
$oneYearAgo = Carbon::now()->subYear();
$pinjaman = Pinjaman::whereHas('detail_pinjaman', function ($query) use ($oneYearAgo) {
$query->where('status_pelunasan', 'Lewat Jatuh Tempo')
->where('created_at', '<=', $oneYearAgo);
})->with('anggota')->get();
$rowData = [];
foreach ($pinjaman as $value) {
$jumlahTerlambat = $value->detail_pinjaman()->where('keterangan', 'Terlambat')->count();
$rowData[] = [
'DT_RowIndex' => $value->id_pinjaman,
'id_pinjaman' => $value->id_pinjaman,
'no_pinjaman' => $value->no_pinjaman,
'nama' => $value->anggota->nama,
'total_pinjaman' => $value->total_pinjaman,
'angsuran' => $value->angsuran,
'sisa_lancar_keseluruhan' => $value->sisa_lancar_keseluruhan,
'status_pinjaman' => $value->status_pinjaman,
'jumlah_terlambat' => $jumlahTerlambat,
];
}
return DataTables::of($rowData)->toJson();
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
$validator = Validator::make($request->all(), [
'angsuran' => 'required|numeric|min:1',
]);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
try {
DB::transaction(function () use ($request, $id) {
$pinjaman = Pinjaman::findOrFail($id);
if (!$pinjaman) {
throw new \Exception('Pinjaman tidak ditemukan. Silahkan coba kembali');
}
$angsuranDibayar = $request->input('angsuran');
$totalAngsuran = $pinjaman->detail_pinjaman()->where('status_pelunasan', '!=', 'Lunas')->count();
if ($angsuranDibayar > $totalAngsuran) {
throw new \Exception('Jumlah angsuran yang akan dibayar melebihi jumlah angsuran yang belum dilunasi');
}
$detailPinjaman = $pinjaman->detail_pinjaman()->where('status_pelunasan', '!=', 'Lunas')->orderBy('angsuran_ke_')->get();
foreach ($detailPinjaman as $index => $detail) {
if ($index < $angsuranDibayar) {
$today = Carbon::now();
$dueDate = Carbon::parse($detail->tanggal_jatuh_tempo);
if ($today->greaterThan($dueDate)) {
$detail->keterangan = 'Terlambat';
} else {
$detail->keterangan = 'Tepat Waktu';
}
$detail->status_pelunasan = 'Lunas';
if (!$detail->save()) {
throw new \Exception('Gagal menyimpan status pelunasan');
}
$history = new HistoryTransaksi();
$history->id_users = Auth::user()->id_users;
$history->id_anggota = $pinjaman->id_anggota;
$history->id_detail_pinjaman = $detail->id;
$history->tipe_transaksi = 'Pemasukan';
if (!$history->save()) {
throw new \Exception('Gagal menyimpan history transaksi');
}
$laporan = new Laporan();
$laporan->id_detail_pinjaman = $detail->id;
$laporan->keterangan = 'Pendapatan Bunga';
$laporan->klasifikasi = 'Pendapatan';
$laporan->jumlah_uang = $detail->bunga;
if (!$laporan->save()) {
throw new \Exception('Gagal menyimpan laporan');
}
} else {
break;
}
}
$subtotal_angsuran = $pinjaman->detail_pinjaman()->where('status_pelunasan', 'Lunas')->first();
if ($subtotal_angsuran) {
$totalDibayar = $subtotal_angsuran->subtotal_angsuran * $angsuranDibayar;
$pinjaman->sisa_lancar_keseluruhan -= $totalDibayar;
$pinjaman->save();
} else {
throw new \Exception('Gagal memperbarui status pinjaman');
}
});
$pinjaman = Pinjaman::findOrFail($id);
$sisaAngsuran = $pinjaman->detail_pinjaman()->where('status_pelunasan', 'Belum Lunas')->count();
if ($sisaAngsuran == 0) {
$pinjaman->status_pinjaman = 'Lunas';
$pinjaman->save();
}
return back()->with(['success' => 'Pelunasan berhasil. Sisa angsuran yang belum dilunasi kurang ' . $sisaAngsuran . 'X']);
} catch (\Exception $e) {
return back()->withErrors(['error' => $e->getMessage()]);
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
$pinjaman = Pinjaman::where('id_pinjaman', $id)->first();
$pinjaman->delete();
return redirect()->route('pinjaman')->with('success', 'Pinjaman berhasil dihapus');
}
public function export($id)
{
$data = Pinjaman::find($id);
$dataAnggota = anggota::where('id_anggota', $data->id_anggota)->first();
if ($data) {
$pinjaman = Pinjaman::where('id_pinjaman', $id)->with(['anggota', 'detail_pinjaman'])->get();
$detail_pinjaman = DetailPinjaman::where('id_pinjaman', $id)->with(['pinjaman', 'users'])->get();
$angsuran = DetailPinjaman::where('id_pinjaman', $id)->first();
$html = view('pages.report.pinjaman', [
'pinjaman' => $pinjaman,
'detailPinjaman' => $detail_pinjaman,
'angsuran' => $angsuran,
'id' => $id
])->render();
$options = new Options();
$options->set('isHtml5ParserEnabled', true);
$options->set('isRemoteEnabled', true);
$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'landscape');
$dompdf->render();
$dompdf->stream('Pinjaman_' . $dataAnggota->nama . '.pdf');
} else {
return back()->withErrors(['error' => 'Data Pinjaman masih kosong. Silahkan coba kembali.']);
}
}
private function generateMemberNumber()
{
$currentDate = now();
$dateString = $currentDate->format('dmY');
$randomNumber = '';
for ($i = 0; $i < 6; $i++) {
$randomNumber .= mt_rand(0, 9);
}
$memberNumber = 'P' . $dateString . $randomNumber;
return $memberNumber;
}
private function hitungKas()
{
$setor = DetailSimpanan::where('jenis_transaksi', 'Setor')->get();
$simpanan_pokok = $setor->sum('simpanan_pokok');
$simpanan_wajib = $setor->sum('simpanan_wajib');
$simpanan_sukarela = $setor->sum('simpanan_sukarela');
$detail_pinjaman = DetailPinjaman::where('status_pelunasan', 'Lunas')->get();
$angsuran_pokok = $detail_pinjaman->sum('angsuran_pokok');
$pemasukan = $simpanan_pokok + $simpanan_wajib + $simpanan_sukarela + $angsuran_pokok;
$tarik = DetailSimpanan::where('jenis_transaksi', 'Tarik')->get();
$totalPenarikanPokok = $tarik->sum('simpanan_pokok');
$totalPenarikanWajib = $tarik->sum('simpanan_wajib');
$totalPenarikanSukarela = $tarik->sum('simpanan_sukarela');
$pinjaman = Pinjaman::where('tanggal_realisasi', '!=', null)->get();
$total_pinjaman = $pinjaman->sum('total_pinjaman');
$pengeluaran = $totalPenarikanPokok + $totalPenarikanWajib + $totalPenarikanSukarela + $total_pinjaman;
$pendapatan = abs($pemasukan - $pengeluaran);
return $pendapatan;
}
}