2016-03-25 01:18:05 -07:00
< ? php
namespace App\Console\Commands ;
use Illuminate\Console\Command ;
use Symfony\Component\Console\Input\InputOption ;
use Symfony\Component\Console\Input\InputArgument ;
use League\Csv\Reader ;
2016-05-24 01:51:47 -07:00
use App\Models\User ;
2016-05-24 02:13:28 -07:00
use App\Models\Supplier ;
2016-05-24 02:17:10 -07:00
use App\Models\License ;
use App\Models\LicenseSeat ;
2016-03-25 01:18:05 -07:00
class LicenseImportCommand extends Command {
/**
* The console command name .
*
* @ var string
*/
2016-04-19 00:47:32 -07:00
protected $name = 'snipeit:license-import' ;
2016-03-25 01:18:05 -07:00
/**
* The console command description .
*
* @ var string
*/
protected $description = 'Import Licenses from CSV' ;
/**
* Create a new command instance .
*
* @ return void
*/
public function __construct ()
{
parent :: __construct ();
}
/**
* Execute the console command .
*
* @ return mixed
*/
public function fire ()
{
$filename = $this -> argument ( 'filename' );
if ( ! $this -> option ( 'testrun' ) == 'true' ) {
$this -> comment ( '======= Importing Licenses from ' . $filename . ' =========' );
} else {
$this -> comment ( '====== TEST ONLY License Import for ' . $filename . ' ====' );
$this -> comment ( '============== NO DATA WILL BE WRITTEN ==============' );
}
if ( ! ini_get ( " auto_detect_line_endings " )) {
ini_set ( " auto_detect_line_endings " , '1' );
}
$csv = Reader :: createFromPath ( $this -> argument ( 'filename' ));
$csv -> setNewline ( " \r \n " );
$csv -> setOffset ( 1 );
$duplicates = '' ;
// Loop through the records
$nbInsert = $csv -> each ( function ( $row ) use ( $duplicates ) {
$status_id = 1 ;
// Let's just map some of these entries to more user friendly words
if ( array_key_exists ( '0' , $row )) {
$user_name = trim ( $row [ 0 ]);
} else {
$user_name = '' ;
}
if ( array_key_exists ( '1' , $row )) {
$user_email = trim ( $row [ 1 ]);
} else {
$user_email = '' ;
}
if ( array_key_exists ( '2' , $row )) {
$user_username = trim ( $row [ 2 ]);
} else {
$user_username = '' ;
}
if ( array_key_exists ( '3' , $row )) {
$user_license_name = trim ( $row [ 3 ]);
} else {
$user_license_name = '' ;
}
if ( array_key_exists ( '4' , $row )) {
$user_license_serial = trim ( $row [ 4 ]);
} else {
$user_license_serial = '' ;
}
if ( array_key_exists ( '5' , $row )) {
$user_licensed_to_name = trim ( $row [ 5 ]);
} else {
$user_licensed_to_name = '' ;
}
if ( array_key_exists ( '6' , $row )) {
$user_licensed_to_email = trim ( $row [ 6 ]);
} else {
$user_licensed_to_email = '' ;
}
if ( array_key_exists ( '7' , $row )) {
$user_license_seats = trim ( $row [ 7 ]);
} else {
$user_license_seats = '' ;
}
if ( array_key_exists ( '8' , $row )) {
$user_license_reassignable = trim ( $row [ 8 ]);
if ( $user_license_reassignable != '' ) {
if (( strtolower ( $user_license_reassignable ) == 'yes' ) || ( strtolower ( $user_license_reassignable ) == 'true' ) || ( $user_license_reassignable == '1' )) {
$user_license_reassignable = 1 ;
}
} else {
$user_license_reassignable = 0 ;
}
} else {
$user_license_reassignable = 0 ;
}
if ( array_key_exists ( '9' , $row )) {
$user_license_supplier = trim ( $row [ 9 ]);
} else {
$user_license_supplier = '' ;
}
if ( array_key_exists ( '10' , $row )) {
$user_license_maintained = trim ( $row [ 10 ]);
if ( $user_license_maintained != '' ) {
if (( strtolower ( $user_license_maintained ) == 'yes' ) || ( strtolower ( $user_license_maintained ) == 'true' ) || ( $user_license_maintained == '1' )) {
$user_license_maintained = 1 ;
}
} else {
$user_license_maintained = 0 ;
}
} else {
$user_license_maintained = '' ;
}
if ( array_key_exists ( '11' , $row )) {
$user_license_notes = trim ( $row [ 11 ]);
} else {
$user_license_notes = '' ;
}
if ( array_key_exists ( '12' , $row )) {
if ( $row [ 12 ] != '' ) {
$user_license_purchase_date = date ( " Y-m-d 00:00:01 " , strtotime ( $row [ 12 ]));
} else {
$user_license_purchase_date = '' ;
}
} else {
$user_license_purchase_date = 0 ;
}
// A number was given instead of a name
if ( is_numeric ( $user_name )) {
$this -> comment ( 'User ' . $user_name . ' is not a name - assume this user already exists' );
$user_username = '' ;
// No name was given
} elseif ( $user_name == '' ) {
$this -> comment ( 'No user data provided - skipping user creation, just adding license' );
$first_name = '' ;
$last_name = '' ;
$user_username = '' ;
} else {
$name = explode ( " " , $user_name );
$first_name = $name [ 0 ];
$email_last_name = '' ;
$email_prefix = $first_name ;
if ( ! array_key_exists ( 1 , $name )) {
$last_name = '' ;
$email_last_name = $last_name ;
$email_prefix = $first_name ;
} else {
$last_name = str_replace ( $first_name , '' , $user_name );
if ( $this -> option ( 'email_format' ) == 'filastname' ) {
$email_last_name .= str_replace ( ' ' , '' , $last_name );
$email_prefix = $first_name [ 0 ] . $email_last_name ;
} elseif ( $this -> option ( 'email_format' ) == 'firstname.lastname' ) {
$email_last_name .= str_replace ( ' ' , '' , $last_name );
$email_prefix = $first_name . '.' . $email_last_name ;
} elseif ( $this -> option ( 'email_format' ) == 'firstname' ) {
$email_last_name .= str_replace ( ' ' , '' , $last_name );
$email_prefix = $first_name ;
}
}
$user_username = $email_prefix ;
// Generate an email based on their name if no email address is given
if ( $user_email == '' ) {
if ( $first_name == 'Unknown' ) {
$status_id = 7 ;
}
$email = strtolower ( $email_prefix ) . '@' . $this -> option ( 'domain' );
$user_email = str_replace ( " ' " , '' , $email );
}
}
$this -> comment ( 'Full Name: ' . $user_name );
$this -> comment ( 'First Name: ' . $first_name );
$this -> comment ( 'Last Name: ' . $last_name );
$this -> comment ( 'Username: ' . $user_username );
$this -> comment ( 'Email: ' . $user_email );
$this -> comment ( 'License Name: ' . $user_license_name );
$this -> comment ( 'Serial No: ' . $user_license_serial );
$this -> comment ( 'Licensed To Name: ' . $user_licensed_to_name );
$this -> comment ( 'Licensed To Email: ' . $user_licensed_to_email );
$this -> comment ( 'Seats: ' . $user_license_seats );
$this -> comment ( 'Reassignable: ' . $user_license_reassignable );
$this -> comment ( 'Supplier: ' . $user_license_supplier );
$this -> comment ( 'Maintained: ' . $user_license_maintained );
$this -> comment ( 'Notes: ' . $user_license_notes );
$this -> comment ( 'Purchase Date: ' . $user_license_purchase_date );
$this -> comment ( '------------- Action Summary ----------------' );
if ( $user_username != '' ) {
if ( $user = User :: where ( 'username' , $user_username ) -> whereNotNull ( 'username' ) -> first ()) {
$this -> comment ( 'User ' . $user_username . ' already exists' );
} else {
2016-05-24 01:51:47 -07:00
$user = new \App\Models\User ;
$password = substr ( str_shuffle ( " 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ " ), 0 , 20 );
$user -> first_name = $first_name ;
$user -> last_name = $last_name ;
$user -> username = $user_username ;
$user -> email = $user_email ;
$user -> permissions = '{user":1}' ;
$user -> password = bcrypt ( $password );
$user -> activated = 1 ;
if ( $user -> save ()) {
$this -> comment ( 'User ' . $first_name . ' created' );
} else {
$this -> error ( 'ERROR CREATING User ' . $first_name . ' ' . $last_name );
$this -> error ( $user -> getErrors ());
}
2016-03-25 01:18:05 -07:00
$this -> comment ( 'User ' . $first_name . ' created' );
}
} else {
$user = new User ;
2016-06-21 11:06:53 -07:00
$user -> user_id = null ;
2016-03-25 01:18:05 -07:00
}
// Check for the supplier match and create it if it doesn't exist
if ( $supplier = Supplier :: where ( 'name' , $user_license_supplier ) -> first ()) {
$this -> comment ( 'Supplier ' . $user_license_supplier . ' already exists' );
} else {
$supplier = new Supplier ();
$supplier -> name = e ( $user_license_supplier );
$supplier -> user_id = 1 ;
if ( $supplier -> save ()) {
$this -> comment ( 'Supplier ' . $user_license_supplier . ' was created' );
} else {
$this -> comment ( 'Something went wrong! Supplier ' . $user_license_supplier . ' was NOT created' );
}
}
// Add the license
$license = new License ();
$license -> name = e ( $user_license_name );
if ( $user_license_purchase_date != '' ) {
$license -> purchase_date = $user_license_purchase_date ;
} else {
2016-06-21 11:06:53 -07:00
$license -> purchase_date = null ;
2016-03-25 01:18:05 -07:00
}
$license -> serial = e ( $user_license_serial );
$license -> seats = e ( $user_license_seats );
$license -> supplier_id = $supplier -> id ;
$license -> user_id = 1 ;
if ( $user_license_purchase_date != '' ) {
$license -> purchase_date = $user_license_purchase_date ;
} else {
2016-06-21 11:06:53 -07:00
$license -> purchase_date = null ;
2016-03-25 01:18:05 -07:00
}
$license -> license_name = $user_licensed_to_name ;
$license -> license_email = $user_licensed_to_email ;
$license -> notes = e ( $user_license_notes );
if ( $license -> save ()) {
$this -> comment ( 'License ' . $user_license_name . ' with serial number ' . $user_license_serial . ' was created' );
$license_seat_created = 0 ;
for ( $x = 0 ; $x < $user_license_seats ; $x ++ ) {
// Create the license seat entries
$license_seat = new LicenseSeat ();
$license_seat -> license_id = $license -> id ;
// Only assign the first seat to the user
if ( $x == 0 ) {
$license_seat -> assigned_to = $user -> id ;
} else {
2016-06-21 11:06:53 -07:00
$license_seat -> assigned_to = null ;
2016-03-25 01:18:05 -07:00
}
if ( $license_seat -> save ()) {
$license_seat_created ++ ;
}
}
if ( $license_seat_created > 0 ) {
$this -> comment ( $license_seat_created . ' seats were created' );
} else {
$this -> comment ( 'Something went wrong! NO seats for ' . $user_license_name . ' were created' );
}
} else {
$this -> comment ( 'Something went wrong! License ' . $user_license_name . ' was NOT created' );
}
$this -> comment ( '=====================================' );
return true ;
});
}
/**
* Get the console command arguments .
*
* @ return array
*/
protected function getArguments ()
{
return array (
array ( 'filename' , InputArgument :: REQUIRED , 'File for the CSV import.' ),
);
}
/**
* Get the console command options .
*
* @ return array
*/
protected function getOptions ()
{
return array (
array ( 'domain' , null , InputOption :: VALUE_REQUIRED , 'Email domain for generated email addresses.' , null ),
array ( 'email_format' , null , InputOption :: VALUE_REQUIRED , 'The format of the email addresses that should be generated. Options are firstname.lastname, firstname, filastname' , null ),
array ( 'testrun' , null , InputOption :: VALUE_REQUIRED , 'Test the output without writing to the database or not.' , null ),
);
}
}