MIF_E31211949/app/Http/Controllers/SimpananController.php

582 lines
27 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Exports\ExportSimpananAnggota;
use App\Models\anggota;
use App\Models\DetailSimpanan;
use App\Models\HistoryTransaksi;
use App\Models\simpanan;
use App\Models\User;
use Dompdf\Dompdf;
use Dompdf\Options;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;
use Yajra\DataTables\DataTables;
class SimpananController extends Controller
{
public function index(Request $request)
{
$simpanan = simpanan::with('anggota')->get();
if ($request->ajax()) {
return DataTables::of($simpanan)
->addColumn('DT_RowIndex', function ($simpanan) {
return $simpanan->id_users;
})
->addColumn('no_anggota', function ($simpanan) {
return $simpanan->anggota->no_anggota;
})
->addColumn('jenis_anggota', function ($simpanan) {
return $simpanan->anggota->jenis_anggota;
})
->addColumn('nama', function ($simpanan) {
return $simpanan->anggota->nama;
})
->addColumn('alamat', function ($simpanan) {
return $simpanan->anggota->alamat;
})
->toJson();
}
return view('pages.simpanan.index');
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
return view('pages.simpanan.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',
'jenis_simpanan' => 'required|in:Simpanan Pokok,Simpanan Wajib,Simpanan Sukarela',
'nominal' => 'required|numeric|regex:/^\d+(\.\d{1,2})?$/'
]);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
$anggota = anggota::find($request->id_anggota);
if ($anggota->simpanan) {
return redirect()->back()->with(['error' => 'Anggota sudah memiliki simpanan.']);
}
try {
DB::transaction(function () use ($request) {
$simpanan = new Simpanan();
$simpanan->id_anggota = $request->id_anggota;
$simpanan->total_saldo = $request->nominal;
if ($simpanan->save()) {
$id_simpanan = $simpanan->id_simpanan;
$detail_simpanan = new DetailSimpanan();
$detail_simpanan->id_simpanan = $id_simpanan;
$detail_simpanan->id_users = Auth::id();
$detail_simpanan->jenis_transaksi = 'Setor';
$detail_simpanan->subtotal_saldo = $request->nominal;
if ($request->jenis_simpanan == 'Simpanan Pokok') {
if ($request->jenis_anggota == 'Pendiri') {
if ($request->nominal == 500000) {
$detail_simpanan->simpanan_pokok = $request->nominal;
} else {
throw new \Exception('Simpanan pokok anggota pendiri harus Rp. 500.000.');
}
} else {
if ($request->nominal == 100000) {
$detail_simpanan->simpanan_pokok = $request->nominal;
} else {
throw new \Exception('Simpanan pokok anggota biasa harus Rp. 100.000.');
}
}
} else {
throw new \Exception('Anggota belum memiliki simpanan pokok');
}
if (!$detail_simpanan->save()) {
throw new \Exception('Gagal menyimpan data detail simpanan.');
}
$history = new HistoryTransaksi();
$history->id_users = Auth::user()->id_users;
$history->id_anggota = $request->id_anggota;
$history->id_detail_simpanan = $detail_simpanan->id;
$history->tipe_transaksi = 'Pemasukan';
if (!$history->save()) {
throw new \Exception('Gagal menyimpan data history transaksi.');
}
} else {
throw new \Exception('Gagal menyimpan data simpanan.');
}
});
if (Auth::user()->id_role == 2) {
return redirect()->route('simpanan')->with('success', 'Data simpanan berhasil ditambahkan.');
} else {
return redirect()->route('pegawai.simpanan')->with('success', 'Data simpanan berhasil ditambahkan.');
}
} catch (\Exception $e) {
return back()->withErrors(['error' => $e->getMessage()]);
}
}
/**
* Display the specified resource.
*/
public function show(Request $request, string $id)
{
$simpanan = simpanan::where('id_simpanan', '=', $id)->with('anggota')->first();
$detail_simpanan = DetailSimpanan::where('id_simpanan', $id)->with(['simpanan'])->orderBy('created_at', 'desc')->get();
$setor = DetailSimpanan::where('id_simpanan', $id)
->where('jenis_transaksi', '=', 'Setor')
->get();
$tarik = DetailSimpanan::where('id_simpanan', $id)
->where('jenis_transaksi', '=', 'Tarik')
->get();
$totalSimpananPokok = $setor->sum('simpanan_pokok');
$totalSimpananWajib = $setor->sum('simpanan_wajib');
$totalSimpananSukarela = $setor->sum('simpanan_sukarela');
$totalPenarikanPokok = $tarik->sum('simpanan_pokok');
$totalPenarikanWajib = $tarik->sum('simpanan_wajib');
$totalPenarikanSukarela = $tarik->sum('simpanan_sukarela');
$totalSimpananPokok -= $totalPenarikanPokok;
$totalSimpananWajib -= $totalPenarikanWajib;
$totalSimpananSukarela -= $totalPenarikanSukarela;
$rowData = [];
if ($request->ajax()) {
foreach ($detail_simpanan as $row) {
$simpanan = $row->simpanan;
$anggota = $simpanan->anggota;
$rowData[] = [
'id' => $row->id,
'DT_RowIndex' => $row->id_simpanan,
'id_simpanan' => $simpanan->id_simpanan,
'jenis_anggota' => $anggota->jenis_anggota,
'total_saldo' => $simpanan->total_saldo,
'jenis_transaksi' => $row->jenis_transaksi,
'simpanan_pokok' => $row->simpanan_pokok,
'simpanan_wajib' => $row->simpanan_wajib,
'simpanan_sukarela' => $row->simpanan_sukarela,
'subtotal_saldo' => $row->subtotal_saldo,
'created_at' => $row->created_at->format('d-m-Y h:i:s')
];
}
return DataTables::of($rowData)->toJson();
}
return view('pages.simpanan.show', [
'simpanan' => $simpanan,
'total_simpanan_pokok' => $totalSimpananPokok,
'total_simpanan_wajib' => $totalSimpananWajib,
'total_simpanan_sukarela' => $totalSimpananSukarela
]);
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
return view('pages.simpanan.edit', compact($id));
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
if ($request->id_anggota == 'update_detail') {
$validator = Validator::make($request->all(), [
'jenis_transaksi' => 'required|in:Setor,Tarik',
'nominal_simpanan_pokok' => 'numeric|regex:/^\d+(\.\d{1,2})?$/',
'nominal_simpanan_wajib' => 'numeric|regex:/^\d+(\.\d{1,2})?$/',
'nominal_simpanan_sukarela' => 'numeric|regex:/^\d+(\.\d{1,2})?$/'
]);
if ($validator->fails()) {
return back()
->withErrors($validator)
->withInput();
}
$jenisAnggota = $request->jenis_anggota;
$jenisTransaksiLama = $request->jenis_lama;
$jenisTransaksi = $request->jenis_transaksi;
$subtotal_saldo = $request->subtotal_saldo_saat_ini;
$nominalBaruSimpananPokok = $request->nominal_simpanan_pokok;
$nominalBaruSimpananWajib = $request->nominal_simpanan_wajib;
$nominalBaruSimpananSukarela = $request->nominal_simpanan_sukarela;
$nominalLamaSimpananSukarela = $request->nominal_lama;
$targetRow = DetailSimpanan::where('id_simpanan', $id)->where('subtotal_saldo', $subtotal_saldo)->first();
$simpanan = simpanan::where('id_simpanan', $id)->first();
if ($targetRow) {
$dataDetailSimpanan = DetailSimpanan::where('id_simpanan', $id)->where('created_at', '>=', $targetRow->created_at)->get();
$simpananSukarelaSetor = DetailSimpanan::where('id_simpanan', '=', $id)
->where('jenis_transaksi', '=', 'Setor')
->sum('simpanan_sukarela');
$simpananSukarelaTarik = DetailSimpanan::where('id_simpanan', '=', $id)
->where('jenis_transaksi', '=', 'Tarik')
->sum('simpanan_sukarela');
$simpananSukarela = $simpananSukarelaSetor - $simpananSukarelaTarik;
// dd($dataDetailSimpanan);
foreach ($dataDetailSimpanan as $detailSimpanan) {
if ($request->nominal_simpanan_sukarela != 0 && $request->nominal_simpanan_wajib != 0) {
if ($jenisTransaksi == 'Setor') {
$simpanan_wajib = DetailSimpanan::where('id_simpanan', '=', $id)->whereNotNull('simpanan_wajib')->first('simpanan_wajib');
if ($simpanan_wajib) {
$simpanan_wajib_sebelum = $simpanan_wajib->simpanan_wajib;
if ($simpanan_wajib_sebelum > 0) {
if ($nominalBaruSimpananWajib == $simpanan_wajib_sebelum) {
$selisih = abs($nominalBaruSimpananSukarela - $nominalLamaSimpananSukarela);
if ($nominalBaruSimpananSukarela > $nominalLamaSimpananSukarela) {
$detailSimpanan->subtotal_saldo += $selisih;
} else {
$detailSimpanan->subtotal_saldo -= $selisih;
}
$targetRow->simpanan_wajib = $nominalBaruSimpananWajib;
$targetRow->simpanan_sukarela = $nominalBaruSimpananSukarela;
} else {
if ($nominalBaruSimpananWajib > $simpanan_wajib_sebelum) {
$targetRow->simpanan_wajib = $simpanan_wajib_sebelum;
$targetRow->simpanan_sukarela = $nominalBaruSimpananWajib - $simpanan_wajib_sebelum;
} else {
return back()->with('error', 'Simpanan Wajib harus senilai dengan setoran sebelumnya yaitu Rp ' . number_format($simpanan_wajib_sebelum, 2, ',', '.'));
}
}
} else {
$selisih = abs($nominalBaruSimpananSukarela - $nominalLamaSimpananSukarela);
if ($nominalBaruSimpananSukarela > $nominalLamaSimpananSukarela) {
$detailSimpanan->subtotal_saldo += $selisih;
} else {
$detailSimpanan->subtotal_saldo -= $selisih;
}
$targetRow->simpanan_wajib = $nominalBaruSimpananWajib;
$targetRow->simpanan_sukarela = $nominalBaruSimpananSukarela;
}
} else {
$selisih = abs($nominalBaruSimpananSukarela - $nominalLamaSimpananSukarela);
if ($nominalBaruSimpananSukarela > $nominalLamaSimpananSukarela) {
$detailSimpanan->subtotal_saldo += $selisih;
} else {
$detailSimpanan->subtotal_saldo -= $selisih;
}
$targetRow->simpanan_wajib = $nominalBaruSimpananWajib;
$targetRow->simpanan_sukarela = $nominalBaruSimpananSukarela;
}
} else {
if ($request->nominal_simpanan_wajib != 0) {
return back()->with('error', 'Simpanan wajib tidak bisa ditarik');
}
}
} elseif ($request->nominal_simpanan_sukarela != 0) {
if ($jenisTransaksi == 'Setor') {
$selisih = abs($nominalBaruSimpananSukarela - $nominalLamaSimpananSukarela);
if ($nominalBaruSimpananSukarela > $nominalLamaSimpananSukarela) {
$detailSimpanan->subtotal_saldo += $selisih;
} else {
$detailSimpanan->subtotal_saldo -= $selisih;
}
$targetRow->simpanan_sukarela = $nominalBaruSimpananSukarela;
} else {
if ($simpananSukarela > $nominalBaruSimpananSukarela) {
return back()->with('error', 'Jenis Transaksi berbeda');
} else {
return back()->with('error', 'Saldo Simpanan sukarela tidak cukup');
}
}
} elseif ($request->nominal_simpanan_wajib != 0) {
if ($nominalBaruSimpananSukarela) {
if ($nominalBaruSimpananSukarela == 0) {
$selisih = abs($nominalBaruSimpananSukarela - $nominalLamaSimpananSukarela);
if ($nominalBaruSimpananSukarela > $nominalLamaSimpananSukarela) {
$detailSimpanan->subtotal_saldo += $selisih;
} else {
$detailSimpanan->subtotal_saldo -= $selisih;
}
$targetRow->simpanan_sukarela = null;
}
} else {
if ($jenisTransaksi == 'Setor') {
return back()->with('error', 'Simpanan wajib sudah valid');
} else {
return back()->with('error', 'Simpanan wajib tidak bisa ditarik');
}
}
} else {
if ($jenisTransaksi == 'Setor') {
return back()->with('error', 'Simpanan pokok sudah valid');
} else {
return back()->with('error', 'Simpanan pokok tidak bisa ditarik');
}
}
$saved = $detailSimpanan->save();
if (!$saved) {
return back()->with('error', 'Gagal menyimpan perubahan pada DetailSimpanan.');
}
$dataUpdate[] = $detailSimpanan;
}
$dataUpdateRow[] = $targetRow;
$savedTargetRow = $targetRow->save();
if (!$savedTargetRow) {
return back()->with('error', 'Gagal menyimpan perubahan pada targetRow.');
}
$dataSubtotal = DetailSimpanan::orderBy('created_at', 'desc')
->first();
$simpanan->total_saldo = $dataSubtotal->subtotal_saldo;
$savedTotal = $simpanan->save();
if (!$savedTotal) {
return back()->with('error', 'Gagal menyimpan perubahan pada total saldo.');
}
if (Auth::user()->id_role == 2) {
return back()->with('success', 'Data detail simpanan berhasil diperbarui.');
} else {
return back()->with('success', 'Data detail simpanan berhasil diperbarui.');
}
} else {
return back()->with('error', 'Baris tidak ditemukan.');
}
} else {
$data = simpanan::find($id);
$detail_simpanan_sukarela = DetailSimpanan::where('id_simpanan', '=', $id)->sum('simpanan_sukarela');
if (!$data) {
return back()->with(['error' => 'Simpanan tidak ditemukan. Silahkan coba kembali']);
}
$validator = Validator::make($request->all(), [
'id_anggota' => 'required|exists:anggota,id_anggota',
'jenis_simpanan' => 'required|in:Simpanan Pokok,Simpanan Wajib,Simpanan Sukarela',
'nominal' => 'required|numeric|regex:/^\d+(\.\d{1,2})?$/'
]);
if ($validator->fails()) {
return back()
->withErrors($validator)
->withInput();
}
try {
$saldoSebelumSetoran = $data->total_saldo;
$jenisTransaksi = $request->jenis_transaksi;
$jenisSimpanan = $request->jenis_simpanan;
$jenisAnggota = $request->jenis_anggota;
if ($jenisTransaksi == 'Setor') {
$saldoSebelumSetoran += $request->nominal;
$data->total_saldo += $request->nominal;
} elseif ($jenisTransaksi == 'Tarik') {
if ($jenisSimpanan == 'Simpanan Sukarela' && $request->nominal > $detail_simpanan_sukarela) {
throw new \Exception('Transaksi gagal. Saldo sukarela tidak cukup');
}
$saldoSebelumSetoran -= $request->nominal;
$data->total_saldo -= $request->nominal;
}
DB::transaction(function () use ($data, $saldoSebelumSetoran, $jenisTransaksi, $jenisSimpanan, $request) {
$detail_simpanan = new DetailSimpanan();
$detail_simpanan->id_simpanan = $data->id_simpanan;
$detail_simpanan->id_users = Auth::id();
$detail_simpanan->jenis_transaksi = $jenisTransaksi;
$detail_simpanan->subtotal_saldo = $saldoSebelumSetoran;
if ($jenisSimpanan == 'Simpanan Wajib') {
$simpanan_wajib = DetailSimpanan::where('id_simpanan', '=', $data->id_simpanan)->whereNotNull('simpanan_wajib')->first('simpanan_wajib');
if ($simpanan_wajib) {
$simpanan_wajib_sebelum = $simpanan_wajib->simpanan_wajib;
if ($simpanan_wajib_sebelum > 0) {
if ($request->nominal == $simpanan_wajib_sebelum) {
$detail_simpanan->simpanan_wajib = $request->nominal;
} else {
if ($request->nominal > $simpanan_wajib_sebelum) {
$detail_simpanan->simpanan_wajib = $simpanan_wajib_sebelum;
$detail_simpanan->simpanan_sukarela = $request->nominal - $simpanan_wajib_sebelum;
} else {
throw new \Exception('Simpanan Wajib harus senilai dengan setoran sebelumnya yaitu Rp ' . number_format($simpanan_wajib_sebelum, 2, ',', '.'));
}
}
} else {
$detail_simpanan->simpanan_wajib = $request->nominal;
}
} else {
$detail_simpanan->simpanan_wajib = $request->nominal;
}
} else {
$detail_simpanan->simpanan_sukarela = $request->nominal;
}
if (!$data->save() || !$detail_simpanan->save()) {
throw new \Exception('Gagal menyimpan transaksi simpanan. Silahkan coba lagi');
}
$history = new HistoryTransaksi();
$history->id_users = Auth::user()->id_users;
$history->id_anggota = $request->id_anggota;
$history->id_detail_simpanan = $detail_simpanan->id;
if ($jenisTransaksi == 'Setor') {
$history->tipe_transaksi = 'Pemasukan';
} else {
$history->tipe_transaksi = 'Pengeluaran';
}
if (!$history->save()) {
throw new \Exception('Gagal menyimpan data history transaksi.');
}
});
if (Auth::user()->id_role == 2) {
return redirect()->route('simpanan')->with('success', 'Data simpanan berhasil disimpan.');
} else {
return redirect()->route('pegawai.simpanan')->with('success', 'Data simpanan berhasil disimpan.');
}
} catch (\Exception $e) {
return back()->withErrors(['error' => $e->getMessage()]);
}
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
$detail = simpanan::where('id_simpanan', $id)->first();
$detail->delete();
return redirect()->route('simpanan')->with('success', 'Simpanan berhasil dihapus');
}
/**
* Remove the specified resource from storage.
*/
public function destroyDetail(string $id)
{
$detail = DetailSimpanan::where('id', $id)->first();
if ($detail) {
$jenis_transaksi = $detail->jenis_transaksi;
$simpanan_pokok = $detail->simpanan_pokok;
$simpanan_wajib = $detail->simpanan_wajib;
if ($simpanan_pokok > 0) {
return back()->with('error', 'Simpanan Pokok tidak dapat dihapus.');
// } elseif ($simpanan_wajib > 0) {
// return back()->with('error', 'Simpanan Wajib tidak dapat dihapus.');
} else {
$simpanan = Simpanan::where('id_simpanan', $detail->id_simpanan)->first();
$saldoSebelum = 0.00;
$dataDetailSimpananSebelum = DetailSimpanan::where('id_simpanan', $detail->id_simpanan)
->where('created_at', '<', $detail->created_at)
->orderBy('created_at', 'desc')
->first();
if ($dataDetailSimpananSebelum) {
$saldoSebelum = $dataDetailSimpananSebelum->subtotal_saldo;
}
$detail->delete();
$detailSetelah = DetailSimpanan::where('id_simpanan', $detail->id_simpanan)
->where('created_at', '>', $detail->created_at)
->first();
$saldoSetelah = $saldoSebelum;
if ($detailSetelah) {
$saldoSetelah += $detailSetelah->simpanan_sukarela;
}
$detail->subtotal_saldo = $saldoSetelah;
$simpanan->total_saldo = $saldoSetelah;
$saved = $simpanan->save();
if ($saved) {
return back()->with('success', 'Data detail simpanan berhasil dihapus.');
} else {
return back()->with('error', 'Gagal menyimpan perubahan pada total saldo.');
}
}
} else {
return back()->with('error', 'Detail Simpanan tidak ditemukan.');
}
}
public function export($id)
{
$data = simpanan::find($id);
$dataAnggota = anggota::where('id_anggota', $data->id_anggota)->first();
if ($data) {
$simpanan = Simpanan::with(['anggota', 'detail_simpanan'])->where('id_simpanan', $id)->get();
$detail_simpanan = DetailSimpanan::where('id_simpanan', $id)->with(['simpanan'])->get();
$setor = DetailSimpanan::where('id_simpanan', $id)
->where('jenis_transaksi', '=', 'Setor')
->get();
$tarik = DetailSimpanan::where('id_simpanan', $id)
->where('jenis_transaksi', '=', 'Tarik')
->get();
$totalSimpananPokok = $setor->sum('simpanan_pokok');
$totalSimpananWajib = $setor->sum('simpanan_wajib');
$totalSimpananSukarela = $setor->sum('simpanan_sukarela');
$totalPenarikanPokok = $tarik->sum('simpanan_pokok');
$totalPenarikanWajib = $tarik->sum('simpanan_wajib');
$totalPenarikanSukarela = $tarik->sum('simpanan_sukarela');
$totalSimpananPokok -= $totalPenarikanPokok;
$totalSimpananWajib -= $totalPenarikanWajib;
$totalSimpananSukarela -= $totalPenarikanSukarela;
$html = view('pages.report.simpanan', [
'simpanan' => $simpanan,
'detailSimpanan' => $detail_simpanan,
'totalSimpananPokok' => $totalSimpananPokok,
'totalSimpananWajib' => $totalSimpananWajib,
'totalSimpananSukarela' => $totalSimpananSukarela,
'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('Simpanan_' . $dataAnggota->nama . '.pdf');
} else {
return back()->withErrors(['error' => 'Data Simpanan masih kosong. Silahkan coba kembali.']);
}
}
}