MIF_E31210257/bangunan testing/app/Http/Controllers/TransactionController.php

309 lines
9.6 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use DataTables;
use GuzzleHttp\Client;
use Carbon\Carbon;
use App\Models\{Transaksi, Produk, Jurnal, Supplier};
class TransactionController extends Controller
{
public function index(Request $request)
{
if ($request->ajax()) {
$data = Transaksi::select('*');
return Datatables::of($data)
->addIndexColumn()
->addColumn('name', function ($row) {
$product = Produk::find($row->id_product);
return $product ? $product->name : 'Product not found';
})
->addColumn('total', function ($row) {
return 'Rp. ' . number_format($row->total, 0, ',', '.');
})
->addColumn('payment_method', function ($row) {
return ucfirst($row->payment_method);
})
->addColumn('status', function ($row) {
return $row->status;
})
->addColumn('action', function ($row) {
$action = '';
if ($row->payment_method=="hutang" && $row->status == 'unpaid') {
$action = '<a href="'.route('transaksi.piutang', $row->id).'" class="btn btn-primary">Lunasi Hutang</a>';
} else {
$action = '<span class="badge badge-success">Lunas</span>';
}
return $action;
})
->rawColumns(['total', 'name', 'payment_method', 'status', 'action'])
->make(true);
}
$data = [
'subtitle' => 'Semua Transaksi',
'button' => true,
'module' => [
'url' => app_url('transaksi/create'),
'name' => 'Tambah Baru'
]
];
return view('admin.app.content.transaction.index', compact('data'));
}
public function create()
{
$data = [
'subtitle' => 'Tambah baru',
];
return view('admin.app.content.transaction.add', compact('data'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'id_product' => 'required',
'qty' => 'required',
'payment_method' => 'required',
]);
if ($validator->fails()) {
return redirect()->back()->withInput()->with('error', 'Unexpected error, please try again. code: ' . $validator->errors()->first());
}
$input = $request->all();
$check_product = Produk::where('id', $request->input('id_product'))->first();
if ($check_product) {
if ($check_product->stok < $input['qty']) {
return redirect()->back()->withInput()->with('error', 'Stok tidak cukup.');
}
$post = new Transaksi([
'id_product' => $input['id_product'],
'qty' => $input['qty'],
'total' => $input['qty'] * $check_product->price,
'payment_method' => $input['payment_method'],
]);
if ($post->save()) {
$check_product->stok -= $input['qty'];
$check_product->save();
$account_id = $input['payment_method'] === 'cash' ? 1 : 2; // ID akun 4 untuk Pendapatan, 6 untuk Hutang Usaha
$reff = $this->generateRandomString();
$addToJurnal = new Jurnal([
'keterangan' => 'Pembelian ' . $check_product->name,
'waktu_transaksi' => Carbon::now(),
'no_reff' => $reff,
'nominal' => $input['qty'] * $check_product->price,
'tipe' => 'd',
'id_akun' => $account_id,
]);
$addToJurnal->save();
$paymentJournal = new Jurnal([
'keterangan' => 'Pembayaran ' . $check_product->name,
'waktu_transaksi' => Carbon::now(),
'no_reff' => $reff,
'nominal' => $input['qty'] * $check_product->price,
'tipe' => 'k',
'id_akun' => 9,
]);
$paymentJournal->save();
return redirect()->route('transaksi')->with('success', 'Transaksi berhasil ditambahkan');
} else {
return redirect()->route('transaksi')->with('error', 'Transaksi gagal ditambahkan');
}
} else {
return redirect()->route('transaksi')->with('error', 'Product tidak ditemukan');
}
}
public function destroy($id)
{
// Cari data berdasarkan ID
$post = Transaksi::find($id);
// Jika data ditemukan
if ($post) {
// Hapus data dari database
$checkProduk = Produk::where('id', $post->id_product)->first();
$checkJurnal = Jurnal::where('keterangan', 'LIKE', '%Pembelian ' . $checkProduk->name . '%')->first();
if($checkJurnal) $checkJurnal->delete();
$post->delete();
return redirect()->route('produk')->with('success', 'Data deleted successfully');
} else {
return redirect()->route('produk')->with('error', 'Data not found');
}
}
function generateRandomString($length = 10)
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, strlen($characters) - 1)];
}
return $randomString;
}
public function bayar_hutang($id)
{
// Cari transaksi berdasarkan ID
$supplier = Supplier::find($id);
// Jika supplier tidak ditemukan atau sudah lunas
if (!$supplier || $supplier->status == 'paid') {
return redirect()->route('suppliers.index')->with('error', 'Supplier tidak ditemukan atau sudah lunas');
}
// Update status transaksi menjadi lunas
$supplier->status = 'paid';
$supplier->save();
// Tambahkan entri jurnal untuk pelunasan hutang
$reff = $this->generateRandomString();
$paymentJournal = new Jurnal([
'keterangan' => 'Pelunasan Hutang ' . $supplier->nama_produk,
'waktu_transaksi' => Carbon::now(),
'no_reff' => $reff,
'nominal' => ($supplier->jumlah*$supplier->harga),
'tipe' => 'd',
'id_akun' => 14, // ID akun untuk Hutang Usaha
]);
$paymentJournal->save();
$paymentJournal2 = new Jurnal([
'keterangan' => 'Pelunasan Hutang ' . $supplier->nama_produk,
'waktu_transaksi' => Carbon::now(),
'no_reff' => $reff,
'nominal' => ($supplier->jumlah*$supplier->harga),
'tipe' => 'k',
'id_akun' => 1, // ID akun untuk Hutang Usaha
]);
$paymentJournal2->save();
return redirect()->route('suppliers.index')->with('success', 'Hutang berhasil dilunasi');
}
public function bayar_piutang($id)
{
// Cari transaksi berdasarkan ID
$transaction = Transaksi::select('tbl_transaksi.*', 'tbl_produk.name')->leftJoin('tbl_produk', 'id_product', 'tbl_produk.id')
->where('tbl_transaksi.id', $id)->first();
// Jika transaction tidak ditemukan atau sudah lunas
if (!$transaction || $transaction->status == 'paid') {
return redirect()->route('transaksi')->with('error', 'Trabsaksi tidak ditemukan atau sudah lunas');
}
// Update status transaksi menjadi lunas
$transaction->status = 'paid';
$transaction->save();
// Tambahkan entri jurnal untuk pelunasan hutang
$reff = $this->generateRandomString();
$paymentJournal = new Jurnal([
'keterangan' => 'Pembayaran Piutang ' . $transaction->name,
'waktu_transaksi' => Carbon::now(),
'no_reff' => $reff,
'nominal' => ($transaction->total),
'tipe' => 'd',
'id_akun' => 1,
]);
$paymentJournal->save();
$paymentJournal2 = new Jurnal([
'keterangan' => 'Pembayaran Piutang ' . $transaction->name,
'waktu_transaksi' => Carbon::now(),
'no_reff' => $reff,
'nominal' => ($transaction->total),
'tipe' => 'k',
'id_akun' => 2,
]);
$paymentJournal2->save();
return redirect()->route('transaksi')->with('success', 'Piutang berhasil dibayar');
}
public function beban(Request $request)
{
$data = [
'subtitle' => 'Beban Operasional',
'button' => true,
'module' => [
'url' => app_url('beban'),
'name' => 'Tambah Baru'
]
];
return view('admin.app.content.transaction.beban', compact('data'));
}
public function tambah_beban(Request $request)
{
$validator = Validator::make($request->all(), [
'keterangan' => 'required',
'nominal' => 'required',
]);
if ($validator->fails()) {
return redirect()->back()->withInput()->with('error', 'Unexpected error, please try again. code: ' . $validator->errors()->first());
}
$input = $request->all();
$reff = $this->generateRandomString();
$addToJurnal = new Jurnal([
'keterangan' => $input['keterangan'],
'waktu_transaksi' => Carbon::now(),
'no_reff' => $reff,
'nominal' => $input['nominal'],
'tipe' => 'd',
'id_akun' => 15,
]);
$addToJurnal->save();
$paymentJournal = new Jurnal([
'keterangan' => $input['keterangan'],
'waktu_transaksi' => Carbon::now(),
'no_reff' => $reff,
'nominal' => $input['nominal'],
'tipe' => 'k',
'id_akun' => 1,
]);
$paymentJournal->save();
return redirect()->route('jurnal-umum')->with('success', 'Beban Operasional Berhasil Ditambahkan');
}
}