309 lines
9.6 KiB
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');
|
|
}
|
|
} |