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 = AccountStatement::where('date_from', $dateFrom) ->where('date_to', $dateTo) ->where('total_amount', $totalDebit ?: $totalCredit,) ->where('begin_balance', $beginBalance) ->where('end_balance', $endBalance)->first(); if(!$statement){ $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); CreateBankStatementDetails::dispatch($statement)->delay(30); // $account = null; $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) ->where('end_balance', $endBalance) ->first(); if (!$existingTransaction) { $statement->transactions()->save($transaction); } return $transaction; }); // dd(json_encode($newTransactions)); return redirect()->back()->with('success', 'Statement imported successfully.')->with('newTransactions', $newTransactions); } public function rerun(AccountStatement $statement, Request $request) { CreateBankStatementDetails::dispatch($statement)->delay(30); return redirect()->back()->with('success', 'Rerun triggered successfully'); } public function show(AccountStatement $statement, Request $request) { $transactions = $statement->transactions(); // $account = $statement->account(); // dd(json_encode($account->where('id', '>=', 1)->first())); // dd(json_encode($transactions->where('id', '>=', 1)->first())); 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); $transactions = $transactions->get(); echo $this->process3_merged($transactions); //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'); } public function fetch(Request $request, ListBankStatementDetailsLogic $logic): JsonResponse { return $logic->execute($request); } public function update(Request $request, UpdateBankStatementDetailLogic $logic): JsonResponse { return $logic->execute($request); } private function process3_merged($transactions){ // $statement = $transactions[0]->statement(); // dd(json_encode($statement->first())); $headers = [ 'Date', 'Bank', 'Description', 'Credit', 'Debit', 'Pay For', 'System', 'System Reference', 'Human Reference', 'Multiple', 'Match?', 'System Amount' ]; $branches = [ 0 => 'MBB Cyber', 1 => 'MBB SS2', ]; $yes = 'Yes'; $no = 'No'; $table = '
| '.implode(' | ', $headers).' | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| '.$date->format('d-m-Y').' | branch | '.$description.' | '.$credit.' | '.$debit.' | '.$row['pay_for'].' | '.$system.' | '.$systemReference.' | '.$row['remarkreferences'].' | '.$multiple.' | '.$matches.' | '.$systemAmount.' |