resolved conflicts

This commit is contained in:
2025-03-31 03:46:05 +03:00
6454 changed files with 1520539 additions and 9 deletions
@@ -0,0 +1,13 @@
<?php
namespace Modules\Payroll\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
@@ -0,0 +1,139 @@
<?php
namespace Modules\Payroll\Http\Controllers;
use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Streamline\Models\PayrollCategory;
class PayrollCategoriesController extends Controller {
/**
* Display a listing of the resource.
*/
public function index() {
$categories = PayrollCategory::orderBy('name', 'asc')
->paginate(50);
return view('payroll::payroll_categories.index', compact('categories'));
}
/**
* Show the form for creating a new resource.
*/
public function create() {
return view('payroll::payroll_categories.create');
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request) {
//validation passed
$category = new PayrollCategory;
$logged_in_user_id = Auth::user()->id;
$category->name = $request->name;
$category->created_by = $logged_in_user_id;
$category->updated_by = $logged_in_user_id;
try {
$category->save();
flash("Category has been saved")->success();
return redirect("/payroll_categories/");
} catch (QueryException $e) {
flash("An error occurred. Please try again later")->error();
return back()->withInput();
}
}
/**
* Display the specified resource.
*/
public function show($id) {
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit($id) {
$category = PayrollCategory::where(['id' => $id])->first();
if (!$category) {
flash()->error("Category not found");
return redirect('/payroll_categories/');
} else {
return view('payroll::payroll_categories.edit', compact('category'));
}
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, $id) {
request()->validate([
'name' => 'required'
]);
//validation passed
$category = PayrollCategory::find($id);
$category->name = $request->name;
try {
$category->save();
flash("Category has been updated")->success();
return redirect("/payroll_categories/");
} catch (QueryException $e) {
flash("An error occurred. Please try again later")->error();
return back()->withInput();
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy($id) {
$category = PayrollCategory::find($id);
if ($category->delete()) {
flash("Category has been deleted.")->success();
} else {
flash('An error occurred. Please again later.');
}
return redirect('/payroll_categories/');
}
/**
* Display a listing of the inactive resource(s).
*/
public function inactive() {
$categories = PayrollCategory::onlyTrashed()
->orderBy('name')
->paginate(50);
if (count($categories) < 1) {
flash()->error("There is no inactive category");
return redirect('/payroll_categories/');
} else {
return view('payroll::payroll_categories.inactive', compact('categories'));
}
}
/**
* Activate the specified resource in storage.
*/
public function activate($id) {
$category = PayrollCategory::withTrashed()->find($id);
if($category->restore()){
flash("Category has been activated.")->success();
return redirect('/payroll_categories/inactive');
} else {
flash('An error occurred. Please again later.');
return redirect('/payroll_categories/');
}
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,68 @@
<?php
namespace Modules\Payroll\Http\Controllers;
use Illuminate\Http\Request;
use Streamline\Models\PayrollDefault;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Database\QueryException;
class PayrollDefaultsController extends Controller{
public function __construct() {
$this->middleware('auth');
$this->middleware('permission:nssf-rate-edit', ['only' => ['edit_nssf_rate', 'save_nssf_rate']]);
$this->middleware('permission:tax-rate-edit', ['only' => ['edit_tax_rate', 'save_tax_rate']]);
}
// edit the nssf rate
public function edit_nssf_rate(){
$nssf_rate = PayrollDefault::where(['id' => 1])->first();
return view('payroll::payroll_defaults.edit_nssf_rate', compact('nssf_rate'));
}
// save the nssf rate
public function save_nssf_rate(Request $request){
$nssf_rate = PayrollDefault::find(1);
$nssf_rate->nssf_rate = $request->nssf_rate;
$nssf_rate->updated_by = Auth::user()->id;
try {
$nssf_rate->save();
flash("Social security rate has been edited successfully.")->success();
return redirect('/payroll_defaults/edit_nssf_rate');
} catch (QueryException $e) {
flash('An error occurred. Please try again later')->error();
return back()->withInput();
}
}
public function edit_tax_rate() {
$tax_rate_record = PayrollDefault::where(['id' => 1])->first();
return view('payroll::payroll_defaults.edit_tax_rate', compact('tax_rate_record'));
}
public function save_tax_rate(Request $request) {
$tax_rate_record = PayrollDefault::find(1);
$tax_rate_record->tax_from = json_encode($request->from);
$tax_rate_record->tax_to = json_encode($request->to);
$tax_rate_record->tax_rate = json_encode($request->tax_rate);
$tax_rate_record->updated_by = Auth::user()->id;
try {
$tax_rate_record->save();
flash("Tax rate has been edited successfully.")->success();
return redirect('/payroll_defaults/edit_tax_rate');
} catch (QueryException $e) {
flash('An error occurred. Please try again later')->error();
return back()->withInput();
}
}
}
@@ -0,0 +1,139 @@
<?php
namespace Modules\Payroll\Http\Controllers;
use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Streamline\Models\PayrollSalaryScale;
class PayrollSalaryScaleController extends Controller {
/**
* Display a listing of the resource.
*/
public function index() {
$scales = PayrollSalaryScale::orderBy('name', 'asc')
->paginate(50);
return view('payroll::payroll_salary_scales.index', compact('scales'));
}
/**
* Show the form for creating a new resource.
*/
public function create() {
return view('payroll::payroll_salary_scales.create');
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request) {
//validation passed
$scale = new PayrollSalaryScale;
$logged_in_user_id = Auth::user()->id;
$scale->name = $request->name;
$scale->created_by = $logged_in_user_id;
$scale->updated_by = $logged_in_user_id;
try {
$scale->save();
flash("Salary Scale has been saved")->success();
return redirect("/payroll_salary_scales/");
} catch (QueryException $e) {
flash("An error occurred. Please try again later")->error();
return back()->withInput();
}
}
/**
* Display the specified resource.
*/
public function show($id) {
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit($id) {
$scale = PayrollSalaryScale::where(['id' => $id])->first();
if (!$scale) {
flash()->error("Salary Scale not found");
return redirect('/payroll_salary_scales/');
} else {
return view('payroll::payroll_salary_scales.edit', compact('scale'));
}
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, $id) {
request()->validate([
'name' => 'required'
]);
//validation passed
$scale = PayrollSalaryScale::find($id);
$scale->name = $request->name;
try {
$scale->save();
flash("Salary Scale has been updated")->success();
return redirect("/payroll_salary_scales/");
} catch (QueryException $e) {
flash("An error occurred. Please try again later")->error();
return back()->withInput();
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy($id) {
$scale = PayrollSalaryScale::find($id);
if ($scale->delete()) {
flash("Salary Scale has been deleted.")->success();
} else {
flash('An error occurred. Please again later.');
}
return redirect('/payroll_salary_scales/');
}
/**
* Display a listing of the inactive resource(s).
*/
public function inactive() {
$scales = PayrollSalaryScale::onlyTrashed()
->orderBy('name')
->paginate(50);
if (count($scales) < 1) {
flash()->error("There is no inactive salary scale");
return redirect('/payroll_salary_scales/');
} else {
return view('payroll::payroll_salary_scales.inactive', compact('scales'));
}
}
/**
* Activate the specified resource in storage.
*/
public function activate($id) {
$scale = PayrollSalaryScale::withTrashed()->find($id);
if($scale->restore()){
flash("Salary Scale has been activated.")->success();
return redirect('/payroll_salary_scales/inactive');
} else {
flash('An error occurred. Please again later.');
return redirect('/payroll_salary_scales/');
}
}
}
@@ -0,0 +1,205 @@
<?php
namespace Modules\Payroll\Http\Controllers;
use Barryvdh\Snappy\Facades\SnappyPdf;
use Carbon\Carbon;
use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Streamline\Models\ChartOfAccount;
use Streamline\Models\PayrollAllowancesOrDeduction;
use Streamline\Models\PayrollCategory;
use Streamline\Models\PayrollSchedule;
class PayrollScheduleController extends Controller {
public function index() {
$schedules = PayrollSchedule::get();
return view('payroll::payroll_schedule.index', compact('schedules'));
}
public function create(Request $request) {
$employees = [];
if (isset($request->payroll_category)) {
if ($request->payroll_category == 0) {
$employees = DB::table('payrolls')
->join('patients', 'payrolls.patient_id', '=', 'patients.id')
->get(['payrolls.*', 'patients.first_name', 'patients.last_name', 'patients.number']);
} else {
$employees = DB::table('payrolls')
->join('patients', 'payrolls.patient_id', '=', 'patients.id')
->where('payroll_category', $request->payroll_category)
->get(['payrolls.*', 'patients.first_name', 'patients.last_name', 'patients.number']);
}
}
$months = array(
'-select-', 'January' => 'January', 'February' => 'February', 'March' => 'March',
'April' => 'April', 'May' => 'May', 'June' => 'June', 'July' => 'July',
'August' => 'August', 'September' => 'September', 'October' => 'October',
'November' => 'November', 'December' => 'December'
);
$years = ['' => '-select-'];
$end_year = date('Y');
$start_year = $end_year - 10;
// create array with all the years in between
$years_range = range($end_year, $start_year);
// add to years array to be returned to view
foreach ($years_range as $year) {
$years[$year] = $year;
}
$payroll_categories = PayrollCategory::pluck('name', 'id')->toArray();
$payroll_categories = [0 => 'All Categories'] + $payroll_categories;
$expense_accounts = ChartOfAccount::where('type', 2)->pluck('name', 'id')->toArray();
$expense_accounts = ['' => '- select -'] + $expense_accounts;
$payable_accounts = ChartOfAccount::whereIn('type', [6, 9])->pluck('name', 'id')->toArray();
$payable_accounts = ['' => '- select -'] + $payable_accounts;
return view('payroll::payroll_schedule.create', compact('employees', 'years', 'months', 'payroll_categories', 'expense_accounts', 'payable_accounts'));
}
public function save_schedule(Request $request) {
request()->validate([
'name' => 'required',
'pay_year' => 'required',
'pay_month' => 'required',
'due_date' => 'required',
'employee_id' => 'required'
]);
$logged_in_user_id = Auth::user()->id;
$basic_pay_arr = $request->basic_pay;
$allowance_arr = $request->allowance;
$gross_pay_arr = $request->gross_pay;
$tax_arr = $request->tax;
$social_security_arr = $request->social_security;
$deductions_arr = $request->deductions;
$total_deductions_arr = $request->total_deductions;
$net_pay_arr = $request->net_pay;
$employee_id_arr = $request->employee_id;
$payroll_category_arr = $request->payroll_category;
$allow_deduct_ids_arr = array_merge($request->allowances_arr, $request->deductions_arr);
foreach ($allow_deduct_ids_arr as $records) {
if ($records) {
$exploded_records = explode(",", $records);
foreach ($exploded_records as $record) {
$allow_deduct = DB::table('payroll_allowances_or_deductions')->where('id', $record)->first();
$are_dates_past = !$allow_deduct->recurring_final_date || Carbon::today()->isAfter(Carbon::createFromFormat('Y-m-d', $allow_deduct->recurring_final_date));
if ($allow_deduct && ($allow_deduct->recurring == 0 || $are_dates_past)) {
DB::table('payroll_allowances_or_deductions')->where('id', $record)->update(['billed' => 1]);
}
}
}
}
$schedule = new PayrollSchedule();
$schedule->name = $request->name;
$schedule->pay_year = $request->pay_year;
$schedule->pay_month = $request->pay_month;
$schedule->salaries_expense_account = $request->salaries_expense_account;
$schedule->salaries_payable_account = $request->salaries_payable_account;
$schedule->tax_expense_account = $request->tax_expense_account;
$schedule->tax_payable_account = $request->tax_payable_account;
$schedule->due_date = Carbon::createFromFormat('d/m/Y', $request->due_date)->toDateString();
$schedule->social_security_expense_account = $request->social_security_expense_account;
$schedule->social_security_payable_account = $request->social_security_payable_account;
$schedule->memo = $request->memo;
$schedule->employee_id = implode(',', $employee_id_arr);
$schedule->payroll_category = implode(',', $payroll_category_arr);
$schedule->basic_pay = implode(',', $basic_pay_arr);
$schedule->allowances = implode(',', $allowance_arr);
$schedule->gross_pay = implode(',', $gross_pay_arr);
$schedule->tax_amount = implode(',', $tax_arr);
$schedule->social_security_amount = implode(',', $social_security_arr);
$schedule->deductions = implode(',', $deductions_arr);
$schedule->total_deductions = implode(',', $total_deductions_arr);
$schedule->net_pay = implode(',', $net_pay_arr);
$schedule->created_by = $logged_in_user_id;
$schedule->updated_by = $logged_in_user_id;
try {
$schedule->save();
flash("Payroll Schedule has been saved")->success();
return redirect("/payroll_schedules/index");
} catch (QueryException $e) {
flash('An error occurred. Please try again later')->error();
return back()->withInput();
}
}
public function get_allowance_deductions_details(Request $request) {
$items = explode(',', $request->ids);
$records = PayrollAllowancesOrDeduction::whereIn('id', $items)->get();
$html = '';
foreach ($records as $record) {
$html .= "<tr>";
if($record->type == 0) {
$html .= '<td>' . __('payroll.allowance') . '</td>';
} else {
$html .= '<td>' . __('payroll.deduction') . '</td>';
}
$html .= '<td>' . ugandan_shillings($record->amount) . '</td>';
$html .= '<td>' . ($record->recurring == 0 ? 'No' : 'Yes') . '</td>';
$html .= '<td>' . ($record->recurring_final_date ? streamline_date($record->recurring_final_date) : 'N/A') . '</td>';
$html .= '<td>' . $record->reason . '</td>';
$html .= '<td>' . get_full_name($record->created_by, 'id', 'first_name', 'last_name', 'users') . '</td>';
$html .= '<td>' . streamline_date_time($record->created_at) . '</td>';
$html .= "</tr>";
}
return $html;
}
public function details($id) {
$schedule = PayrollSchedule::find($id);
$payroll_categories = PayrollCategory::pluck('name', 'id')->toArray();
$expense_accounts = ChartOfAccount::where('type', 2)->pluck('name', 'id')->toArray();
$payable_accounts = ChartOfAccount::whereIn('type', [6, 9])->pluck('name', 'id')->toArray();
return view('payroll::payroll_schedule.details', compact('schedule', 'payroll_categories', 'payable_accounts', 'expense_accounts'));
}
public function print_details($id) {
$schedule = PayrollSchedule::find($id);
$payroll_categories = PayrollCategory::pluck('name', 'id')->toArray();
$expense_accounts = ChartOfAccount::where('type', 2)->pluck('name', 'id')->toArray();
$payable_accounts = ChartOfAccount::whereIn('type', [6, 9])->pluck('name', 'id')->toArray();
$data = [
'schedule' => $schedule,
'payroll_categories' => $payroll_categories,
'expense_accounts' => $expense_accounts,
'payable_accounts' => $payable_accounts,
];
$pdf = SnappyPDF::loadView("payroll_schedule.print_details", $data)
->setOrientation('portrait')
->setPaper('a4')
->setOption('margin-bottom', 5)
->setOption('margin-top', 5)
->setOption('footer-html', '<i>Printed On ' . date('d-M-Y h:ia') . '</i>');
return $pdf->inline('Payroll Schedule Details.pdf');
}
}