%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\BankAccountDataTable;
use App\DataTables\BankTransactionDataTable;
use App\Http\Requests\BankAccount\StoreAccount;
use App\Http\Requests\BankAccount\StoreTransaction;
use App\Helper\Files;
use App\Helper\Reply;
use App\Models\BankAccount;
use App\Models\BankTransaction;
use App\Models\Currency;
use App\Models\Module;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class BankAccountController extends AccountBaseController
{
public function __construct()
{
parent::__construct();
$this->pageTitle = __('app.menu.bankaccount');
$this->middleware(function ($request, $next) {
abort_403(!in_array('bankaccount', $this->user->modules));
return $next($request);
});
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(BankAccountDataTable $dataTable)
{
$viewPermission = user()->permission('view_bankaccount');
abort_403(!in_array($viewPermission, ['all', 'added']));
$bankDetails = BankAccount::select('*');
if($viewPermission == 'added'){
$bankDetails = $bankDetails->where('added_by', user()->id);
}
$bankDetails = $bankDetails->get();
$this->bankAccounts = $bankDetails;
return $dataTable->render('bank-account.index', $this->data);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$this->addPermission = user()->permission('add_bankaccount');
abort_403(!in_array($this->addPermission, ['all']));
$this->currencies = Currency::all();
if (request()->ajax()) {
$html = view('bank-account.ajax.create', $this->data)->render();
return Reply::dataOnly(['status' => 'success', 'html' => $html, 'title' => $this->pageTitle]);
}
$this->view = 'bank-account.ajax.create';
return view('bank-account.create', $this->data);
}
public function store(StoreAccount $request)
{
$this->addPermission = user()->permission('add_bankaccount');
abort_403(!in_array($this->addPermission, ['all']));
$account = new BankAccount();
$account->type = $request->type;
$account->account_name = $request->account_name;
$account->account_type = $request->account_type;
$account->currency_id = $request->currency_id;
$account->contact_number = $request->contact_number;
$account->opening_balance = round($request->opening_balance, 2);
$account->status = $request->status;
if($request->type == 'bank')
{
$account->bank_name = $request->bank_name;
$account->account_number = $request->account_number;
if ($request->hasFile('bank_logo')) {
$account->bank_logo = Files::uploadLocalOrS3($request->bank_logo, BankAccount::FILE_PATH);
}
}
$account->save();
return Reply::successWithData(__('messages.recordSaved'), ['redirectUrl' => route('bankaccounts.index')]);
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$this->bankaccount = BankAccount::findOrFail($id);
$this->viewPermission = user()->permission('view_bankaccount');
abort_403(!(
$this->viewPermission == 'all' || ($this->viewPermission == 'added' && $this->bankaccount->added_by == user()->id)
));
$this->pageTitle = $this->bankaccount->bank_name . ' ' . $this->bankaccount->account_name;
$this->month = now(company()->timezone)->month;
$this->year = now(company()->timezone)->year;
$this->creditVsDebitChart = $this->creditVsDebitChart($id);
$this->recentTransactions = BankTransaction::where('bank_account_id', $id)->orderBy('transaction_date', 'desc')->orderBy('id', 'desc')->limit(15)->get();
$dataTable = new BankTransactionDataTable();
$this->view = 'bank-account.bank-transaction';
return $dataTable->render('bank-account.show', $this->data);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$this->bankAccount = BankAccount::findOrFail($id);
$this->editPermission = user()->permission('edit_bankaccount');
abort_403(!($this->editPermission == 'all' || ($this->editPermission == 'added' && $this->bankAccount->added_by == user()->id)));
$this->pageTitle = __('modules.bankaccount.updateBankAccount');
$this->currencies = Currency::all();
if (request()->ajax()) {
$html = view('bank-account.ajax.edit', $this->data)->render();
return Reply::dataOnly(['status' => 'success', 'html' => $html, 'title' => $this->pageTitle]);
}
$this->view = 'bank-account.ajax.edit';
return view('bank-account.create', $this->data);
}
public function update(StoreAccount $request, $id)
{
$account = BankAccount::findOrFail($id);
$this->editPermission = user()->permission('edit_bankaccount');
abort_403(!(
$this->editPermission == 'all' || ($this->editPermission == 'added' && $account->added_by == user()->id)
));
$account->type = $request->type;
$account->account_name = $request->account_name;
$account->account_type = $request->account_type;
$account->currency_id = $request->currency_id;
$account->contact_number = $request->contact_number;
$account->opening_balance = round($request->opening_balance, 2);
$account->status = $request->status;
if($request->type == 'bank')
{
$account->bank_name = $request->bank_name;
$account->account_number = $request->account_number;
if ($request->bank_logo_delete == 'yes') {
Files::deleteFile($account->bank_logo, BankAccount::FILE_PATH);
$account->bank_logo = null;
}
if ($request->hasFile('bank_logo')) {
Files::deleteFile($account->bank_logo, BankAccount::FILE_PATH);
$account->bank_logo = Files::uploadLocalOrS3($request->bank_logo, BankAccount::FILE_PATH);
}
}
$account->save();
return Reply::successWithData(__('messages.updateSuccess'), ['redirectUrl' => route('bankaccounts.index')]);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
$bankaccount = BankAccount::findOrFail($id);
$this->deletePermission = user()->permission('delete_bankaccount');
abort_403(!(
$this->deletePermission == 'all' || ($this->deletePermission == 'added' && $bankaccount->added_by == user()->id)
));
BankAccount::destroy($id);
return Reply::successWithData(__('messages.deleteSuccess'), ['redirectUrl' => route('bankaccounts.index')]);
}
public function changeStatus(Request $request)
{
$accountId = $request->accountId;
$status = $request->status;
$bankAccount = BankAccount::findOrFail($accountId);
$this->editPermission = user()->permission('edit_bankaccount');
abort_403(!(
$this->editPermission == 'all' || ($this->editPermission == 'added' && $bankAccount->added_by == user()->id)
));
$bankAccount->status = $status;
$bankAccount->save();
return Reply::success(__('messages.updateSuccess'));
}
public function applyQuickAction()
{
switch (request()->action_type) {
case 'delete':
$this->deleteRecords(request());
return Reply::success(__('messages.deleteSuccess'));
default:
return Reply::error(__('messages.selectAction'));
}
}
protected function deleteRecords($request)
{
abort_403(user()->permission('delete_bankaccount') != 'all');
BankAccount::whereIn('id', explode(',', $request->row_ids))->forceDelete();
}
public function createTransaction()
{
$this->type = request('type');
if($this->type == 'account') {
$this->addPermission = user()->permission('add_bank_transfer');
}
elseif($this->type == 'deposit'){
$this->addPermission = user()->permission('add_bank_deposit');
}
else {
$this->addPermission = user()->permission('add_bank_withdraw');
}
abort_403(!in_array($this->addPermission, ['all']));
$this->accountId = request('accountId');
$this->type = request('type');
$this->currentAccount = BankAccount::findOrFail($this->accountId);
$this->bankAccounts = BankAccount::where('id', '!=', $this->accountId)->where('company_id', company()->id)
->where('currency_id', $this->currentAccount->currency_id)->where('status', 1)->get();
if (request()->ajax()) {
$html = view('bank-account.ajax.create-transaction', $this->data)->render();
return Reply::dataOnly(['status' => 'success', 'html' => $html, 'title' => $this->pageTitle]);
}
$this->view = 'bank-account.ajax.create-transaction';
return view('bank-account.create', $this->data);
}
public function storeTransaction(StoreTransaction $request)
{
if($request->type == 'account') {
$this->addPermission = user()->permission('add_bank_transfer');
}
elseif($request->type == 'deposit'){
$this->addPermission = user()->permission('add_bank_deposit');
}
else {
$this->addPermission = user()->permission('add_bank_withdraw');
}
abort_403(!in_array($this->addPermission, ['all']));
if(!($request->type == 'deposit')){
$bankAccount = BankAccount::find($request->from_bank_account);
$bankBalance = $bankAccount->bank_balance;
$totalBalance = $bankBalance - $request->amount;
$transaction = new BankTransaction();
$transaction->bank_account_id = $request->from_bank_account;
$transaction->type = 'Dr';
$transaction->transaction_date = Carbon::now();
$transaction->amount = round($request->amount, 2);
$transaction->memo = $request->memo;
$transaction->bank_balance = round($totalBalance, 2);
$transaction->transaction_relation = 'bank';
$transaction->title = $request->type == 'account' ? 'bank-account-transfer' : 'bank-account-withdraw';
$transaction->save();
$id = $request->from_bank_account;
}
if(!($request->type == 'withdraw')){
$bankAccount = BankAccount::find($request->to_bank_account);
$bankBalance = $bankAccount->bank_balance;
$totalBalance = $bankBalance + $request->amount;
$transaction = new BankTransaction();
$transaction->bank_account_id = $request->to_bank_account;
$transaction->type = 'Cr';
$transaction->transaction_date = Carbon::now();
$transaction->amount = round($request->amount, 2);
$transaction->memo = $request->memo;
$transaction->bank_balance = round($totalBalance, 2);
$transaction->transaction_relation = 'bank';
$transaction->title = $request->type == 'account' ? 'bank-account-transfer' : 'bank-account-deposit';
$transaction->save();
$id = $request->type == 'deposit' ? $request->to_bank_account : $request->from_bank_account;
}
/* @phpstan-ignore-next-line */
return Reply::successWithData(__('messages.bankTransactionSuccess'), ['redirectUrl' => route('bankaccounts.show', $id)]);
}
public function viewTransaction($id)
{
$this->bankTransaction = BankTransaction::with('bankAccount', 'bankAccount.currency')->findOrFail($id);
$this->viewPermission = user()->permission('view_bankaccount');
abort_403(!(
$this->viewPermission == 'all' || ($this->viewPermission == 'added' && $this->bankTransaction->added_by == user()->id)
));
$this->type = $this->bankTransaction->transaction_relation;
if (request()->ajax()) {
$this->pageTitle = __('modules.bankaccount.bankTransaction');
$html = view('bank-account.ajax.view-transaction', $this->data)->render();
return Reply::dataOnly(['status' => 'success', 'html' => $html, 'title' => $this->pageTitle]);
}
$this->view = 'bank-account.ajax.view-transaction';
return view('bank-account.create', $this->data);
}
public function destroyTransaction(Request $request)
{
$bankTransaction = BankTransaction::findOrFail($request->transactionId);
$this->deletePermission = user()->permission('delete_bankaccount');
abort_403(!(
$this->deletePermission == 'all' || ($this->deletePermission == 'added' && $bankTransaction->added_by == user()->id)
));
BankTransaction::destroy($request->transactionId);
return Reply::successWithData(__('messages.deleteSuccess'), ['redirectUrl' => route('bankaccounts.show', $bankTransaction->bank_account_id)]);
}
public function applyTransactionQuickAction()
{
switch (request()->action_type) {
case 'delete':
$this->deleteTransactionRecords(request());
return Reply::success(__('messages.deleteSuccess'));
default:
return Reply::error(__('messages.selectAction'));
}
}
protected function deleteTransactionRecords($request)
{
abort_403(user()->permission('delete_bankaccount') != 'all');
BankTransaction::whereIn('id', explode(',', $request->row_ids))->forceDelete();
}
public function generateStatement($id)
{
$this->generatePermission = user()->permission('view_bankaccount');
abort_403(!in_array($this->generatePermission, ['all', 'added']));
$this->accountId = $id;
return view('bank-account.generate-statement', $this->data);
}
public function getBankStatement(Request $request)
{
$pdfOption = $this->domPdfObjectForDownload($request);
$pdf = $pdfOption['pdf'];
$filename = $pdfOption['fileName'];
return $pdf->download($filename . '.pdf');
}
public function domPdfObjectForDownload($request)
{
$startDate = Carbon::createFromFormat($this->company->date_format, $request->startDate)->toDateString();
$endDate = Carbon::createFromFormat($this->company->date_format, $request->endDate)->toDateString();
$this->statements = BankAccount::with(['transaction' => function ($q) use($startDate, $endDate){
$q->whereBetween('bank_transactions.transaction_date', [$startDate, $endDate]);
}])->where('id', $request->accountId)->first();
$this->sDate = $request->startDate;
$this->eDate = $request->endDate;
$pdf = app('dompdf.wrapper');
$pdf->loadView('bank-account.pdf.statement', $this->data);
$filename = 'bank-statement';
return [
'pdf' => $pdf,
'fileName' => $filename
];
}
public function creditVsDebitChart($bankAccountId)
{
$period = now()->subMonth(3)->monthsUntil(now()); /* @phpstan-ignore-line */
$startDate = $period->startDate->startOfMonth(); /* @phpstan-ignore-line */
$endDate = $period->endDate->endOfMonth(); /* @phpstan-ignore-line */
$months = [];
foreach($period as $periodData){
$months[$periodData->format('m-Y')] = [
'y' => $periodData->translatedFormat('F'),
'a' => 0 ,
'b' => 0
];
}
$creditAmount = BankTransaction::whereDate('transaction_date', '>=', $startDate)
->whereDate('transaction_date', '<=', $endDate )
->where('type', 'Cr')
->where('bank_account_id', $bankAccountId)
->select(DB::raw('sum(amount) as credit'),
DB::raw("DATE_FORMAT(transaction_date, '%m-%Y') date"),
DB::raw('YEAR(transaction_date) year, MONTH(transaction_date) month'))
->orderBy('transaction_date')
->groupby('year', 'month')
->get()->keyBy('date');
$debitAmount = BankTransaction::whereDate('transaction_date', '>=', $startDate)
->whereDate('transaction_date', '<=', $endDate )
->where('bank_account_id', $bankAccountId)
->where('type', 'Dr')
->select(DB::raw('sum(amount) as debit'),
DB::raw("DATE_FORMAT(transaction_date, '%m-%Y') date"),
DB::raw('YEAR(transaction_date) year, MONTH(transaction_date) month'))
->orderBy('transaction_date')
->groupby('year', 'month')
->get()->keyBy('date');
foreach ($months as $key => $month){
$joinings = 0;
$exit = 0;
if(isset($creditAmount[$key])){
$joinings = $creditAmount[$key]->credit; /* @phpstan-ignore-line */
}
if(isset($debitAmount[$key])){
$exit = $debitAmount[$key]->debit; /* @phpstan-ignore-line */
}
$graphData[] = [
'y' => $months[$key]['y'],
'a' => $joinings ,
'b' => $exit
];
}
$graphData = collect($graphData); /* @phpstan-ignore-line */
$data['labels'] = $graphData->pluck('y');
$data['values'][] = $graphData->pluck('a');
$data['values'][] = $graphData->pluck('b');
$data['colors'] = ['#28a745', '#d30000'];
$data['name'][] = __('modules.bankaccount.credit');
$data['name'][] = __('modules.bankaccount.debit');
return $data;
}
}