Add Bank Transaction Importer

This commit is contained in:
David Bomba 2022-10-25 10:25:04 +11:00
parent 9a8468906a
commit 012322afcc
6 changed files with 231 additions and 2 deletions

View File

@ -17,10 +17,12 @@ use App\Http\Requests\BankTransaction\AdminBankTransactionRequest;
use App\Http\Requests\BankTransaction\CreateBankTransactionRequest;
use App\Http\Requests\BankTransaction\DestroyBankTransactionRequest;
use App\Http\Requests\BankTransaction\EditBankTransactionRequest;
use App\Http\Requests\BankTransaction\ImportBankTransactionsRequest;
use App\Http\Requests\BankTransaction\MatchBankTransactionRequest;
use App\Http\Requests\BankTransaction\ShowBankTransactionRequest;
use App\Http\Requests\BankTransaction\StoreBankTransactionRequest;
use App\Http\Requests\BankTransaction\UpdateBankTransactionRequest;
use App\Http\Requests\Import\PreImportRequest;
use App\Jobs\Bank\MatchBankTransactions;
use App\Models\BankTransaction;
use App\Repositories\BankTransactionRepository;
@ -28,7 +30,8 @@ use App\Services\Bank\BankService;
use App\Transformers\BankTransactionTransformer;
use App\Utils\Traits\MakesHash;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
class BankTransactionController extends BaseController
{

View File

@ -0,0 +1,67 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2022. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Requests\BankTransaction;
use App\Http\Requests\Request;
use App\Models\BankTransaction;
class ImportBankTransactionsRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize() : bool
{
return auth()->user()->isAdmin();
}
public function rules()
{
$rules = [
'transactions' => 'bail|array',
'transactions.*.id' => 'bail|required',
'transactions.*.invoice_ids' => 'nullable|string|sometimes',
'transactions.*.ninja_category_id' => 'nullable|string|sometimes'
];
$rules['transactions.*.vendor_id'] = 'bail|sometimes|exists:vendors,id,company_id,'.auth()->user()->company()->id.',is_deleted,0';
return $rules;
}
public function prepareForValidation()
{
$inputs = $this->all();
foreach($inputs['transactions'] as $key => $input)
{
if(array_key_exists('id', $inputs['transactions'][$key]))
$inputs['transactions'][$key]['id'] = $this->decodePrimaryKey($input['id']);
if(array_key_exists('ninja_category_id', $inputs['transactions'][$key]) && strlen($inputs['transactions'][$key]['ninja_category_id']) >= 1)
$inputs['transactions'][$key]['ninja_category_id'] = $this->decodePrimaryKey($inputs['transactions'][$key]['ninja_category_id']);
if(array_key_exists('vendor_id', $inputs['transactions'][$key]) && strlen($inputs['transactions'][$key]['vendor_id']) >= 1)
$inputs['transactions'][$key]['vendor_id'] = $this->decodePrimaryKey($inputs['transactions'][$key]['vendor_id']);
// $input = $this->decodePrimaryKeys($input);
}
$this->replace($inputs);
}
}

View File

@ -0,0 +1,47 @@
<?php
/**
* client Ninja (https://clientninja.com).
*
* @link https://github.com/clientninja/clientninja source repository
*
* @copyright Copyright (c) 2022. client Ninja LLC (https://clientninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Import\Definitions;
class BankTransactionMap
{
public static function importable()
{
return [
0 => 'bank.transaction_id',
1 => 'bank.amount',
2 => 'bank.currency',
3 => 'bank.account_type',
4 => 'bank.category_id',
5 => 'bank.category_type',
6 => 'bank.date',
7 => 'bank.bank_account_id',
8 => 'bank.description',
9 => 'bank.base_type',
];
}
public static function import_keys()
{
return [
0 => 'texts.transaction_id',
1 => 'texts.amount',
2 => 'texts.currency',
3 => 'texts.account_type',
4 => 'texts.category_id',
5 => 'texts.category_type',
6 => 'texts.date',
7 => 'texts.bank_account_id',
8 => 'texts.description',
9 => 'texts.type',
];
}
}

View File

@ -11,6 +11,7 @@
namespace App\Import\Providers;
use App\Factory\BankTransactionFactory;
use App\Factory\ClientFactory;
use App\Factory\ExpenseFactory;
use App\Factory\InvoiceFactory;
@ -18,6 +19,7 @@ use App\Factory\PaymentFactory;
use App\Factory\ProductFactory;
use App\Factory\QuoteFactory;
use App\Factory\VendorFactory;
use App\Http\Requests\BankTransaction\StoreBankTransactionRequest;
use App\Http\Requests\Client\StoreClientRequest;
use App\Http\Requests\Expense\StoreExpenseRequest;
use App\Http\Requests\Invoice\StoreInvoiceRequest;
@ -35,6 +37,8 @@ use App\Import\Transformer\Csv\PaymentTransformer;
use App\Import\Transformer\Csv\ProductTransformer;
use App\Import\Transformer\Csv\QuoteTransformer;
use App\Import\Transformer\Csv\VendorTransformer;
use App\Import\Transformers\Bank\BankTransformer;
use App\Repositories\BankTransactionRepository;
use App\Repositories\ClientRepository;
use App\Repositories\ExpenseRepository;
use App\Repositories\InvoiceRepository;
@ -60,12 +64,39 @@ class Csv extends BaseImport implements ImportInterface
'vendor',
'expense',
'quote',
'bank_transaction',
])
) {
$this->{$entity}();
}
}
public function bank_transaction()
{
$entity_type = 'bank_transaction';
$data = $this->getCsvData($entity_type);
if (is_array($data)) {
$data = $this->preTransformCsv($data, $entity_type);
}
if (empty($data)) {
$this->entity_count['bank_transactions'] = 0;
return;
}
$this->request_name = StoreBankTransactionRequest::class;
$this->repository_name = BankTransactionRepository::class;
$this->factory_name = BankTransactionFactory::class;
$this->transformer = new BankTransformer($this->company);
$bank_transaction_count = $this->ingest($data, $entity_type);
$this->entity_count['bank_transactions'] = $bank_transaction_count;
}
public function client()
{
$entity_type = 'client';

View File

@ -0,0 +1,81 @@
<?php
/**
* client Ninja (https://clientninja.com).
*
* @link https://github.com/clientninja/clientninja source repository
*
* @copyright Copyright (c) 2022. client Ninja LLC (https://clientninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Import\Transformers\Bank;
use App\Import\ImportException;
use App\Import\Transformer\BaseTransformer;
use App\Models\BankTransaction;
use App\Utils\Number;
/**
* Class BankTransformer.
*/
class BankTransformer extends BaseTransformer
{
/**
* @param $line_items_data
*
* @return bool|array
*/
public function transform($transaction)
{
$now = now();
$transformed = [
// 'bank_integration_id' => $this->bank_integration->id,
'transaction_id' => $this->getNumber($transaction,'bank.transaction_id'),
'amount' => $this->getFloat($transaction, 'bank.amount'),
'currency_id' => $this->getCurrencyByCode($transaction, 'bank.currency'),
'account_type' => array_key_exists('account_type', $transaction) ? $transaction['account_type'] : 'bank',
'category_id' => array_key_exists('category_id', $transaction) ? $transaction['category_id'] : null,
'category_type' => array_key_exists('category_type', $transaction) ? $transaction['category_type'] : '',
'date' => array_key_exists('date', $transaction) ? date('Y-m-d', strtotime(str_replace("/","-",$transaction['date'])))
: now()->format('Y-m-d'),
'bank_account_id' => array_key_exists('bank_account_id', $transaction) ? $transaction['bank_account_id'] : 0,
'description' => array_key_exists('description', $transaction)? $transaction['description'] : '',
'base_type' => $this->calculateType($transaction),
'created_at' => $now,
'updated_at' => $now,
'company_id' => $this->company->id,
'user_id' => $this->company->owner()->id,
];
return $transformed;
}
private function calculateType($transaction)
{
if(array_key_exists('base_type', $transaction) && $transaction['base_type'] == 'CREDIT')
return 'CREDIT';
if(array_key_exists('base_type', $transaction) && $transaction['base_type'] == 'DEBIT')
return 'DEBIT';
if(array_key_exists('category_id',$transaction))
return 'DEBIT';
if(array_key_exists('category_type', $transaction) && $transaction['category_type'] == 'Income')
return 'CREDIT';
if(array_key_exists('category_type', $transaction))
return 'DEBIT';
if(array_key_exists('amount', $transaction) && is_numeric($transaction['amount']) && $transaction['amount'] > 0)
return 'CREDIT';
return 'DEBIT';
}
}

View File

@ -74,7 +74,7 @@ class CSVIngest implements ShouldQueue
$engine = $this->bootEngine();
foreach (['client', 'product', 'invoice', 'payment', 'vendor', 'expense', 'quote'] as $entity) {
foreach (['client', 'product', 'invoice', 'payment', 'vendor', 'expense', 'quote', 'bank_transaction'] as $entity) {
$engine->import($entity);
}