app/Console/Commands/ImportCSV.php (164 lines of code) (raw):
<?php
namespace App\Console\Commands;
use function Safe\fopen;
use App\Models\User\User;
use function Safe\fclose;
use App\Helpers\DateHelper;
use App\Models\Contact\Gender;
use App\Models\Contact\Address;
use App\Models\Contact\Contact;
use Illuminate\Console\Command;
use App\Models\Contact\ContactField;
use App\Models\Contact\ContactFieldType;
use App\Jobs\Avatars\GetAvatarsFromInternet;
use App\Services\Contact\Address\CreateAddress;
use App\Services\Contact\Reminder\CreateReminder;
class ImportCSV extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'import:csv {user : email or id of a user} {file : path to the CSV file} {--format=google}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Imports CSV in Google format to user account';
/**
* The contact field email object.
*
* @var int|null
*/
public $contactFieldEmailId;
/**
* The contact field phone object.
*
* @var int|null
*/
public $contactFieldPhoneId;
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$file = $this->argument('file');
if (is_numeric($this->argument('user'))) {
$user = User::find($this->argument('user'));
} else {
$user = User::where('email', $this->argument('user'))->first();
}
if (! file_exists($file)) {
$this->error('You need to provide a valid file path.');
return -1;
}
if (! $user) {
$this->error('You need to provide a valid User ID or email address!');
return -1;
}
if (is_string($file)) {
$this->info("Importing CSV file {$file} to user {$user->id}");
}
// create special gender for this import
// we don't know which gender all the contacts are, so we need to create a special status for them, as we
// can't guess whether they are men, women or else.
$gender = Gender::where('name', config('dav.default_gender'))->first();
if (! $gender) {
$gender = new Gender;
$gender->account_id = $user->account_id;
$gender->name = config('dav.default_gender');
$gender->save();
}
$first = true;
$imported = 0;
try {
$handle = fopen($file, 'r');
while (($data = fgetcsv($handle)) !== false) {
// don't import the columns
if ($first) {
$first = false;
continue;
}
// if first & last name do not exist skip row
if (empty($data[1]) && empty($data[3])) {
continue;
}
$this->csvToContact($data, $user->account_id, $gender->id);
$imported++;
}
} finally {
fclose($handle);
}
$this->info("Imported {$imported} Contacts");
}
/**
* Create contact.
*/
private function csvToContact($data, $account_id, $gender_id)
{
$contact = new Contact();
$contact->account_id = $account_id;
$contact->gender_id = $gender_id;
if (! empty($data[1])) {
$contact->first_name = $data[1]; // Given Name
}
if (! empty($data[2])) {
$contact->middle_name = $data[2]; // Additional Name
}
if (! empty($data[3])) {
$contact->last_name = $data[3]; // Family Name
}
$street = null;
if (! empty($data[49])) {
$street = $data[49]; // address 1 street
}
$city = null;
if (! empty($data[50])) {
$city = $data[50]; // address 1 city
}
$province = null;
if (! empty($data[52])) {
$province = $data[52]; // address 1 region (state)
}
$postalCode = null;
if (! empty($data[53])) {
$postalCode = $data[53]; // address 1 postal code (zip) 53
}
if (! empty($data[66])) {
$contact->job = $data[66]; // organization 1 name 66
}
$contact->setAvatarColor();
$contact->save();
if (! empty($data[28])) {
// Email 1 Value
ContactField::firstOrCreate([
'account_id' => $contact->account_id,
'contact_id' => $contact->id,
'data' => $data[28],
'contact_field_type_id' => $this->contactFieldEmailId(),
]);
}
if ($postalCode || $province || $street || $city) {
$request = [
'account_id' => $contact->account_id,
'contact_id' => $contact->id,
'street' => $street,
'city' => $city,
'province' => $province,
'postal_code' => $postalCode,
];
app(CreateAddress::class)->execute($request);
}
if (! empty($data[42])) {
// Phone 1 Value
ContactField::firstOrCreate([
'account_id' => $contact->account_id,
'contact_id' => $contact->id,
'data' => $data[42],
'contact_field_type_id' => $this->contactFieldPhoneId(),
]);
}
if (! empty($data[14])) {
$birthdate = DateHelper::parseDate($data[14]);
$specialDate = $contact->setSpecialDate('birthdate', $birthdate->year, $birthdate->month, $birthdate->day);
app(CreateReminder::class)->execute([
'account_id' => $contact->account_id,
'contact_id' => $contact->id,
'initial_date' => DateHelper::getDate($specialDate),
'frequency_type' => 'year',
'frequency_number' => 1,
'title' => trans(
'people.people_add_birthday_reminder',
['name' => $contact->first_name]
),
'delible' => false,
]);
}
GetAvatarsFromInternet::dispatch($contact);
}
/**
* Get the default contact field email id for the account.
*
* @return int
*/
private function contactFieldEmailId()
{
if (! $this->contactFieldEmailId) {
$contactFieldType = ContactFieldType::where('type', 'email')->first();
$this->contactFieldEmailId = $contactFieldType->id;
}
return $this->contactFieldEmailId;
}
/**
* Get the default contact field phone id for the account.
*
* @return int
*/
private function contactFieldPhoneId()
{
if (! $this->contactFieldPhoneId) {
$contactFieldType = ContactFieldType::where('type', 'phone')->first();
$this->contactFieldPhoneId = $contactFieldType->id;
}
return $this->contactFieldPhoneId;
}
}