%PDF- %GIF98; %PNG;
Server : ApacheSystem : Linux host.digitalbabaji.in 4.18.0-513.11.1.el8_9.x86_64 #1 SMP Wed Jan 17 02:00:40 EST 2024 x86_64 User : addictionfreeind ( 1003) PHP Version : 7.2.34 Disable Function : exec,passthru,shell_exec,system Directory : /home/addictionfreeind/public_html/admin1/app/Http/Controllers/ |
Upload File : |
<?php
namespace App\Http\Controllers;
use App\DataTables\ExpensesDataTable;
use App\Helper\Files;
use App\Helper\Reply;
use App\Http\Requests\Expenses\StoreExpense;
use App\Models\BankAccount;
use App\Models\Currency;
use App\Models\Expense;
use App\Models\ExpensesCategory;
use App\Models\ExpensesCategoryRole;
use App\Models\Project;
use App\Models\RoleUser;
use App\Models\User;
use App\Scopes\ActiveScope;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ExpenseController extends AccountBaseController
{
public function __construct()
{
parent::__construct();
$this->pageTitle = 'app.menu.expenses';
$this->middleware(function ($request, $next) {
abort_403(!in_array('expenses', $this->user->modules));
return $next($request);
});
}
public function index(ExpensesDataTable $dataTable)
{
$viewPermission = user()->permission('view_expenses');
abort_403(!in_array($viewPermission, ['all', 'added', 'owned', 'both']));
if (!request()->ajax()) {
$this->employees = User::allEmployees(null, true);
$this->projects = Project::allProjects();
$this->categories = ExpenseCategoryController::getCategoryByCurrentRole();
}
return $dataTable->render('expenses.index', $this->data);
}
public function changeStatus(Request $request)
{
abort_403(user()->permission('approve_expenses') != 'all');
$expenseId = $request->expenseId;
$status = $request->status;
$expense = Expense::findOrFail($expenseId);
$expense->status = $status;
$expense->save();
return Reply::success(__('messages.updateSuccess'));
}
public function show($id)
{
$this->expense = Expense::with(['user', 'project', 'category', 'transactions' => function($q){
$q->orderBy('id', 'desc')->limit(1);
}, 'transactions.bankAccount'])->findOrFail($id)->withCustomFields();
$this->viewPermission = user()->permission('view_expenses');
$viewProjectPermission = user()->permission('view_project_expenses');
$this->editExpensePermission = user()->permission('edit_expenses');
$this->deleteExpensePermission = user()->permission('delete_expenses');
abort_403(!($this->viewPermission == 'all'
|| ($this->viewPermission == 'added' && $this->expense->added_by == user()->id)
|| ($viewProjectPermission == 'owned' || $this->expense->user_id == user()->id)));
if ($this->expense->getCustomFieldGroupsWithFields()) {
$this->fields = $this->expense->getCustomFieldGroupsWithFields()->fields;
}
$this->pageTitle = $this->expense->item_name;
if (request()->ajax()) {
$html = view('expenses.ajax.show', $this->data)->render();
return Reply::dataOnly(['status' => 'success', 'html' => $html, 'title' => $this->pageTitle]);
}
$this->view = 'expenses.ajax.show';
return view('expenses.show', $this->data);
}
public function create()
{
$this->addPermission = user()->permission('add_expenses');
abort_403(!in_array($this->addPermission, ['all', 'added']));
$this->currencies = Currency::all();
$this->categories = ExpenseCategoryController::getCategoryByCurrentRole();
$this->linkExpensePermission = user()->permission('link_expense_bank_account');
$this->viewBankAccountPermission = user()->permission('view_bankaccount');
$bankAccounts = BankAccount::where('status', 1)->where('currency_id', company()->currency_id);
if($this->viewBankAccountPermission == 'added'){
$bankAccounts = $bankAccounts->where('added_by', user()->id);
}
$bankAccounts = $bankAccounts->get();
$this->bankDetails = $bankAccounts;
$this->companyCurrency = Currency::where('id', company()->currency_id)->first();
// Get only current login employee projects
if ($this->addPermission == 'added') {
$this->projects = Project::where('added_by', user()->id)->orWhereHas('projectMembers', function ($query) {
$query->where('user_id', user()->id);
})->get();
} else {
$this->projects = Project::all();
}
$this->pageTitle = __('modules.expenses.addExpense');
$this->projectId = request('project_id') ? request('project_id') : null;
if (!is_null($this->projectId)) {
$employees = Project::with('projectMembers')->where('id', $this->projectId)->first();
$this->projectName = $employees->project_name;
$this->employees = $employees->projectMembers;
} else {
$this->employees = User::allEmployees(null, true);
}
$expense = new Expense();
if ($expense->getCustomFieldGroupsWithFields()) {
$this->fields = $expense->getCustomFieldGroupsWithFields()->fields;
}
if (request()->ajax()) {
$html = view('expenses.ajax.create', $this->data)->render();
return Reply::dataOnly(['status' => 'success', 'html' => $html, 'title' => $this->pageTitle]);
}
$this->view = 'expenses.ajax.create';
return view('expenses.show', $this->data);
}
public function store(StoreExpense $request)
{
$userRole = session('user_roles');
$expense = new Expense();
$expense->item_name = $request->item_name;
$expense->purchase_date = Carbon::createFromFormat($this->company->date_format, $request->purchase_date)->format('Y-m-d');
$expense->purchase_from = $request->purchase_from;
$expense->price = round($request->price, 2);
$expense->currency_id = $request->currency_id;
$expense->category_id = $request->category_id;
$expense->user_id = $request->user_id;
$expense->default_currency_id = company()->currency_id;
$expense->exchange_rate = $request->exchange_rate;
$expense->description = trim_editor($request->description);
if ($userRole[0] == 'admin') {
$expense->status = 'approved';
$expense->approver_id = user()->id;
}
if ($request->has('status')) {
$expense->status = $request->status;
$expense->approver_id = user()->id;
}
if ($request->has('project_id') && $request->project_id != '0') {
$expense->project_id = $request->project_id;
}
if ($request->hasFile('bill')) {
$filename = Files::uploadLocalOrS3($request->bill, Expense::FILE_PATH);
$expense->bill = $filename;
}
$expense->bank_account_id = $request->bank_account_id;
$expense->save();
// To add custom fields data
if ($request->custom_fields_data) {
$expense->updateCustomFieldData($request->custom_fields_data);
}
$redirectUrl = urldecode($request->redirect_url);
if ($redirectUrl == '') {
$redirectUrl = route('expenses.index');
}
return Reply::successWithData(__('messages.recordSaved'), ['redirectUrl' => $redirectUrl]);
}
public function edit($id)
{
$this->expense = Expense::findOrFail($id)->withCustomFields();
$this->editPermission = user()->permission('edit_expenses');
abort_403(!($this->editPermission == 'all' || ($this->editPermission == 'added' && $this->expense->added_by == user()->id)));
$this->currencies = Currency::all();
$this->categories = ExpenseCategoryController::getCategoryByCurrentRole();
$this->employees = User::allEmployees();
$this->pageTitle = __('modules.expenses.updateExpense');
$this->linkExpensePermission = user()->permission('link_expense_bank_account');
$this->viewBankAccountPermission = user()->permission('view_bankaccount');
$bankAccounts = BankAccount::where('status', 1)->where('currency_id', $this->expense->currency_id);
if($this->viewBankAccountPermission == 'added'){
$bankAccounts = $bankAccounts->where('added_by', user()->id);
}
$bankAccounts = $bankAccounts->get();
$this->bankDetails = $bankAccounts;
$userId = $this->expense->user_id;
if (!is_null($userId)) {
$this->projects = Project::with('members')->whereHas('members', function ($q) use ($userId) {
$q->where('user_id', $userId);
})->get();
}
else {
$this->projects = Project::get();
}
$this->companyCurrency = Currency::where('id', company()->currency_id)->first();
$expense = new Expense();
if ($expense->getCustomFieldGroupsWithFields()) {
$this->fields = $expense->getCustomFieldGroupsWithFields()->fields;
}
if (request()->ajax()) {
$html = view('expenses.ajax.edit', $this->data)->render();
return Reply::dataOnly(['status' => 'success', 'html' => $html, 'title' => $this->pageTitle]);
}
$this->view = 'expenses.ajax.edit';
return view('expenses.show', $this->data);
}
public function update(StoreExpense $request, $id)
{
$expense = Expense::findOrFail($id);
$expense->item_name = $request->item_name;
$expense->purchase_date = Carbon::createFromFormat($this->company->date_format, $request->purchase_date)->format('Y-m-d');
$expense->purchase_from = $request->purchase_from;
$expense->price = round($request->price, 2);
$expense->currency_id = $request->currency_id;
$expense->user_id = $request->user_id;
$expense->category_id = $request->category_id;
$expense->default_currency_id = company()->currency_id;
$expense->exchange_rate = $request->exchange_rate;
$expense->description = trim_editor($request->description);
$expense->project_id = ($request->project_id > 0) ? $request->project_id : null;
if ($request->bill_delete == 'yes') {
Files::deleteFile($expense->bill, Expense::FILE_PATH);
$expense->bill = null;
}
if ($request->hasFile('bill')) {
Files::deleteFile($expense->bill, Expense::FILE_PATH);
$filename = Files::uploadLocalOrS3($request->bill, Expense::FILE_PATH);
$expense->bill = $filename;
}
if ($request->has('status')) {
$expense->status = $request->status;
}
$expense->bank_account_id = $request->bank_account_id;
$expense->save();
// To add custom fields data
if ($request->custom_fields_data) {
$expense->updateCustomFieldData($request->custom_fields_data);
}
return Reply::successWithData(__('messages.updateSuccess'), ['redirectUrl' => route('expenses.index')]);
}
public function destroy($id)
{
$this->expense = Expense::findOrFail($id);
$this->deletePermission = user()->permission('delete_expenses');
abort_403(!($this->deletePermission == 'all' || ($this->deletePermission == 'added' && $this->expense->added_by == user()->id)));
Expense::destroy($id);
return Reply::success(__('messages.deleteSuccess'));
}
/**
* XXXXXXXXXXX
*
* @return \Illuminate\Http\Response
*/
public function applyQuickAction(Request $request)
{
switch ($request->action_type) {
case 'delete':
$this->deleteRecords($request);
return Reply::success(__('messages.deleteSuccess'));
case 'change-status':
$this->changeBulkStatus($request);
return Reply::success(__('messages.updateSuccess'));
default:
return Reply::error(__('messages.selectAction'));
}
}
protected function deleteRecords($request)
{
abort_403(user()->permission('delete_employees') != 'all');
Expense::withoutGlobalScope(ActiveScope::class)->whereIn('id', explode(',', $request->row_ids))->delete();
}
protected function changeBulkStatus($request)
{
abort_403(user()->permission('edit_employees') != 'all');
Expense::withoutGlobalScope(ActiveScope::class)->whereIn('id', explode(',', $request->row_ids))->update(['status' => $request->status]);
}
protected function getEmployeeProjects(Request $request)
{
// Get employee category
if (!is_null($request->userId)) {
$categories = ExpensesCategory::with('roles')->whereHas('roles', function($q) use ($request) {
$user = User::findOrFail($request->userId);
$roleId = (count($user->role) > 1) ? $user->role[1]->role_id : $user->role[0]->role_id;
$q->where('role_id', $roleId);
})->get();
}
else {
$categories = ExpensesCategory::get();
}
if($categories) {
foreach ($categories as $category) {
$selected = $category->id == $request->categoryId ? 'selected' : '';
$categories .= '<option value="' . $category->id . '"'.$selected.'>' . $category->category_name . '</option>';
}
}
// Get employee project
if (!is_null($request->userId)) {
$projects = Project::with('members')->whereHas('members', function ($q) use ($request) {
$q->where('user_id', $request->userId);
})->get();
}
else if(user()->permission('add_expenses') == 'all' && is_null($request->userId))
{
$projects = [];
}
else {
$projects = Project::get();
}
$data = null;
if ($projects) {
foreach ($projects as $project) {
$data .= '<option data-currency-id="'. $project->currency_id .'" value="' . $project->id . '">' . $project->project_name . '</option>';
}
}
return Reply::dataOnly(['status' => 'success', 'data' => $data, 'category' => $categories]);
}
protected function getCategoryEmployee(Request $request)
{
$expenseCategory = ExpensesCategoryRole::where('expenses_category_id', $request->categoryId)->get();
$roleId = [];
$managers = [];
$employees = [];
foreach($expenseCategory as $category) {
array_push($roleId, $category->role_id);
}
if (count($roleId ) == 1 && $roleId != null) {
$users = User::whereHas(
'role', function($q) use ($roleId) {
$q->whereIn('role_id', $roleId);
}
)->get();
foreach ($users as $user) {
($user->hasRole('Manager')) ? array_push($managers, $user) : array_push($employees, $user);
}
}
else {
$employees = User::allEmployees(null, true);
}
$data = null;
if ($employees) {
foreach ($employees as $employee) {
$data .= '<option ';
$selected = $employee->id == $request->userId ? 'selected' : '';
$itsYou = $employee->id == user()->id ? "<span class='ml-2 badge badge-secondary pr-1'>". __('app.itsYou') .'</span>' : '';
$data .= 'data-content="<div class=\'d-inline-block mr-1\'><img class=\'taskEmployeeImg rounded-circle\' src=\'' . $employee->image_url . '\' ></div> '.$employee->name.$itsYou.'"
value="' . $employee->id . '"'.$selected.'>'.$employee->name.'</option>';
}
}
else {
foreach ($managers as $manager) {
$data .= '<option ';
$selected = $manager->id == $request->userId ? 'selected' : '';
$itsYou = $manager->id == user()->id ? "<span class='ml-2 badge badge-secondary pr-1'>" . __('app.itsYou') . '</span>' : '';
$data .= 'data-content="<div class=\'d-inline-block mr-1\'><img class=\'taskEmployeeImg rounded-circle\' src=\'' . $manager->image_url . '\' ></div> '.$manager->name.'"
value="' . $manager->id . '"'.$selected.'>'.$manager->name.$itsYou.'</option>';
}
}
return Reply::dataOnly(['status' => 'success', 'employees' => $data]);
}
}