2022-02-01 07:14:27 +01:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Invoice Ninja (https://invoiceninja.com).
|
|
|
|
*
|
|
|
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
|
|
|
*
|
|
|
|
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
|
|
|
|
*
|
|
|
|
* @license https://www.elastic.co/licensing/elastic-license
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace App\Jobs\Import;
|
|
|
|
|
2022-02-25 12:36:52 +01:00
|
|
|
use App\Factory\ClientContactFactory;
|
|
|
|
use App\Factory\VendorContactFactory;
|
2022-02-01 07:14:27 +01:00
|
|
|
use App\Import\Providers\Csv;
|
|
|
|
use App\Import\Providers\Freshbooks;
|
|
|
|
use App\Import\Providers\Invoice2Go;
|
|
|
|
use App\Import\Providers\Invoicely;
|
|
|
|
use App\Import\Providers\Wave;
|
|
|
|
use App\Import\Providers\Zoho;
|
|
|
|
use App\Libraries\MultiDB;
|
2022-02-25 12:36:52 +01:00
|
|
|
use App\Models\Client;
|
2022-02-01 07:14:27 +01:00
|
|
|
use App\Models\Company;
|
2022-02-25 12:36:52 +01:00
|
|
|
use App\Models\Vendor;
|
2022-02-01 07:14:27 +01:00
|
|
|
use Illuminate\Bus\Queueable;
|
|
|
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
|
|
use Illuminate\Foundation\Bus\Dispatchable;
|
|
|
|
use Illuminate\Queue\InteractsWithQueue;
|
|
|
|
use Illuminate\Queue\SerializesModels;
|
2022-02-25 12:36:52 +01:00
|
|
|
use Illuminate\Support\Str;
|
2022-02-01 07:14:27 +01:00
|
|
|
|
|
|
|
class CSVIngest implements ShouldQueue {
|
|
|
|
|
|
|
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
|
|
|
|
|
|
|
public Company $company;
|
|
|
|
|
|
|
|
public string $hash;
|
|
|
|
|
|
|
|
public string $import_type;
|
|
|
|
|
|
|
|
public ?string $skip_header;
|
|
|
|
|
2022-02-17 03:27:21 +01:00
|
|
|
public $column_map;
|
|
|
|
|
|
|
|
public array $request;
|
2022-02-01 07:14:27 +01:00
|
|
|
|
2022-02-28 22:04:54 +01:00
|
|
|
public $tries = 1;
|
|
|
|
|
2022-02-01 07:14:27 +01:00
|
|
|
public function __construct( array $request, Company $company ) {
|
|
|
|
$this->company = $company;
|
2022-02-17 03:27:21 +01:00
|
|
|
$this->request = $request;
|
2022-02-01 07:14:27 +01:00
|
|
|
$this->hash = $request['hash'];
|
|
|
|
$this->import_type = $request['import_type'];
|
|
|
|
$this->skip_header = $request['skip_header'] ?? null;
|
|
|
|
$this->column_map =
|
|
|
|
! empty( $request['column_map'] ) ?
|
|
|
|
array_combine( array_keys( $request['column_map'] ), array_column( $request['column_map'], 'mapping' ) ) : null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Execute the job.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function handle() {
|
|
|
|
|
|
|
|
MultiDB::setDb( $this->company->db );
|
|
|
|
|
|
|
|
$engine = $this->bootEngine($this->import_type);
|
|
|
|
|
|
|
|
foreach ( [ 'client', 'product', 'invoice', 'payment', 'vendor', 'expense' ] as $entity ) {
|
|
|
|
|
|
|
|
$engine->import($entity);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2022-02-25 12:36:52 +01:00
|
|
|
$this->checkContacts();
|
|
|
|
}
|
|
|
|
|
|
|
|
private function checkContacts()
|
|
|
|
{
|
|
|
|
$vendors = Vendor::withTrashed()->where('company_id', $this->company->id)->doesntHave('contacts')->get();
|
|
|
|
|
|
|
|
foreach ($vendors as $vendor) {
|
|
|
|
|
|
|
|
$new_contact = VendorContactFactory::create($vendor->company_id, $vendor->user_id);
|
|
|
|
$new_contact->vendor_id = $vendor->id;
|
|
|
|
$new_contact->contact_key = Str::random(40);
|
|
|
|
$new_contact->is_primary = true;
|
|
|
|
$new_contact->save();
|
|
|
|
}
|
|
|
|
|
|
|
|
$clients = Client::withTrashed()->where('company_id', $this->company->id)->doesntHave('contacts')->get();
|
|
|
|
|
|
|
|
foreach ($clients as $client) {
|
|
|
|
|
|
|
|
$new_contact = ClientContactFactory::create($client->company_id, $client->user_id);
|
|
|
|
$new_contact->client_id = $client->id;
|
|
|
|
$new_contact->contact_key = Str::random(40);
|
|
|
|
$new_contact->is_primary = true;
|
|
|
|
$new_contact->save();
|
|
|
|
}
|
|
|
|
|
2022-02-01 07:14:27 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private function bootEngine(string $import_type)
|
|
|
|
{
|
|
|
|
switch ($import_type) {
|
|
|
|
case 'csv':
|
|
|
|
return new Csv( $this->request, $this->company);
|
|
|
|
break;
|
|
|
|
case 'waveaccounting':
|
|
|
|
return new Wave( $this->request, $this->company);
|
|
|
|
break;
|
|
|
|
case 'invoicely':
|
|
|
|
return new Invoicely( $this->request, $this->company);
|
|
|
|
break;
|
|
|
|
case 'invoice2go':
|
|
|
|
return new Invoice2Go( $this->request, $this->company);
|
|
|
|
break;
|
|
|
|
case 'zoho':
|
|
|
|
return new Zoho( $this->request, $this->company);
|
|
|
|
break;
|
|
|
|
case 'freshbooks':
|
|
|
|
return new Freshbooks( $this->request, $this->company);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
// code...
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|