Working on CSV imports

This commit is contained in:
David Bomba 2020-12-16 11:01:15 +11:00
parent b087046489
commit 8df553c4cc
5 changed files with 119 additions and 65 deletions

View File

@ -84,9 +84,11 @@ class ImportController extends Controller
//parse CSV
$csv_array = $this->getCsvData(file_get_contents($request->file('file')->getPathname()));
$class_map = $this->getEntityMap($request->input('entity_type'));
$data = [
'hash' => $hash,
'available' => InvoiceMap::importable(),
'available' => $class_map::importable(),
'headers' => array_slice($csv_array, 0, 2)
];
@ -95,11 +97,17 @@ class ImportController extends Controller
public function import(ImportRequest $request)
{
CSVImport::dispatch($request, auth()->user()->company());
CSVImport::dispatch($request->all(), auth()->user()->company());
return response()->json(['message' => 'Importing data, email will be sent on completion'], 200);
}
private function getEntityMap($entity_type)
{
return sprintf('App\\Import\\Definitions\%sMap', ucfirst($entity_type));
}
private function getCsvData($csvfile)
{

View File

@ -29,8 +29,10 @@ class ImportRequest extends Request
{
return [
'hash' => 'required',
'entity_type' => 'required',
'hash' => 'required|string',
'entity_type' => 'required|string',
'column_map' => 'required|array',
'skip_header' => 'required|boolean'
];
}

View File

@ -44,7 +44,15 @@ class ClientMap
25 => 'client.payment_terms',
26 => 'client.vat_number',
27 => 'client.id_number',
28 => 'client.public_notes'
28 => 'client.public_notes',
29 => 'contact.first_name',
30 => 'contact.last_name',
31 => 'contact.email',
32 => 'contact.phone',
33 => 'contact.custom_value1',
34 => 'contact.custom_value2',
35 => 'contact.custom_value3',
36 => 'contact.custom_value4',
];
}
@ -53,57 +61,41 @@ class ClientMap
return [
0 => 'texts.client_name',
1 => 'texts.user',
2 => 'texts.amount',
3 => 'texts.balance',
4 => 'texts.client',
5 => 'texts.discount',
6 => 'texts.po_number',
7 => 'texts.date',
8 => 'texts.due_date',
9 => 'texts.terms',
10 => 'texts.public_notes',
11 => 'texts.sent',
12 => 'texts.private_notes',
13 => 'texts.uses_inclusive_taxes',
14 => 'texts.tax_name',
15 => 'texts.tax_rate',
16 => 'texts.tax_name',
17 => 'texts.tax_rate',
18 => 'texts.tax_name',
19 => 'texts.tax_rate',
20 => 'texts.is_amount_discount',
21 => 'texts.footer',
22 => 'texts.partial',
23 => 'texts.partial_due_date',
24 => 'texts.custom_value1',
25 => 'texts.custom_value2',
26 => 'texts.custom_value3',
27 => 'texts.custom_value4',
28 => 'texts.surcharge',
29 => 'texts.surcharge',
30 => 'texts.surcharge',
31 => 'texts.surcharge',
32 => 'texts.exchange_rate',
33 => 'texts.payment_date',
34 => 'texts.payment_amount',
35 => 'texts.transaction_reference',
36 => 'texts.quantity',
37 => 'texts.cost',
38 => 'texts.product_key',
39 => 'texts.notes',
40 => 'texts.discount',
41 => 'texts.is_amount_discount',
42 => 'texts.tax_name',
43 => 'texts.tax_rate',
44 => 'texts.tax_name',
45 => 'texts.tax_rate',
46 => 'texts.tax_name',
47 => 'texts.tax_rate',
48 => 'texts.custom_value',
49 => 'texts.custom_value',
50 => 'texts.custom_value',
51 => 'texts.custom_value',
52 => 'texts.type',
2 => 'texts.balance',
3 => 'texts.paid_to_date',
4 => 'texts.currency',
5 => 'texts.website',
6 => 'texts.private_notes',
7 => 'texts.industry',
8 => 'texts.size',
9 => 'texts.address1',
10 => 'texts.address2',
11 => 'texts.city',
12 => 'texts.state',
13 => 'texts.postal_code',
14 => 'texts.country',
15 => 'texts.custom_value',
16 => 'texts.custom_value',
17 => 'texts.custom_value',
18 => 'texts.custom_value',
19 => 'texts.address1',
20 => 'texts.address2',
21 => 'texts.shipping_city',
22 => 'texts.shipping_state',
23 => 'texts.shipping_postal_code',
24 => 'texts.shipping_country',
25 => 'texts.payment_terms',
26 => 'texts.vat_number',
27 => 'texts.id_number',
28 => 'texts.public_notes',
29 => 'texts.first_name',
30 => 'texts.last_name',
31 => 'texts.email',
32 => 'texts.phone',
33 => 'texts.custom_value',
34 => 'texts.custom_value',
35 => 'texts.custom_value',
36 => 'texts.custom_value',
];
}
}

View File

@ -12,6 +12,7 @@
namespace App\Jobs\Import;
use App\Libraries\MultiDB;
use App\Models\Company;
use Exception;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
@ -20,6 +21,8 @@ use Illuminate\Http\Request;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Cache;
use League\Csv\Reader;
use League\Csv\Statement;
class CSVImport implements ShouldQueue
{
@ -33,19 +36,42 @@ class CSVImport implements ShouldQueue
public $entity_type;
public $skip_headers;
public $skip_header;
public function __construct(Request $request, Company $company)
public $column_map;
/*
[hash] => 2lTm7HVR3i9Zv3y86eQYZIO16yVJ7J6l
[entity_type] => client
[skip_header] => 1
[column_map] => Array
(
[0] => client.name
[1] => client.user_id
[2] => client.balance
[3] => client.paid_to_date
[4] => client.address1
[5] => client.address2
[6] => client.city
[7] => client.state
[8] => client.postal_code
[9] => client.country_id
[20] => client.currency_id
[21] => client.public_notes
[22] => client.private_notes
)
*/
public function __construct(array $request, Company $company)
{
$this->request = $request;
$this->company = $company;
$this->hash = $request->input('hash');
$this->hash = $request['hash'];
$this->entity_type = $request->input('entity_type');
$this->entity_type = $request['entity_type'];
$this->skip_headers = $request->input('skip_headers');
$this->skip_header = $request['skip_header'];
$this->column_map = $request['column_map'];
}
/**
@ -58,6 +84,10 @@ class CSVImport implements ShouldQueue
{
MultiDB::setDb($this->company->db);
foreach($this->getCsv() as $record) {
}
}
public function failed($exception)
@ -65,10 +95,31 @@ class CSVImport implements ShouldQueue
}
private function getCsv()
private function getCsvData()
{
$base64_encoded_csv = Cache::get($this->hash);
$csv = base64_decode($base64_encoded_csv);
$stmt = new Statement();
$data = iterator_to_array($stmt->process($csv));
if (count($data) > 0) {
$headers = $data[0];
// Remove Invoice Ninja headers
if (count($headers) && count($data) > 4) {
$firstCell = $headers[0];
if (strstr($firstCell, APP_NAME)) {
array_shift($data); // Invoice Ninja...
array_shift($data); // <blank line>
array_shift($data); // Enitty Type Header
}
}
}
return $data;
return base64_decode($base64_encoded_csv);
}
}

View File

@ -169,6 +169,7 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a
Route::get('company_ledger', 'CompanyLedgerController@index')->name('company_ledger.index');
Route::post('preimport', 'ImportController@preimport')->name('import.preimport');
Route::post('import', 'ImportController@import')->name('import.import');
/*
Route::resource('tasks', 'TaskController'); // name = (tasks. index / create / show / update / destroy / edit