Feature: Import users department. (#5987)

Maps to the "Department" header key by default.  Bug: #5382
This commit is contained in:
Daniel Meltzer 2018-07-27 15:02:18 -04:00 committed by snipe
parent 94c79fa69a
commit b58c77c8b8
10 changed files with 82 additions and 44 deletions

View file

@ -66,6 +66,7 @@ abstract class Importer
'phone_number' => 'phone number', 'phone_number' => 'phone number',
'first_name' => 'first name', 'first_name' => 'first name',
'last_name' => 'last name', 'last_name' => 'last name',
'department' => 'department'
]; ];
/** /**
* Map of item fields->csv names * Map of item fields->csv names
@ -150,7 +151,7 @@ abstract class Importer
// This 'inverts' the fields such that we have a collection of fields indexed by name. // This 'inverts' the fields such that we have a collection of fields indexed by name.
$this->customFields = CustomField::All()->reduce(function ($nameLookup, $field) { $this->customFields = CustomField::All()->reduce(function ($nameLookup, $field) {
$nameLookup[$field['name']] = $field; $nameLookup[$field['name']] = $field;
return $nameLookup; return $nameLookup;
}); });
// Remove any custom fields that do not exist in the header row. This prevents nulling out values that shouldn't exist. // Remove any custom fields that do not exist in the header row. This prevents nulling out values that shouldn't exist.
// In detail, we compare the lower case name of custom fields (indexed by name) to the keys in the header row. This // In detail, we compare the lower case name of custom fields (indexed by name) to the keys in the header row. This

View file

@ -147,7 +147,7 @@ class ItemImporter extends Importer
* @param $field string * @param $field string
* @return boolean * @return boolean
*/ */
private function shouldUpdateField($field) protected function shouldUpdateField($field)
{ {
if (empty($field)) { if (empty($field)) {
return false; return false;

View file

@ -3,6 +3,7 @@
namespace App\Importer; namespace App\Importer;
use App\Helpers\Helper; use App\Helpers\Helper;
use App\Models\Department;
use App\Models\User; use App\Models\User;
use App\Notifications\WelcomeNotification; use App\Notifications\WelcomeNotification;
@ -39,6 +40,10 @@ class UserImporter extends ItemImporter
$this->item['phone'] = $this->findCsvMatch($row, 'phone_number'); $this->item['phone'] = $this->findCsvMatch($row, 'phone_number');
$this->item['jobtitle'] = $this->findCsvMatch($row, 'jobtitle'); $this->item['jobtitle'] = $this->findCsvMatch($row, 'jobtitle');
$this->item['employee_num'] = $this->findCsvMatch($row, 'employee_num'); $this->item['employee_num'] = $this->findCsvMatch($row, 'employee_num');
$user_department = $this->findCsvMatch($row, 'department');
if ($this->shouldUpdateField($user_department)) {
$this->item["department_id"] = $this->createOrFetchDepartment($user_department);
}
$user = User::where('username', $this->item['username'])->first(); $user = User::where('username', $this->item['username'])->first();
if ($user) { if ($user) {
if (!$this->updating) { if (!$this->updating) {
@ -78,4 +83,31 @@ class UserImporter extends ItemImporter
$this->logError($user, 'User'); $this->logError($user, 'User');
return; return;
} }
/**
* Fetch an existing department, or create new if it doesn't exist
*
* @author Daniel Melzter
* @since 5.0
* @param $department_name string
* @return int id of department created/found
*/
public function createOrFetchDepartment($department_name)
{
$department = Department::where(['name' => $department_name])->first();
if ($department) {
$this->log('A matching department ' . $department_name . ' already exists');
return $department->id;
}
$department = new department();
$department->name = $department_name;
$department->user_id = $this->user_id;
if ($department->save()) {
$this->log('department ' . $department_name . ' was created');
return $department->id;
}
$this->logError($department, 'Company');
return null;
}
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

34
public/js/dist/all.js vendored

File diff suppressed because one or more lines are too long

View file

@ -1,14 +1,14 @@
{ {
"/js/build/vue.js": "/js/build/vue.js?id=832c22cb5b66ac81ed06", "/js/build/vue.js": "/js/build/vue.js?id=51d77ccb198b24fcc478",
"/css/AdminLTE.css": "/css/AdminLTE.css?id=5e72463a66acbcc740d5", "/css/AdminLTE.css": "/css/AdminLTE.css?id=5e72463a66acbcc740d5",
"/css/app.css": "/css/app.css?id=407edb63cc6b6dc62405", "/css/app.css": "/css/app.css?id=407edb63cc6b6dc62405",
"/css/overrides.css": "/css/overrides.css?id=2d81c3704393bac77011", "/css/overrides.css": "/css/overrides.css?id=2d81c3704393bac77011",
"/js/build/vue.js.map": "/js/build/vue.js.map?id=0deaf852882fe2d65263", "/js/build/vue.js.map": "/js/build/vue.js.map?id=6607c7d7d7f7ccfd4e55",
"/css/AdminLTE.css.map": "/css/AdminLTE.css.map?id=0be7790b84909dca6a0a", "/css/AdminLTE.css.map": "/css/AdminLTE.css.map?id=0be7790b84909dca6a0a",
"/css/app.css.map": "/css/app.css.map?id=96b5c985e860716e6a16", "/css/app.css.map": "/css/app.css.map?id=96b5c985e860716e6a16",
"/css/overrides.css.map": "/css/overrides.css.map?id=f7ce9ca49027594ac402", "/css/overrides.css.map": "/css/overrides.css.map?id=f7ce9ca49027594ac402",
"/css/dist/all.css": "/css/dist/all.css?id=98db4e9b7650453c8b00", "/css/dist/all.css": "/css/dist/all.css?id=98db4e9b7650453c8b00",
"/js/dist/all.js": "/js/dist/all.js?id=c9fd7cd517933dd8f567", "/js/dist/all.js": "/js/dist/all.js?id=eed88600d0a80f50f170",
"/css/build/all.css": "/css/build/all.css?id=98db4e9b7650453c8b00", "/css/build/all.css": "/css/build/all.css?id=98db4e9b7650453c8b00",
"/js/build/all.js": "/js/build/all.js?id=c9fd7cd517933dd8f567" "/js/build/all.js": "/js/build/all.js?id=eed88600d0a80f50f170"
} }

View file

@ -143,6 +143,7 @@ tr {
{id: 'jobtitle', text: 'Job Title' }, {id: 'jobtitle', text: 'Job Title' },
{id: 'last_name', text: 'Last Name' }, {id: 'last_name', text: 'Last Name' },
{id: 'phone_number', text: 'Phone Number' }, {id: 'phone_number', text: 'Phone Number' },
{id: 'department', text: 'Department'}
], ],
customFields: this.customFields, customFields: this.customFields,

View file

@ -689,8 +689,8 @@ EOT;
Notification::fake(); Notification::fake();
$this->signIn(); $this->signIn();
$csv = <<<'EOT' $csv = <<<'EOT'
First Name,Last Name,email,Username,Location,Phone Number,Job Title,Employee Number,Company First Name,Last Name,email,Username,Location,Phone Number,Job Title,Employee Number,Company,Department
Blanche,O'Collopy,bocollopy0@livejournal.com,bocollopy0,Hinapalanan,63-(199)661-2186,Clinical Specialist,7080919053,Morar-Ward Blanche,O'Collopy,bocollopy0@livejournal.com,bocollopy0,Hinapalanan,63-(199)661-2186,Clinical Specialist,7080919053,Morar-Ward,Management
Jessie,Primo,,jprimo1,Korenovsk,7-(885)578-0266,Paralegal,6284292031,Jast-Stiedemann Jessie,Primo,,jprimo1,Korenovsk,7-(885)578-0266,Paralegal,6284292031,Jast-Stiedemann
EOT; EOT;
@ -710,6 +710,10 @@ EOT;
'name' => 'Morar-Ward' 'name' => 'Morar-Ward'
]); ]);
$this->tester->seeRecord('departments', [
'name' => 'Management'
]);
Notification::assertSentTo(User::find(2), \App\Notifications\WelcomeNotification::class); Notification::assertSentTo(User::find(2), \App\Notifications\WelcomeNotification::class);
Notification::assertNotSentTo(User::find(3), \App\Notifications\WelcomeNotification::class); Notification::assertNotSentTo(User::find(3), \App\Notifications\WelcomeNotification::class);
} }