2016-05-17 19:25:17 -07:00
< ? php
namespace App\Console\Commands ;
2016-08-29 15:49:32 -07:00
use App\Helpers\Helper ;
2016-12-26 15:16:42 -08:00
use App\Importer\AccessoryImporter ;
use App\Importer\AssetImporter ;
use App\Importer\ConsumableImporter ;
use App\Importer\Importer ;
2016-05-17 19:25:17 -07:00
use App\Models\Accessory ;
use App\Models\Asset ;
use App\Models\AssetModel ;
use App\Models\Category ;
use App\Models\Company ;
use App\Models\Consumable ;
2016-08-29 15:49:32 -07:00
use App\Models\CustomField ;
2016-05-17 19:25:17 -07:00
use App\Models\Location ;
use App\Models\Manufacturer ;
2016-08-29 15:49:32 -07:00
use App\Models\Setting ;
2016-05-24 15:14:01 -07:00
use App\Models\Statuslabel ;
2016-05-17 19:25:17 -07:00
use App\Models\Supplier ;
use App\Models\User ;
use DB ;
2016-08-29 15:49:32 -07:00
use Illuminate\Console\Command ;
2016-06-13 21:41:09 -07:00
use Illuminate\Database\Eloquent\Model ;
2016-08-29 15:49:32 -07:00
use League\Csv\Reader ;
use Symfony\Component\Console\Input\InputArgument ;
use Symfony\Component\Console\Input\InputOption ;
2016-08-29 22:57:48 -07:00
use ForceUTF8\Encoding ;
2016-06-13 21:41:09 -07:00
ini_set ( 'max_execution_time' , 600 ); //600 seconds = 10 minutes
ini_set ( 'memory_limit' , '500M' );
2016-05-17 19:25:17 -07:00
/**
* Class ObjectImportCommand
*/
2016-06-22 12:27:41 -07:00
class ObjectImportCommand extends Command
{
/**
* The console command name .
*
* @ var string
*/
protected $name = 'snipeit:import' ;
/**
* The console command description .
*
* @ var string
*/
protected $description = 'Import Items from CSV' ;
/**
* Create a new command instance .
*
* @ return void
*/
public function __construct ()
{
parent :: __construct ();
}
2016-12-26 15:16:42 -08:00
private $bar ;
2016-06-22 12:27:41 -07:00
/**
* Execute the console command .
*
* @ return mixed
*/
public function fire ()
{
$filename = $this -> argument ( 'filename' );
2017-01-05 15:45:12 -08:00
$class = title_case ( $this -> option ( 'item-type' ));
$classString = " App \\ Importer \\ { $class } Importer " ;
2017-01-10 16:19:18 -08:00
$importer = new $classString ( $filename );
$importer -> setCallbacks ([ $this , 'log' ], [ $this , 'progress' ], [ $this , 'errorCallback' ])
-> setTestRun ( $this -> option ( 'testrun' ))
-> setUserId ( $this -> option ( 'user_id' ))
-> setUpdating ( $this -> option ( 'update' ))
-> setUsernameFormat ( $this -> option ( 'username_format' ));
2016-12-26 15:16:42 -08:00
$logFile = $this -> option ( 'logfile' );
\Log :: useFiles ( $logFile );
if ( $this -> option ( 'testrun' )) {
$this -> comment ( '====== TEST ONLY Asset Import for ' . $filename . ' ====' );
$this -> comment ( '============== NO DATA WILL BE WRITTEN ==============' );
} else {
$this -> comment ( '======= Importing Assets from ' . $filename . ' =========' );
2016-06-22 12:27:41 -07:00
}
2016-12-26 15:16:42 -08:00
$importer -> import ();
2016-05-17 19:25:17 -07:00
2016-12-26 15:16:42 -08:00
$this -> bar = null ;
2016-06-22 12:27:41 -07:00
2016-12-26 15:16:42 -08:00
if ( ! empty ( $this -> errors )) {
$this -> comment ( " The following Errors were encountered. " );
foreach ( $this -> errors as $asset => $error ) {
$this -> comment ( 'Error: Item: ' . $asset . ' failed validation: ' . json_encode ( $error ));
2016-06-22 12:27:41 -07:00
}
2016-12-26 15:16:42 -08:00
} else {
$this -> comment ( " All Items imported successfully! " );
2016-06-22 12:27:41 -07:00
}
2016-12-26 15:16:42 -08:00
$this -> comment ( " " );
2016-06-13 21:45:52 -07:00
2016-12-26 15:16:42 -08:00
return ;
}
2016-05-26 19:29:29 -07:00
2016-12-26 15:16:42 -08:00
public function errorCallback ( $item , $field , $errorString )
{
$this -> errors [ $item -> name ][ $field ] = $errorString ;
}
public function progress ( $count )
{
2016-12-29 14:02:18 -08:00
if ( ! $this -> bar ) {
2016-12-26 15:16:42 -08:00
$this -> bar = $this -> output -> createProgressBar ( $count );
}
static $index = 0 ;
$index ++ ;
2016-12-29 14:02:18 -08:00
if ( $index < $count ) {
2016-12-26 15:16:42 -08:00
$this -> bar -> advance ();
2016-06-22 12:27:41 -07:00
} else {
2016-12-26 15:16:42 -08:00
$this -> bar -> finish ();
2016-06-22 12:27:41 -07:00
}
}
// Tracks the current item for error messages
2016-10-25 19:51:13 -07:00
private $updating ;
2016-06-22 12:27:41 -07:00
// An array of errors encountered while parsing
private $errors ;
2016-12-26 15:16:42 -08:00
// public function jsonError($field, $errorString)
// {
// $this->errors[$this->current_assetId][$field] = $errorString;
// if ($this->option('verbose')) {
// parent::error($field . $errorString);
// }
// }
2016-06-22 12:27:41 -07:00
/**
* Log a message to file , configurable by the -- log - file parameter .
* If a warning message is passed , we ' ll spit it to the console as well .
*
* @ author Daniel Melzter
* @ since 3.0
* @ param string $string
* @ param string $level
*/
2016-12-26 15:16:42 -08:00
public function log ( $string , $level = 'info' )
2016-06-22 12:27:41 -07:00
{
if ( $level === 'warning' ) {
\Log :: warning ( $string );
$this -> comment ( $string );
} else {
\Log :: Info ( $string );
if ( $this -> option ( 'verbose' )) {
$this -> comment ( $string );
}
}
}
/**
* Get the console command arguments .
*
* @ author Daniel Melzter
* @ since 3.0
* @ return array
*/
protected function getArguments ()
{
return array (
array ( 'filename' , InputArgument :: REQUIRED , 'File for the CSV import.' ),
);
}
/**
* Get the console command options .
*
* @ author Daniel Melzter
* @ since 3.0
* @ return array
*/
protected function getOptions ()
{
return array (
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 ( 'username_format' , null , InputOption :: VALUE_REQUIRED , 'The format of the username that should be generated. Options are firstname.lastname, firstname, filastname, email' , null ),
array ( 'testrun' , null , InputOption :: VALUE_NONE , 'If set, will parse and output data without adding to database' , null ),
array ( 'logfile' , null , InputOption :: VALUE_REQUIRED , 'The path to log output to. storage/logs/importer.log by default' , storage_path ( 'logs/importer.log' ) ),
array ( 'item-type' , null , InputOption :: VALUE_REQUIRED , 'Item Type To import. Valid Options are Asset, Consumable, Or Accessory' , 'Asset' ),
2016-08-29 15:49:32 -07:00
array ( 'web-importer' , null , InputOption :: VALUE_NONE , 'Internal: packages output for use with the web importer' ),
array ( 'user_id' , null , InputOption :: VALUE_REQUIRED , 'ID of user creating items' , 1 ),
array ( 'update' , null , InputOption :: VALUE_NONE , 'If a matching item is found, update item information' ),
2016-06-22 12:27:41 -07:00
);
2016-05-17 19:25:17 -07:00
2016-06-22 12:27:41 -07:00
}
2016-05-31 17:00:11 -07:00
}