220 lines
8.0 KiB
PHP
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
|
|
]
|
|
]);
|
|
}
|
|
}
|