Files
exchange-2.0/app/Http/Controllers/Accounting/BankStatementController.php
T
Omair Saleh 7ca23edb9b 1. ImportBankRecordController (script for mapping that get the data from xsl file, needs to be changed to get data from db, and also to retrive data from shipping portal)
2. BankStatementController (for importing data from csv files from bank to insert into the database)
2023-04-03 17:48:39 +08:00

180 lines
7.1 KiB
PHP

<?php
namespace App\Http\Controllers\Accounting;
use App\Classes\Modules\Imports\Services\BankStatementImport;
use App\Http\Controllers\Controller;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Maatwebsite\Excel\Facades\Excel;
use App\Models\StatementAccount;
use App\Models\AccountStatement;
use App\Models\StatementTransaction;
class BankStatementController extends Controller
{
public function index(Request $request)
{
$selectedAccount = $request->input('account');
$search = $request->input('search');
$accounts = StatementAccount::all();
$statementsQuery = AccountStatement::query();
if ($selectedAccount) {
$statementsQuery->where('statement_account_id', $selectedAccount);
}
if ($search) {
$statementsQuery->where(function ($query) use ($search) {
$query->where('date_from', 'LIKE', "%$search%")
->orWhere('date_to', 'LIKE', "%$search%")
->orWhere('total_amount', 'LIKE', "%$search%")
->orWhere('begin_balance', 'LIKE', "%$search%")
->orWhere('end_balance', 'LIKE', "%$search%");
});
}
$statements = $statementsQuery->paginate(10);
return view('pages.accounting.bank-statements.index', compact('accounts', 'selectedAccount', 'search', 'statements'));
}
public function import(Request $request)
{
$request->validate([
'file' => 'required|mimes:csv,txt'
]);
$file = $request->file('file');
$collection = Excel::toCollection(null, $file, null, null, true);
$sheet = $collection->first()->skip(1);
$statementDetails = $sheet->first();
$accountNumber = $statementDetails[0];
$accountType = $statementDetails[1];
$accountName = $statementDetails[2];
$accountCurrency = $statementDetails[3];
$dateFrom = carbon::parse(str_replace(' MY (UTC+08:00)', '', $statementDetails[4]));
$dateTo = carbon::parse(str_replace(' MY (UTC+08:00)', '', $statementDetails[5]));
$totalDebit = $statementDetails[6];
$totalCredit = $statementDetails[7];
$beginBalance = $statementDetails[8];
$endBalance = $statementDetails[9];
$account = StatementAccount::updateOrCreate(
['number' => $accountNumber],
[
'type' => $accountType,
'name' => $accountName,
'currency' => $accountCurrency,
]
);
$statement = new AccountStatement([
'date_from' => $dateFrom,
'date_to' => $dateTo,
'total_amount' => $totalDebit ?: $totalCredit,
'begin_balance' => $beginBalance,
'end_balance' => $endBalance,
]);
$existingStatement = AccountStatement::where('date_from', $dateFrom)
->where('date_to', $dateTo)
->where('statement_account_id', $account->id)
->first();
if ($existingStatement) {
return redirect()->back()->with('error', 'This statement has already been imported.');
}
$account->statements()->save($statement);
$newTransactions = $sheet->map(function ($row) use ($statement, $account) {
$transactionRef = $row[15];
$amount = $row[17] !== '-' ? ((float) str_replace(',', '', $row[17])) : (-((float) str_replace(',', '', $row[16])));
$transactionDate = $row[10] !== '-' ? carbon::parse(str_replace(' MY (UTC+08:00)', '', $row[10]) . $row[11]) : null;
$postingDate = carbon::createFromFormat('d/M/Y H:i', str_replace(' MY (UTC+08:00)', '', $row[12]) . str_replace(' MY (UTC+08:00)', '', $row[13]));
$transactionDescription = is_numeric($row[14]) ? (int) sprintf('%.2f', $row[14]) : $row[14];
$tellerId = $row[19];
$branchChannel = $row[20];
$transactionCode = $row[21];
$endBalance = $row[22];
$description2 = $row[25];
$description3 = $row[26];
$description4 = $row[27];
$description5 = $row[28];
$transaction = new StatementTransaction([
'transaction_ref' => $transactionRef,
'amount' => $amount,
'transaction_date' => $transactionDate,
'posting_date' => $postingDate,
'transaction_description' => $transactionDescription,
'teller_id' => $tellerId,
'branch_channel' => $branchChannel,
'transaction_code' => $transactionCode,
'end_balance' => $endBalance,
'transaction_description_2' => $description2,
'transaction_description_3' => $description3,
'transaction_description_4' => $description4,
'transaction_description_5' => $description5,
]);
// Check if the transaction already exists for this statement
$existingTransaction = StatementTransaction::where('transaction_ref', $transactionRef)
->where('posting_date', $postingDate)
->where('amount', $amount)
->where('transaction_description', $transactionDescription)
->where('teller_id', $tellerId)
->where('branch_channel', $branchChannel)
->where('transaction_code', $transactionCode)
->first();
if (!$existingTransaction) {
$statement->transactions()->save($transaction);
}
return $transaction;
});
return redirect()->back()->with('success', 'Statement imported successfully.')->with('newTransactions', $newTransactions);
}
public function show(AccountStatement $statement, Request $request)
{
$transactions = $statement->transactions();
if ($request->get('transaction_filter')) {
$transactionFilter = $request->get('transaction_filter');
$transactions = $transactions->where('transaction_description', 'LIKE', "%$transactionFilter%");
}
if ($request->get('from_amount_filter')) {
$fromAmountFilter = $request->get('from_amount_filter');
$transactions = $transactions->where('amount', '>=', $fromAmountFilter);
}
if ($request->get('to_amount_filter')) {
$toAmountFilter = $request->get('to_amount_filter');
$transactions = $transactions->where('amount', '<=', $toAmountFilter);
}
$transactions = $transactions->paginate(100);
return view('pages.accounting.bank-statements.show', compact('statement', 'transactions'));
}
public function download(AccountStatement $statement)
{
$transactions = $statement->transactions;
$csvExporter = new \Laracsv\Export();
$csvExporter->build($transactions, ['transaction_date', 'transaction_time', 'posting_date', 'transaction_description', 'transaction_ref', 'debit', 'credit'])
->download($statement->date_from->format('Y-m-d') . '_' . $statement->date_to->format('Y-m-d') . '_statement.csv');
}
}