mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-05-24 02:14:21 -04:00
Add Bank Transaction Importer
This commit is contained in:
parent
9a8468906a
commit
012322afcc
@ -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
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
47
app/Import/Definitions/BankTransactionMap.php
Normal file
47
app/Import/Definitions/BankTransactionMap.php
Normal 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',
|
||||
];
|
||||
}
|
||||
}
|
@ -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';
|
||||
|
81
app/Import/Transformers/Bank/BankTransformer.php
Normal file
81
app/Import/Transformers/Bank/BankTransformer.php
Normal 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';
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user