mirror of
https://github.com/snipe/snipe-it.git
synced 2024-11-11 08:04:09 -08:00
348 lines
12 KiB
PHP
348 lines
12 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Livewire;
|
|
|
|
use App\Models\CustomField;
|
|
use Livewire\Component;
|
|
|
|
use App\Models\Import;
|
|
use Storage;
|
|
|
|
use Log;
|
|
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
|
|
|
|
|
class Importer extends Component
|
|
{
|
|
use AuthorizesRequests;
|
|
|
|
public $files;
|
|
public $processDetails;
|
|
|
|
public $progress; //upload progress - '-1' means don't show
|
|
public $progress_message; //progress message
|
|
public $progress_bar_class;
|
|
|
|
public $message; //status/error message?
|
|
public $message_type; //success/error?
|
|
|
|
//originally from ImporterFile
|
|
public $import_errors; //
|
|
public $activeFile; //this gets automatically populated on instantiation (no, it doesn't)
|
|
public $importTypes;
|
|
public $columnOptions;
|
|
public $statusType;
|
|
public $statusText;
|
|
public $update;
|
|
public $send_welcome;
|
|
public $run_backup;
|
|
public $field_map; // we need a separate variable for the field-mapping, because the keys in the normal array are too complicated for Livewire to understand
|
|
|
|
protected $rules = [
|
|
'files.*.file_path' => 'required|string',
|
|
'files.*.created_at' => 'required|string',
|
|
'files.*.filesize' => 'required|integer',
|
|
'activeFile.import_type' => 'string',
|
|
'activeFile.field_map' => 'array',
|
|
'activeFile.header_row' => 'array',
|
|
'field_map' => 'array'
|
|
];
|
|
|
|
protected $listeners = [
|
|
'hideDetails' => 'hideDetails',
|
|
'importError' => 'importError',
|
|
'alert' => 'alert',
|
|
'refreshMe' => '$refresh'
|
|
]; // TODO - try using the 'short' form of this?
|
|
|
|
|
|
|
|
public function generate_field_map()
|
|
{
|
|
$tmp = array_combine($this->activeFile->header_row, $this->field_map);
|
|
return json_encode(array_filter($tmp));
|
|
}
|
|
|
|
static $general = [
|
|
'category' => 'Category',
|
|
'company' => 'Company',
|
|
'email' => 'Email',
|
|
'item_name' => 'Item Name',
|
|
'location' => 'Location',
|
|
'maintained' => 'Maintained',
|
|
'manufacturer' => 'Manufacturer',
|
|
'notes' => 'Notes',
|
|
'order_number' => 'Order Number',
|
|
'purchase_cost' => 'Purchase Cost',
|
|
'purchase_date' => 'Purchase Date',
|
|
'quantity' => 'Quantity',
|
|
'requestable' => 'Requestable',
|
|
'serial' => 'Serial Number',
|
|
'supplier' => 'Supplier',
|
|
'username' => 'Username',
|
|
'department' => 'Department',
|
|
];
|
|
|
|
static $accessories = [
|
|
'model_number' => 'Model Number',
|
|
];
|
|
|
|
static $assets = [
|
|
'asset_tag' => 'Asset Tag',
|
|
'asset_model' => 'Model Name',
|
|
'byod' => 'BYOD',
|
|
'checkout_class' => 'Checkout Type',
|
|
'checkout_location' => 'Checkout Location',
|
|
'image' => 'Image Filename',
|
|
'model_number' => 'Model Number',
|
|
'full_name' => 'Full Name',
|
|
'status' => 'Status',
|
|
'warranty_months' => 'Warranty Months',
|
|
];
|
|
|
|
static $consumables = [
|
|
'item_no' => "Item Number",
|
|
'model_number' => "Model Number",
|
|
'min_amt' => "Minimum Quantity",
|
|
];
|
|
|
|
static $licenses = [
|
|
'asset_tag' => 'Assigned To Asset',
|
|
'expiration_date' => 'Expiration Date',
|
|
'full_name' => 'Full Name',
|
|
'license_email' => 'Licensed To Email',
|
|
'license_name' => 'Licensed To Name',
|
|
'purchase_order' => 'Purchase Order',
|
|
'reassignable' => 'Reassignable',
|
|
'seats' => 'Seats',
|
|
];
|
|
|
|
static $users = [
|
|
'employee_num' => 'Employee Number',
|
|
'first_name' => 'First Name',
|
|
'jobtitle' => 'Job Title',
|
|
'last_name' => 'Last Name',
|
|
'phone_number' => 'Phone Number',
|
|
'manager_first_name' => 'Manager First Name',
|
|
'manager_last_name' => 'Manager Last Name',
|
|
'activated' => 'Activated',
|
|
'address' => 'Address',
|
|
'city' => 'City',
|
|
'state' => 'State',
|
|
'country' => 'Country',
|
|
'vip' => 'VIP'
|
|
];
|
|
|
|
//array of "real fieldnames" to a list of aliases for that field
|
|
static $aliases = [
|
|
'model_number' =>
|
|
[
|
|
'model',
|
|
'model no',
|
|
'model no.',
|
|
'model number',
|
|
'model num',
|
|
'model num.'
|
|
],
|
|
'warranty_months' =>
|
|
[
|
|
'Warranty',
|
|
'Warranty Months'
|
|
],
|
|
'qty' =>
|
|
[
|
|
'QTY',
|
|
'Quantity'
|
|
],
|
|
'min_amt' =>
|
|
[
|
|
'Min Amount',
|
|
'Min QTY'
|
|
],
|
|
'next_audit_date' =>
|
|
[
|
|
'Next Audit',
|
|
],
|
|
|
|
|
|
];
|
|
|
|
private function getColumns($type)
|
|
{
|
|
switch($type) {
|
|
case 'asset':
|
|
$results = self::$general + self::$assets;
|
|
break;
|
|
case 'accessory':
|
|
$results = self::$general + self::$accessories;
|
|
break;
|
|
case 'consumable':
|
|
$results = self::$general + self::$consumables;
|
|
break;
|
|
case 'license':
|
|
$results = self::$general + self::$licenses;
|
|
break;
|
|
case 'user':
|
|
$results = self::$general + self::$users;
|
|
break;
|
|
default:
|
|
$results = self::$general;
|
|
}
|
|
asort($results, SORT_FLAG_CASE|SORT_STRING);
|
|
if($type == "asset") {
|
|
// add Custom Fields after a horizontal line
|
|
$results['-'] = "———".trans('admin/custom_fields/general.custom_fields')."———’";
|
|
foreach(CustomField::orderBy('name')->get() AS $field) {
|
|
$results[$field->db_column_name()] = $field->name;
|
|
}
|
|
}
|
|
return $results;
|
|
}
|
|
|
|
public function updating($name, $new_import_type)
|
|
{
|
|
if ($name == "activeFile.import_type") {
|
|
\Log::info("WE ARE CHANGING THE import_type!!!!! TO: ".$new_import_type);
|
|
// go through each header, find a matching field to try and map it to.
|
|
foreach($this->activeFile->header_row as $i => $header) {
|
|
// do we have something mapped already?
|
|
if (array_key_exists($i, $this->field_map)) {
|
|
// yes, we do. Is it valid for this type of import?
|
|
// (e.g. the import type might have been changed...?)
|
|
if (array_key_exists($this->field_map[$i], $this->columnOptions[$new_import_type])) {
|
|
//yes, this key *is* valid. Continue on to the next field.
|
|
continue;
|
|
} else {
|
|
//no, this key is *INVALID* for this import type. Better set it to null
|
|
// and we'll hope that the aliases or something else picks it up.
|
|
$this->field_map[$i] = null; // fingers crossed! But it's not likely, tbh.
|
|
} // TODO - strictly speaking, this isn't necessary here I don't think.
|
|
}
|
|
// first, check for exact matches
|
|
foreach ($this->columnOptions[$new_import_type] AS $value => $text) {
|
|
if (strcasecmp($text, $header) === 0) { // case-INSENSITIVe on purpose!
|
|
$this->field_map[$i] = $value;
|
|
continue 2; //don't bother with the alias check, go to the next header
|
|
}
|
|
}
|
|
// if you got here, we didn't find a match. Try the aliases
|
|
foreach(self::$aliases as $key => $alias_values) {
|
|
foreach($alias_values as $alias_value) {
|
|
if (strcasecmp($alias_value,$header) === 0) { // aLsO CaSe-INSENSitiVE!
|
|
// Make *absolutely* sure that this key actually _exists_ in this import type -
|
|
// you can trigger this by importing accessories with a 'Warranty' column (which don't exist
|
|
// in "Accessories"!)
|
|
if (array_key_exists($key, $this->columnOptions[$new_import_type])) {
|
|
$this->field_map[$i] = $key;
|
|
continue 3; // bust out of both of these loops; as well as the surrounding one - e.g. move on to the next header
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// and if you got here, we got nothing. Let's recommend 'null'
|
|
$this->field_map[$i] = null; // Booooo :(
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public function mount()
|
|
{
|
|
$this->authorize('import');
|
|
$this->progress = -1; // '-1' means 'don't show the progressbar'
|
|
$this->progress_bar_class = 'progress-bar-warning';
|
|
\Log::info("Hey, we are calling MOUNT (in the importer-file) !!!!!!!!"); //fcuk
|
|
$this->importTypes = [
|
|
'asset' => trans('general.assets'),
|
|
'accessory' => trans('general.accessories'),
|
|
'consumable' => trans('general.consumables'),
|
|
'component' => trans('general.components'),
|
|
'license' => trans('general.licenses'),
|
|
'user' => trans('general.users'),
|
|
];
|
|
|
|
$this->columnOptions[''] = $this->getColumns(''); //blank mode? I don't know what this is supposed to mean
|
|
foreach($this->importTypes AS $type => $name) {
|
|
$this->columnOptions[$type] = $this->getColumns($type);
|
|
}
|
|
if ($this->activeFile) {
|
|
$this->field_map = $this->activeFile->field_map ? array_values($this->activeFile->field_map) : [];
|
|
}
|
|
}
|
|
|
|
public function hideMessages()
|
|
{
|
|
$this->message='';
|
|
}
|
|
|
|
public function importError($errors)
|
|
{
|
|
\Log::debug("Errors fired!!!!");
|
|
\Log::debug(" Here they are...".print_r($errors,true));
|
|
$this->import_errors = $errors;
|
|
}
|
|
|
|
public function alert($obj)
|
|
{
|
|
\Log::debug("Alert object received: ".print_r($obj,true));
|
|
$this->message = $obj;
|
|
$this->message_type = "danger";
|
|
}
|
|
|
|
public function boot() // well, fuck.
|
|
{
|
|
\Log::error("HEY WE ARE DOING FOR THE BOOOTTS!!!!");
|
|
$this->processDetails = null;
|
|
}
|
|
|
|
public function toggleEvent($id)
|
|
{
|
|
// do something here?
|
|
// I mean, I kinda don't get it?
|
|
$gonna_refresh = !!$this->processDetails;
|
|
if($this->processDetails) {
|
|
$this->processDetails = null;
|
|
}
|
|
\Log::error("The ID we are trying to find is AS FOLLOWS: ".$id);
|
|
$this->processDetails = Import::find($id);
|
|
// $this->emit('refreshFile'); ///FUUUUUUUUUUUUUU
|
|
///
|
|
// }
|
|
/// Just literally none of this fucking shit works.
|
|
\Log::error("The import type we are about to try and load up is gonna be this: ".$this->processDetails->import_type);
|
|
|
|
}
|
|
|
|
public function hideDetails()
|
|
{
|
|
$this->processDetails = null;
|
|
}
|
|
|
|
public function destroy($id)
|
|
{
|
|
foreach($this->files as $file) {
|
|
\Log::debug("File id is: ".$file->id);
|
|
if($id == $file->id) {
|
|
if(Storage::delete('private_uploads/imports/'.$file->file_path)) {
|
|
$file->delete();
|
|
|
|
$this->message = trans('admin/hardware/message.import.file_delete_success');
|
|
$this->message_type = 'success';
|
|
return;
|
|
} else {
|
|
$this->message = trans('admin/hardware/message.import.file_delete_error');
|
|
$this->message_type = 'danger';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
$this->files = Import::orderBy('id','desc')->get(); //HACK - slows down renders.
|
|
return view('livewire.importer')
|
|
->extends('layouts.default')
|
|
->section('content');
|
|
}
|
|
}
|