mastercut/app/Http/Controllers/Admin/Finance/DebtController.php

136 lines
4.5 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers\Admin\Finance;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\Finance\DebtRequest;
use App\Models\Barbershop;
use App\Models\Debt;
use App\Models\Transaction;
use App\Models\User;
use App\Traits\UploadAttachment;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class DebtController extends Controller
{
use UploadAttachment;
public function index(): View
{
return view('pages.admin.finance.debts', [
'pageTitle' => 'Kasbon',
'debts' => Debt::with(['user', 'user.biography'])
->when(in_array(auth()->user()->role_id, [4, 5]), function ($query) {
return $query->where('user_id', auth()->id());
})
->latest()
->get(),
'employees' => User::with('biography')->barbershop()->latest()->get(),
]);
}
public function store(DebtRequest $request): RedirectResponse
{
$validatedData = $request->validated();
$barbershopId = Auth::user()->barbershop_id;
$barbershop = Barbershop::findOrFail($barbershopId);
$user = User::findOrFail($validatedData['employee']);
if ($user->role_id === 4) {
$transaction = Transaction::where('barbershop_id', $barbershopId)->where('is_paid', '0')->sum('total');
} else {
$transaction = Transaction::where('user_id', $user->id)->where('is_paid', '0')->sum('total');
}
$maxDebt = $user->base_salary + (0.5 * $transaction);
if ($barbershop->cash < $validatedData['amount']) {
notify()->error('Kas tidak cukup untuk melakukan transaksi ini', 'Gagal');
return back()->withInput();
}
if ($validatedData['amount'] > $maxDebt) {
notify()->error('Jumlah utang tidak boleh lebih dari gaji pokok + 50% dari transaksi. Maksimal utang: Rp '.number_format($maxDebt, 2), 'Gagal');
return back()->withInput();
}
DB::transaction(function () use ($validatedData, $barbershop) {
Debt::create([
'user_id' => $validatedData['employee'],
'amount' => $validatedData['amount'],
]);
$barbershop->decrement('cash', $validatedData['amount']);
});
notify()->success('Data berhasil ditambahkan', 'Berhasil');
return back();
}
public function update(DebtRequest $request, Debt $debt): RedirectResponse
{
$validatedData = $request->validated();
$barbershopId = Auth::user()->barbershop_id;
$barbershop = Barbershop::findOrFail($barbershopId);
$user = User::findOrFail($debt->user_id);
if ($user->role_id == 4) {
$transaction = Transaction::where('barbershop_id', $barbershopId)->where('is_paid', '0')->first();
} else {
$transaction = Transaction::where('user_id', $user->id)->where('is_paid', '0')->first();
}
$transactionAmount = $transaction ? $transaction->total : 0;
$maxDebt = $user->base_salary + (0.5 * $transactionAmount);
$amountDifference = $validatedData['amount'] - $debt->amount;
if ($amountDifference > 0 && $barbershop->cash < $amountDifference) {
notify()->error('Kas tidak cukup untuk menambah jumlah utang', 'Gagal');
return back()->withInput();
}
if ($validatedData['amount'] > $maxDebt) {
notify()->error('Jumlah utang tidak boleh lebih dari gaji pokok + 50% dari transaksi. Maksimal utang: Rp '.number_format($maxDebt, 2), 'Gagal');
return back()->withInput();
}
DB::transaction(function () use ($validatedData, $debt, $barbershop, $amountDifference) {
$debt->update([
'amount' => $validatedData['amount'],
]);
if ($amountDifference !== 0) {
$barbershop->decrement('cash', $amountDifference);
}
});
notify()->success('Data berhasil diperbarui', 'Berhasil');
return back();
}
public function delete(Debt $debt): RedirectResponse
{
$barbershopId = Auth::user()->barbershop_id;
$barbershop = Barbershop::findOrFail($barbershopId);
DB::transaction(function () use ($debt, $barbershop) {
$barbershop->increment('cash', $debt->amount);
$debt->delete();
});
notify()->success('Data berhasil dihapus', 'Berhasil');
return back();
}
}