Files
kulakpos_web/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollController.php
eko54r 3e1b64e008
Some checks failed
Build, Push and Deploy / build-and-push (push) Failing after 3m30s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 15s
Build, Push and Deploy / deploy-staging (push) Has been skipped
Build, Push and Deploy / deploy-production (push) Has been skipped
update addon HRM
2026-05-04 23:04:09 +07:00

220 lines
8.0 KiB
PHP

<?php
namespace Modules\HrmAddon\App\Http\Controllers;
use App\Models\Branch;
use App\Models\PaymentType;
use App\Models\Transaction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use App\Events\MultiPaymentProcessed;
use Modules\HrmAddon\App\Models\Payroll;
use Modules\HrmAddon\App\Models\Employee;
class AcnooPayrollController extends Controller
{
public function __construct()
{
$this->middleware('check.permission:payrolls.read')->only(['index']);
$this->middleware('check.permission:payrolls.create')->only(['store']);
$this->middleware('check.permission:payrolls.update')->only(['update']);
$this->middleware('check.permission:payrolls.delete')->only(['destroy', 'deleteAll']);
}
public function index(Request $request)
{
$employees = Employee::where('business_id', auth()->user()->business_id)->whereStatus('active')->latest()->get();
$payment_types = PaymentType::where('business_id', auth()->user()->business_id)->whereStatus(1)->latest()->get();
$payrolls = Payroll::with(['employee:id,name', 'payment_type:id,name', 'branch:id,name'])
->where('business_id', auth()->user()->business_id)
->when($request->branch_id, function ($q) use ($request) {
$q->where('branch_id', $request->branch_id);
})
->when($request->search, function ($query) use ($request) {
$search = $request->search;
$query->where(function ($query) use ($search) {
$query->where('puid', 'like', '%' . $search . '%')
->orWhere('amount', 'like', '%' . $search . '%')
->orWhereHas('employee', function ($q) use ($search) {
$q->where('name', 'like', '%' . $search . '%');
})
->orWhereHas('branch', function ($q) use ($search) {
$q->where('name', 'like', '%' . $search . '%');
})
->orWhereHas('payment_type', function ($q) use ($search) {
$q->where('name', 'like', '%' . $search . '%');
});
});
})
->when($request->employee, function ($query) use ($request) {
$employeeId = $request->employee;
$query->where('employee_id', $employeeId);
})
->when($request->filled('month'), function ($query) use ($request) {
$query->where('month', $request->month);
})
->latest()
->paginate($request->per_page ?? 20)->appends($request->query());
if ($request->ajax()) {
return response()->json([
'data' => view('hrmaddon::payrolls.datas', compact('payrolls'))->render()
]);
}
$branches = Branch::withTrashed()->where('business_id', auth()->user()->business_id)->latest()->get();
return view('hrmaddon::payrolls.index', compact('payrolls', 'employees', 'payment_types', 'branches'));
}
public function store(Request $request)
{
$request->validate([
'employee_id' => 'required|integer|exists:employees,id',
'payment_type_id' => 'required',
'month' => 'required|string',
'date' => 'nullable|date',
'amount' => 'required|numeric',
'note' => 'nullable|string',
'payemnt_year' => 'required|string',
]);
DB::beginTransaction();
try {
$exists = Payroll::where('employee_id', $request->employee_id)
->where('month', $request->month)
->where('payemnt_year', $request->payemnt_year)
->where('business_id', auth()->user()->business_id)
->exists();
if ($exists) {
return response()->json([
'message' => __('This employee has already been paid for this month and year.'),
], 422);
}
updateBalance($request->amount, 'decrement');
$payroll = Payroll::create($request->except('business_id', 'payment_type_id') + [
'business_id' => auth()->user()->business_id,
'payment_type_id' => $request->payment_type_id != 'cash' ? $request->payment_type_id : NULL,
]);
$payments = [['amount' => $request->amount, 'type' => $request->payment_type_id]];
// MultiPaymentProcessed Event
event(new MultiPaymentProcessed(
$payments,
$payroll->id,
'payroll',
$total_amount ?? 0,
));
DB::commit();
return response()->json([
'message' => __('Payroll created successfully'),
'redirect' => route('hrm.payrolls.index')
]);
} catch (\Exception $e) {
DB::rollback();
return response()->json(['message' => __('Somethings went wrong!')], 404);
}
}
public function update(Request $request, $id)
{
$request->validate([
'employee_id' => 'required|integer|exists:employees,id',
'payment_type_id' => 'required',
'date' => 'nullable|date',
'month' => 'required|string',
'amount' => 'required|numeric',
'note' => 'nullable|string',
'payemnt_year' => 'required|string',
]);
DB::beginTransaction();
try {
$business_id = auth()->user()->business_id;
$payroll = Payroll::where('business_id', $business_id)->findOrFail($id);
updateBalance($request->amount - $payroll->amount, 'decrement');
$payroll->update($request->except(['business_id', 'amount', 'payment_type_id']) + [
'payment_type_id' => $request->payment_type_id != 'cash' ? $request->payment_type_id : NULL
]);
// Delete old transactions
$transaction = Transaction::where('business_id', $business_id)
->where([
'platform' => 'payroll',
'reference_id' => $payroll->id
])
->first();
if ($transaction->bank_payment) {
PaymentType::find($transaction->payment_type_id)->decrement('balance', $transaction->amount);
}
$transaction->delete();
$payments = [['amount' => $request->amount, 'type' => $request->payment_type_id]];
// Process new payments
event(new MultiPaymentProcessed(
$payments,
$payroll->id,
'payroll',
$request->amount,
));
DB::commit();
return response()->json([
'message' => __('Payroll Updated successfully'),
'redirect' => route('hrm.payrolls.index')
]);
} catch (\Exception $e) {
DB::rollback();
return response()->json(['message' => $e->getMessage()], 404);
}
}
public function destroy($id)
{
$payroll = Payroll::findOrFail($id);
$payroll->delete();
return response()->json([
'message' => __('Payroll Deleted Successfully'),
'redirect' => route('hrm.payrolls.index')
]);
}
public function deleteAll(Request $request)
{
Payroll::whereIn('id', $request->input('ids'))->delete();
return response()->json([
'message' => __('All Payrolls deleted successfully'),
'redirect' => route('hrm.payrolls.index')
]);
}
public function getEmpAmount()
{
$employee = Employee::findOrFail(request('employee_id'));
return response()->json([
'data' => [
'amount' => $employee->amount
]
]);
}
}