feat(payroll): membayar debt saat transaksi gaji

This commit is contained in:
Yoga Pangestu 2024-11-30 23:40:56 +07:00
parent 36408541c5
commit b9a61ee3eb
3 changed files with 80 additions and 15 deletions

View File

@ -38,10 +38,14 @@ public function store(DebtRequest $request): RedirectResponse
$barbershopId = Auth::user()->barbershop_id; $barbershopId = Auth::user()->barbershop_id;
$barbershop = Barbershop::findOrFail($barbershopId); $barbershop = Barbershop::findOrFail($barbershopId);
$user = User::findOrFail($validatedData['employee']); $user = User::findOrFail($validatedData['employee']);
$transaction = Transaction::where('user_id', $user->id)->where('is_paid', '0')->first();
$transactionAmount = $transaction ? $transaction->total : 0; if ($user->role_id === 4) {
$maxDebt = $user->base_salary + (0.5 * $transactionAmount); $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']) { if ($barbershop->cash < $validatedData['amount']) {
notify()->error('Kas tidak cukup untuk melakukan transaksi ini', 'Gagal'); notify()->error('Kas tidak cukup untuk melakukan transaksi ini', 'Gagal');
@ -50,7 +54,7 @@ public function store(DebtRequest $request): RedirectResponse
} }
if ($validatedData['amount'] > $maxDebt) { if ($validatedData['amount'] > $maxDebt) {
notify()->error('Jumlah utang tidak boleh lebih dari gaji pokok + 50% dari transaksi karyawan. Maksimal kasbon: '.formatToRupiah($maxDebt), 'Gagal'); notify()->error('Jumlah utang tidak boleh lebih dari gaji pokok + 50% dari transaksi. Maksimal utang: Rp '.number_format($maxDebt, 2), 'Gagal');
return back()->withInput(); return back()->withInput();
} }
@ -74,7 +78,12 @@ public function update(DebtRequest $request, Debt $debt): RedirectResponse
$barbershopId = Auth::user()->barbershop_id; $barbershopId = Auth::user()->barbershop_id;
$barbershop = Barbershop::findOrFail($barbershopId); $barbershop = Barbershop::findOrFail($barbershopId);
$user = User::findOrFail($debt->user_id); $user = User::findOrFail($debt->user_id);
$transaction = Transaction::where('user_id', $user->id)->where('is_paid', '0')->first();
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; $transactionAmount = $transaction ? $transaction->total : 0;
$maxDebt = $user->base_salary + (0.5 * $transactionAmount); $maxDebt = $user->base_salary + (0.5 * $transactionAmount);
@ -88,14 +97,13 @@ public function update(DebtRequest $request, Debt $debt): RedirectResponse
} }
if ($validatedData['amount'] > $maxDebt) { if ($validatedData['amount'] > $maxDebt) {
notify()->error('Jumlah utang tidak boleh lebih dari gaji pokok + 50% dari transaksi karyawan. Maksimal utang: Rp '.number_format($maxDebt, 2), 'Gagal'); notify()->error('Jumlah utang tidak boleh lebih dari gaji pokok + 50% dari transaksi. Maksimal utang: Rp '.number_format($maxDebt, 2), 'Gagal');
return back()->withInput(); return back()->withInput();
} }
DB::transaction(function () use ($validatedData, $debt, $barbershop, $amountDifference) { DB::transaction(function () use ($validatedData, $debt, $barbershop, $amountDifference) {
$debt->update([ $debt->update([
'user_id' => $validatedData['employee'],
'amount' => $validatedData['amount'], 'amount' => $validatedData['amount'],
]); ]);

View File

@ -4,6 +4,8 @@
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\Finance\PayrollRequest; use App\Http\Requests\Admin\Finance\PayrollRequest;
use App\Models\Barbershop;
use App\Models\Debt;
use App\Models\Payroll; use App\Models\Payroll;
use App\Models\Transaction; use App\Models\Transaction;
use App\Models\User; use App\Models\User;
@ -41,15 +43,28 @@ public function create(): View
public function store(PayrollRequest $request): RedirectResponse public function store(PayrollRequest $request): RedirectResponse
{ {
$validatedData = $request->validated(); $validatedData = $request->validated();
$barbershopId = Auth::user()->barbershop_id;
DB::transaction(function () use ($validatedData) { DB::transaction(function () use ($validatedData, $barbershopId) {
Payroll::create(array_merge($validatedData, [ Payroll::create(array_merge($validatedData, [
'user_id' => Auth::id(), 'user_id' => Auth::id(),
'employee_id' => $validatedData['employee'], 'employee_id' => $validatedData['employee'],
'barbershop_id' => Auth::user()->barbershop_id, 'barbershop_id' => $barbershopId,
])); ]));
Transaction::where('user_id', $validatedData['employee']) $totalDebt = Debt::where('user_id', $validatedData['employee'])
->where('is_paid', '0')
->sum('amount');
$barbershop = Barbershop::findOrFail($barbershopId);
if ($validatedData['cut'] > $totalDebt) {
$barbershop->increment('cash', $totalDebt);
} elseif ($validatedData['cut'] <= $totalDebt) {
$barbershop->increment('cash', $validatedData['cut']);
}
Debt::where('user_id', $validatedData['employee'])
->where('is_paid', '0') ->where('is_paid', '0')
->update(['is_paid' => '1']); ->update(['is_paid' => '1']);
}); });
@ -68,24 +83,63 @@ public function edit(Payroll $payroll): View
]); ]);
} }
public function update(Payroll $payroll, PayrollRequest $request): RedirectResponse public function update(PayrollRequest $request, Payroll $payroll): RedirectResponse
{ {
$validatedData = $request->validated(); $validatedData = $request->validated();
$barbershopId = Auth::user()->barbershop_id;
$payroll->update($validatedData); DB::transaction(function () use ($validatedData, $payroll, $barbershopId) {
$oldCut = $payroll->cut;
$newCut = $validatedData['cut'];
$cutDifference = $newCut - $oldCut;
notify()->success('Data berhasil diubah', 'Berhasil'); $totalDebt = Debt::where('user_id', $payroll->employee)
->where('is_paid', '0')
->sum('amount');
$payroll->update($validatedData);
if ($cutDifference > 0) {
$barbershop = Barbershop::findOrFail($barbershopId);
if ($newCut > $totalDebt) {
$barbershop->increment('cash', $totalDebt);
} elseif ($newCut <= $totalDebt) {
$barbershop->increment('cash', $newCut);
}
}
});
notify()->success('Data berhasil diperbarui', 'Berhasil');
return redirect('dashboard/finance/payrolls'); return redirect('dashboard/finance/payrolls');
} }
public function delete(Payroll $payroll): RedirectResponse public function delete(Payroll $payroll): RedirectResponse
{ {
$payroll->delete(); $barbershopId = Auth::user()->barbershop_id;
DB::transaction(function () use ($payroll, $barbershopId) {
$cut = $payroll->cut;
$totalDebt = Debt::where('user_id', $payroll->employee_id)
->where('is_paid', '0')
->sum('amount');
$payroll->delete();
$barbershop = Barbershop::findOrFail($barbershopId);
if ($cut > $totalDebt) {
$barbershop->increment('cash', $totalDebt);
} elseif ($cut <= $totalDebt) {
$barbershop->increment('cash', $cut);
}
});
notify()->success('Data berhasil dihapus', 'Berhasil'); notify()->success('Data berhasil dihapus', 'Berhasil');
return back(); return redirect('dashboard/finance/payrolls');
} }
public function getSalaryEmployee(string $employeeId): JsonResponse public function getSalaryEmployee(string $employeeId): JsonResponse
@ -108,6 +162,7 @@ public function getSalaryEmployee(string $employeeId): JsonResponse
} }
}) })
->sum('total'); ->sum('total');
$debt = Debt::where('user_id', $employeeId)->where('is_paid', '0')->sum('amount');
return response()->json([ return response()->json([
'status' => true, 'status' => true,
@ -115,6 +170,7 @@ public function getSalaryEmployee(string $employeeId): JsonResponse
'data' => [ 'data' => [
'baseSalary' => formatToRupiah($employee->base_salary), 'baseSalary' => formatToRupiah($employee->base_salary),
'shavingResults' => in_array($employee->role_id, [4, 5]) ? formatToRupiah($shavingResults) : 'Rp0', 'shavingResults' => in_array($employee->role_id, [4, 5]) ? formatToRupiah($shavingResults) : 'Rp0',
'debt' => formatToRupiah($debt),
], ],
]); ]);
} }

View File

@ -19,6 +19,7 @@ $(document).ready(function () {
success: function (response) { success: function (response) {
if (response.status) { if (response.status) {
$('#amount').val(response.data.baseSalary || '0'); $('#amount').val(response.data.baseSalary || '0');
$('#cut').val(response.data.debt || '0');
$('#shaving_result').val(response.data.shavingResults || '0'); $('#shaving_result').val(response.data.shavingResults || '0');
shavingResults = parseFloat(unformatRupiah(response.data.shavingResults)) || 0; shavingResults = parseFloat(unformatRupiah(response.data.shavingResults)) || 0;