diff --git a/app/Http/Controllers/BankTransactionController.php b/app/Http/Controllers/BankTransactionController.php index 5f25867b8b41..3f63ce04e0e3 100644 --- a/app/Http/Controllers/BankTransactionController.php +++ b/app/Http/Controllers/BankTransactionController.php @@ -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 { diff --git a/app/Http/Requests/BankTransaction/ImportBankTransactionsRequest.php b/app/Http/Requests/BankTransaction/ImportBankTransactionsRequest.php new file mode 100644 index 000000000000..3f2801ad4329 --- /dev/null +++ b/app/Http/Requests/BankTransaction/ImportBankTransactionsRequest.php @@ -0,0 +1,67 @@ +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); + + } +} diff --git a/app/Import/Definitions/BankTransactionMap.php b/app/Import/Definitions/BankTransactionMap.php new file mode 100644 index 000000000000..bf2c2927ddcb --- /dev/null +++ b/app/Import/Definitions/BankTransactionMap.php @@ -0,0 +1,47 @@ + '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', + ]; + } +} \ No newline at end of file diff --git a/app/Import/Providers/Csv.php b/app/Import/Providers/Csv.php index fcca60949591..d75fddcfa68e 100644 --- a/app/Import/Providers/Csv.php +++ b/app/Import/Providers/Csv.php @@ -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'; diff --git a/app/Import/Transformers/Bank/BankTransformer.php b/app/Import/Transformers/Bank/BankTransformer.php new file mode 100644 index 000000000000..5fe2ee0c3b41 --- /dev/null +++ b/app/Import/Transformers/Bank/BankTransformer.php @@ -0,0 +1,81 @@ + $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'; + + } + +} \ No newline at end of file diff --git a/app/Jobs/Import/CSVIngest.php b/app/Jobs/Import/CSVIngest.php index 8a61d6ca30d8..d19691825cf0 100644 --- a/app/Jobs/Import/CSVIngest.php +++ b/app/Jobs/Import/CSVIngest.php @@ -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); }