Matched vendor when importing expenses

This commit is contained in:
Hillel Coren 2016-02-27 22:41:23 +02:00
parent 62b8067299
commit 96e7fab55c
3 changed files with 37 additions and 23 deletions

View File

@ -4,7 +4,6 @@ use stdClass;
use Utils; use Utils;
use URL; use URL;
use Hash; use Hash;
use App\Models\Gateway;
use App\Models\BankSubaccount; use App\Models\BankSubaccount;
use App\Models\Vendor; use App\Models\Vendor;
use App\Models\Expense; use App\Models\Expense;
@ -37,7 +36,7 @@ class BankAccountService extends BaseService
public function loadBankAccounts($bankId, $username, $password, $includeTransactions = true) public function loadBankAccounts($bankId, $username, $password, $includeTransactions = true)
{ {
if ( ! $bankId || ! $username || ! $password) { if (! $bankId || ! $username || ! $password) {
return false; return false;
} }
@ -47,12 +46,13 @@ class BankAccountService extends BaseService
->withTrashed() ->withTrashed()
->get(['transaction_id']) ->get(['transaction_id'])
->toArray(); ->toArray();
$expenses = array_flip(array_map(function($val) { $expenses = array_flip(array_map(function ($val) {
return $val['transaction_id']; return $val['transaction_id'];
}, $expenses)); }, $expenses));
$vendorMap = $this->createVendorMap();
$bankAccounts = BankSubaccount::scope() $bankAccounts = BankSubaccount::scope()
->whereHas('bank_account', function($query) use ($bankId) { ->whereHas('bank_account', function ($query) use ($bankId) {
$query->where('bank_id', '=', $bankId); $query->where('bank_id', '=', $bankId);
}) })
->get(); ->get();
@ -70,7 +70,7 @@ class BankAccountService extends BaseService
$login->setup(); $login->setup();
foreach ($login->accounts as $account) { foreach ($login->accounts as $account) {
$account->setup($includeTransactions); $account->setup($includeTransactions);
if ($account = $this->parseBankAccount($account, $bankAccounts, $expenses, $includeTransactions)) { if ($account = $this->parseBankAccount($account, $bankAccounts, $expenses, $includeTransactions, $vendorMap)) {
$data[] = $account; $data[] = $account;
} }
} }
@ -83,9 +83,9 @@ class BankAccountService extends BaseService
} }
} }
private function parseBankAccount($account, $bankAccounts, $expenses, $includeTransactions) private function parseBankAccount($account, $bankAccounts, $expenses, $includeTransactions, $vendorMap)
{ {
$obj = new stdClass; $obj = new stdClass();
$obj->account_name = ''; $obj->account_name = '';
// look up bank account name // look up bank account name
@ -106,7 +106,7 @@ class BankAccountService extends BaseService
$obj->balance = Utils::formatMoney($account->ledgerBalance, CURRENCY_DOLLAR); $obj->balance = Utils::formatMoney($account->ledgerBalance, CURRENCY_DOLLAR);
if ($includeTransactions) { if ($includeTransactions) {
$ofxParser = new \OfxParser\Parser; $ofxParser = new \OfxParser\Parser();
$ofx = $ofxParser->loadFromString($account->response); $ofx = $ofxParser->loadFromString($account->response);
$obj->start_date = $ofx->BankAccount->Statement->startDate; $obj->start_date = $ofx->BankAccount->Statement->startDate;
@ -121,7 +121,13 @@ class BankAccountService extends BaseService
if ($transaction->amount >= 0) { if ($transaction->amount >= 0) {
continue; continue;
} }
$transaction->vendor = $this->prepareValue(substr($transaction->name, 0, 20));
// if vendor has already been imported use current name
$vendorName = trim(substr($transaction->name, 0, 20));
$key = strtolower($vendorName);
$vendor = isset($vendorMap[$key]) ? $vendorMap[$key] : null;
$transaction->vendor = $vendor ? $vendor->name : $this->prepareValue($vendorName);
$transaction->info = $this->prepareValue(substr($transaction->name, 20)); $transaction->info = $this->prepareValue(substr($transaction->name, 20));
$transaction->memo = $this->prepareValue($transaction->memo); $transaction->memo = $this->prepareValue($transaction->memo);
$transaction->date = \Auth::user()->account->formatDate($transaction->date); $transaction->date = \Auth::user()->account->formatDate($transaction->date);
@ -133,15 +139,13 @@ class BankAccountService extends BaseService
return $obj; return $obj;
} }
private function prepareValue($value) { private function prepareValue($value)
{
return ucwords(strtolower(trim($value))); return ucwords(strtolower(trim($value)));
} }
public function importExpenses($bankId, $input) { private function createVendorMap()
$countVendors = 0; {
$countExpenses = 0;
// create a vendor map
$vendorMap = []; $vendorMap = [];
$vendors = Vendor::scope() $vendors = Vendor::scope()
->withTrashed() ->withTrashed()
@ -151,6 +155,15 @@ class BankAccountService extends BaseService
$vendorMap[strtolower($vendor->transaction_name)] = $vendor; $vendorMap[strtolower($vendor->transaction_name)] = $vendor;
} }
return $vendorMap;
}
public function importExpenses($bankId, $input)
{
$vendorMap = $this->createVendorMap();
$countVendors = 0;
$countExpenses = 0;
foreach ($input as $transaction) { foreach ($input as $transaction) {
$vendorName = $transaction['vendor']; $vendorName = $transaction['vendor'];
$key = strtolower($vendorName); $key = strtolower($vendorName);
@ -165,7 +178,7 @@ class BankAccountService extends BaseService
$field => $info, $field => $info,
'name' => $vendorName, 'name' => $vendorName,
'transaction_name' => $transaction['vendor_orig'], 'transaction_name' => $transaction['vendor_orig'],
'vendorcontact' => [] 'vendorcontact' => [],
]); ]);
$vendorMap[$key] = $vendor; $vendorMap[$key] = $vendor;
$vendorMap[$transaction['vendor_orig']] = $vendor; $vendorMap[$transaction['vendor_orig']] = $vendor;
@ -191,7 +204,8 @@ class BankAccountService extends BaseService
]); ]);
} }
private function determineInfoField($value) { private function determineInfoField($value)
{
if (preg_match("/^[0-9\-\(\)\.]+$/", $value)) { if (preg_match("/^[0-9\-\(\)\.]+$/", $value)) {
return 'work_phone'; return 'work_phone';
} elseif (strpos($value, '.') !== false) { } elseif (strpos($value, '.') !== false) {
@ -215,7 +229,7 @@ class BankAccountService extends BaseService
'bank_name', 'bank_name',
function ($model) { function ($model) {
return link_to("bank_accounts/{$model->public_id}/edit", $model->bank_name); return link_to("bank_accounts/{$model->public_id}/edit", $model->bank_name);
} },
], ],
[ [
'bank_library_id', 'bank_library_id',
@ -233,9 +247,8 @@ class BankAccountService extends BaseService
uctrans('texts.edit_bank_account'), uctrans('texts.edit_bank_account'),
function ($model) { function ($model) {
return URL::to("bank_accounts/{$model->public_id}/edit"); return URL::to("bank_accounts/{$model->public_id}/edit");
} },
] ]
]; ];
} }
} }

View File

@ -1,4 +1,4 @@
<?php namespace app\Services; <?php namespace App\Services;
use stdClass; use stdClass;
use Excel; use Excel;

View File

@ -269,6 +269,7 @@
processData: false, processData: false,
contentType: 'application/json; charset=utf-8', contentType: 'application/json; charset=utf-8',
success: function (result) { success: function (result) {
NINJA.formIsChanged = false;
model.importResults(result); model.importResults(result);
model.setPage('done'); model.setPage('done');
} }