Compare commits
123 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f88fee0f21 | |||
| c0669150fb | |||
| f3c12f38b6 | |||
| 5e19178a30 | |||
| 90cddb7aee | |||
| 6d828964be | |||
| 971fcf5800 | |||
| 2ad270cf33 | |||
| 8ce78c6b31 | |||
| af3c8195af | |||
| 117b4c59cc | |||
| 194d0733d4 | |||
| a371e8d53f | |||
| 8f09cca043 | |||
| 39bca49e8f | |||
| b8269020ae | |||
| 601c129bbf | |||
| b293d00699 | |||
| 75a0cf97e2 | |||
| c055e3af21 | |||
| a1f93e733c | |||
| 49073742b5 | |||
| 187206cb88 | |||
| 8420cb7ec1 | |||
| 75252bce05 | |||
| 794824713e | |||
| 8f6ea84fca | |||
| ea1b792a93 | |||
| 4ffb8f14b8 | |||
| d023f61bc4 | |||
| dd5ca73602 | |||
| 2632f730d1 | |||
| 24c158bfe6 | |||
| 3d4a5a8066 | |||
| db7e0b56f2 | |||
| f2478d813c | |||
| 192aa9eb71 | |||
| 0eef0fc1dd | |||
| 81f8fe34cd | |||
| f744696043 | |||
| 29b0780c6c | |||
| 6b3b673daa | |||
| a4876e9f3e | |||
| 925258bfb4 | |||
| 1a10aa0dda | |||
| d6f8d1b464 | |||
| 09a102fea8 | |||
| 304fce73fc | |||
| 295a68bb7a | |||
| 3aeb521782 | |||
| f587d2248b | |||
| 8579c5a68a | |||
| 835b461d7d | |||
| b8a37a0c73 | |||
| 41b5b1dfd0 | |||
| c7596e7741 | |||
| d4fa81301d | |||
| ec7245965f | |||
| de76e8db5f | |||
| a52575c7bf | |||
| bf6703c2e8 | |||
| 4db1dd8afc | |||
| c39e3acb59 | |||
| 7a44da85a0 | |||
| 890b613f71 | |||
| 1014bd74e0 | |||
| db385e024b | |||
| c8bff3ef38 | |||
| 10bc35d604 | |||
| eea65a3f26 | |||
| 3b21a19491 | |||
| 7a52477294 | |||
| ef0bd72076 | |||
| ff824ec4db | |||
| 75032def9e | |||
| 3a0f738fb0 | |||
| 55846cc717 | |||
| 1784278a59 | |||
| afac0bc441 | |||
| ffbee77f6f | |||
| b69b5fdf84 | |||
| 89e06054bf | |||
| 3159e7713a | |||
| adf6e7d1cd | |||
| ba3662a9ed | |||
| 05ea61421f | |||
| 22ef2ce0b6 | |||
| 51d3d130e4 | |||
| d8a8e1cc09 | |||
| 522dc1db2a | |||
| db907815ff | |||
| ae6abdddad | |||
| 63c9fbe10c | |||
| 101dfd01f2 | |||
| 5db5134ae0 | |||
| 5294489b0e | |||
| 05b2b8fb59 | |||
| 0100c56046 | |||
| e81b221fd1 | |||
| f374ac1bf7 | |||
| 524c6c502e | |||
| 614e858e44 | |||
| 708b1a962c | |||
| 4e55a18a60 | |||
| 3de1de9dc6 | |||
| e320d2ba05 | |||
| ed78a4b8a0 | |||
| 376eb52f00 | |||
| 8ecceeacda | |||
| f4cfb31bf4 | |||
| 227dc7e81d | |||
| 152d985ebc | |||
| ef1e8df001 | |||
| 5c2b1a3b70 | |||
| 66c3f5432d | |||
| de413408f5 | |||
| 059126f642 | |||
| 3bc43210ab | |||
| 82194cef8a | |||
| 1956a16d1e | |||
| e1c095adca | |||
| 45a2932f4b | |||
| b6e3715cd8 |
@@ -1641,6 +1641,15 @@
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Azerothian",
|
||||
"name": "Azerothian",
|
||||
"avatar_url": "https://avatars1.githubusercontent.com/u/264022?v=4",
|
||||
"profile": "https://www.illisian.com.au",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
+8
-2
@@ -7,7 +7,6 @@ APP_KEY=ChangeMe
|
||||
APP_URL=null
|
||||
APP_TIMEZONE='UTC'
|
||||
APP_LOCALE=en
|
||||
BACKUP_ENV=false
|
||||
|
||||
# --------------------------------------------
|
||||
# REQUIRED: DATABASE SETTINGS
|
||||
@@ -73,13 +72,20 @@ ENABLE_CSP=false
|
||||
CACHE_DRIVER=file
|
||||
SESSION_DRIVER=file
|
||||
QUEUE_DRIVER=sync
|
||||
CACHE_PREFIX=snipeit
|
||||
|
||||
# --------------------------------------------
|
||||
# OPTIONAL: REDIS SETTINGS
|
||||
# --------------------------------------------
|
||||
REDIS_HOST=null
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT-null
|
||||
REDIS_PORT=null
|
||||
|
||||
# --------------------------------------------
|
||||
# OPTIONAL: MEMCACHED SETTINGS
|
||||
# --------------------------------------------
|
||||
MEMCACHED_HOST=null
|
||||
MEMCACHED_PORT=null
|
||||
|
||||
# --------------------------------------------
|
||||
# OPTIONAL: AWS S3 SETTINGS
|
||||
|
||||
@@ -50,3 +50,4 @@ tests/_support/_generated/*
|
||||
/storage/oauth-public.key
|
||||
|
||||
*.cache
|
||||
/public/storage
|
||||
|
||||
+7
-2
@@ -16,8 +16,13 @@ services:
|
||||
php:
|
||||
- 5.6
|
||||
- 7.0
|
||||
- 7.2
|
||||
- 7.1.4
|
||||
- 7.1
|
||||
- 7.2
|
||||
- 7.3
|
||||
|
||||
matrix:
|
||||
allow_failures:
|
||||
- php: 7.3
|
||||
|
||||
# execute any number of scripts before the test run, custom env's are available as variables
|
||||
before_script:
|
||||
|
||||
@@ -20,6 +20,7 @@ vim \
|
||||
git \
|
||||
cron \
|
||||
mysql-client \
|
||||
cron \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
[](https://travis-ci.org/snipe/snipe-it) [](https://crowdin.com/project/snipe-it) [](https://gitter.im/snipe/snipe-it?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [](https://hub.docker.com/r/snipe/snipe-it/) [](https://twitter.com/snipeitapp) [](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&utm_medium=referral&utm_content=snipe/snipe-it&utm_campaign=Badge_Grade)
|
||||
[](#contributors) [](https://www.codetriage.com/snipe/snipe-it)
|
||||
[](#contributors) [](https://www.codetriage.com/snipe/snipe-it)
|
||||
|
||||
|
||||
## Snipe-IT - Open Source Asset Management System
|
||||
@@ -10,7 +10,7 @@ It is built on [Laravel 5.4](http://laravel.com).
|
||||
|
||||
Snipe-IT is actively developed and we're [releasing quite frequently](https://github.com/snipe/snipe-it/releases). ([Check out the live demo here](https://snipeitapp.com/demo/).)
|
||||
|
||||
__This is web-based software__. This means there there is no executable file (aka no .exe files), and it must be run on a web server and accessed through a web browser. It runs on any Mac OSX, flavor of Linux, as well as Windows, and we have a [Docker image](https://snipe-it.readme.io/docs/docker) available if that's what you're into.
|
||||
__This is web-based software__. This means there is no executable file (aka no .exe files), and it must be run on a web server and accessed through a web browser. It runs on any Mac OSX, flavor of Linux, as well as Windows, and we have a [Docker image](https://snipe-it.readme.io/docs/docker) available if that's what you're into.
|
||||
|
||||
-----
|
||||
|
||||
@@ -95,7 +95,7 @@ Thanks goes to all of these wonderful people ([emoji key](https://github.com/ken
|
||||
| [<img src="https://avatars2.githubusercontent.com/u/982885?v=4" width="110px;"/><br /><sub>Martin Stub</sub>](http://martinstub.dk)<br />[🌍](#translation-stubben "Translation") | [<img src="https://avatars2.githubusercontent.com/u/28959963?v=4" width="110px;"/><br /><sub>Meyer Flavio</sub>](https://github.com/meyerf99)<br />[🌍](#translation-meyerf99 "Translation") | [<img src="https://avatars3.githubusercontent.com/u/796443?v=4" width="110px;"/><br /><sub>Micael Rodrigues</sub>](https://github.com/MicaelRodrigues)<br />[🌍](#translation-MicaelRodrigues "Translation") | [<img src="https://avatars0.githubusercontent.com/u/10481331?v=4" width="110px;"/><br /><sub>Mikael Rasmussen</sub>](http://rubixy.com/)<br />[🌍](#translation-mikaelssen "Translation") | [<img src="https://avatars1.githubusercontent.com/u/1544552?v=4" width="110px;"/><br /><sub>IxFail</sub>](https://github.com/IxFail)<br />[🌍](#translation-IxFail "Translation") | [<img src="https://avatars3.githubusercontent.com/u/18483118?v=4" width="110px;"/><br /><sub>Mohammed Fota</sub>](http://www.mohammedfota.com)<br />[🌍](#translation-MohammedFota "Translation") | [<img src="https://avatars0.githubusercontent.com/u/227080?v=4" width="110px;"/><br /><sub>Moayad Alserihi</sub>](https://github.com/omego)<br />[🌍](#translation-omego "Translation") |
|
||||
| [<img src="https://avatars0.githubusercontent.com/u/1680266?v=4" width="110px;"/><br /><sub>saymd</sub>](https://github.com/saymd)<br />[🌍](#translation-saymd "Translation") | [<img src="https://avatars0.githubusercontent.com/u/1826808?v=4" width="110px;"/><br /><sub>Patrik Larsson</sub>](https://nordsken.se)<br />[🌍](#translation-pooot "Translation") | [<img src="https://avatars1.githubusercontent.com/u/20584746?v=4" width="110px;"/><br /><sub>drcryo</sub>](https://github.com/drcryo)<br />[🌍](#translation-drcryo "Translation") | [<img src="https://avatars1.githubusercontent.com/u/19408004?v=4" width="110px;"/><br /><sub>pawel1615</sub>](https://github.com/pawel1615)<br />[🌍](#translation-pawel1615 "Translation") | [<img src="https://avatars2.githubusercontent.com/u/23340468?v=4" width="110px;"/><br /><sub>bodrovics</sub>](https://github.com/bodrovics)<br />[🌍](#translation-bodrovics "Translation") | [<img src="https://avatars0.githubusercontent.com/u/3257654?v=4" width="110px;"/><br /><sub>priatna</sub>](https://github.com/priatna)<br />[🌍](#translation-priatna "Translation") | [<img src="https://avatars1.githubusercontent.com/u/5358374?v=4" width="110px;"/><br /><sub>Fan Jiang</sub>](https://amayume.net)<br />[🌍](#translation-ProfFan "Translation") |
|
||||
| [<img src="https://avatars1.githubusercontent.com/u/22555451?v=4" width="110px;"/><br /><sub>ragnarcx</sub>](https://github.com/ragnarcx)<br />[🌍](#translation-ragnarcx "Translation") | [<img src="https://avatars2.githubusercontent.com/u/18654582?v=4" width="110px;"/><br /><sub>Rein van Haaren</sub>](http://www.reinvanhaaren.nl/)<br />[🌍](#translation-reinvanhaaren "Translation") | [<img src="https://avatars1.githubusercontent.com/u/386672?v=4" width="110px;"/><br /><sub>Teguh Dwicaksana</sub>](http://dheche.songolimo.net)<br />[🌍](#translation-dheche "Translation") | [<img src="https://avatars2.githubusercontent.com/u/2572552?v=4" width="110px;"/><br /><sub>fraccie</sub>](https://github.com/FRaccie)<br />[🌍](#translation-FRaccie "Translation") | [<img src="https://avatars0.githubusercontent.com/u/35182720?v=4" width="110px;"/><br /><sub>vinzruzell</sub>](https://github.com/vinzruzell)<br />[🌍](#translation-vinzruzell "Translation") | [<img src="https://avatars1.githubusercontent.com/u/7883603?v=4" width="110px;"/><br /><sub>Kevin Austin</sub>](http://kevinaustin.com)<br />[🌍](#translation-vipsystem "Translation") | [<img src="https://avatars3.githubusercontent.com/u/3861828?v=4" width="110px;"/><br /><sub>Wira Sandy</sub>](http://azuraweb.xyz)<br />[🌍](#translation-wira-sandy "Translation") |
|
||||
| [<img src="https://avatars2.githubusercontent.com/u/8663789?v=4" width="110px;"/><br /><sub>Илья</sub>](https://github.com/GrayHoax)<br />[🌍](#translation-GrayHoax "Translation") | [<img src="https://avatars3.githubusercontent.com/u/30119111?v=4" width="110px;"/><br /><sub>GodUseVPN</sub>](https://github.com/godusevpn)<br />[🌍](#translation-godusevpn "Translation") | [<img src="https://avatars1.githubusercontent.com/u/745576?v=4" width="110px;"/><br /><sub>周周</sub>](https://github.com/EngrZhou)<br />[🌍](#translation-EngrZhou "Translation") | [<img src="https://avatars3.githubusercontent.com/u/1631095?v=4" width="110px;"/><br /><sub>Sam</sub>](https://github.com/takuy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=takuy "Code") |
|
||||
| [<img src="https://avatars2.githubusercontent.com/u/8663789?v=4" width="110px;"/><br /><sub>Илья</sub>](https://github.com/GrayHoax)<br />[🌍](#translation-GrayHoax "Translation") | [<img src="https://avatars3.githubusercontent.com/u/30119111?v=4" width="110px;"/><br /><sub>GodUseVPN</sub>](https://github.com/godusevpn)<br />[🌍](#translation-godusevpn "Translation") | [<img src="https://avatars1.githubusercontent.com/u/745576?v=4" width="110px;"/><br /><sub>周周</sub>](https://github.com/EngrZhou)<br />[🌍](#translation-EngrZhou "Translation") | [<img src="https://avatars3.githubusercontent.com/u/1631095?v=4" width="110px;"/><br /><sub>Sam</sub>](https://github.com/takuy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=takuy "Code") | [<img src="https://avatars1.githubusercontent.com/u/264022?v=4" width="110px;"/><br /><sub>Azerothian</sub>](https://www.illisian.com.au)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Azerothian "Code") |
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
||||
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!
|
||||
|
||||
@@ -128,15 +128,21 @@ class LdapSync extends Command
|
||||
$location_users = Ldap::findLdapUsers($ldap_loc["ldap_ou"]);
|
||||
$usernames = array();
|
||||
for ($i = 0; $i < $location_users["count"]; $i++) {
|
||||
$location_users[$i]["ldap_location_override"] = true;
|
||||
$location_users[$i]["location_id"] = $ldap_loc["id"];
|
||||
$usernames[] = $location_users[$i][$ldap_result_username][0];
|
||||
|
||||
if (array_key_exists($ldap_result_username, $location_users[$i])) {
|
||||
$location_users[$i]["ldap_location_override"] = true;
|
||||
$location_users[$i]["location_id"] = $ldap_loc["id"];
|
||||
$usernames[] = $location_users[$i][$ldap_result_username][0];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Delete located users from the general group.
|
||||
foreach ($results as $key => $generic_entry) {
|
||||
if (in_array($generic_entry[$ldap_result_username][0], $usernames)) {
|
||||
unset($results[$key]);
|
||||
if ((is_array($generic_entry)) && (array_key_exists($ldap_result_username, $generic_entry))) {
|
||||
if (in_array($generic_entry[$ldap_result_username][0], $usernames)) {
|
||||
unset($results[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,11 +168,15 @@ class LdapSync extends Command
|
||||
$item["ldap_location_override"] = isset($results[$i]["ldap_location_override"]) ? $results[$i]["ldap_location_override"]:"";
|
||||
$item["location_id"] = isset($results[$i]["location_id"]) ? $results[$i]["location_id"]:"";
|
||||
|
||||
|
||||
// This is active directory, not regular LDAP
|
||||
if ( array_key_exists('useraccountcontrol', $results[$i]) ) {
|
||||
$enabled_accounts = [
|
||||
'512', '544', '66048', '66080', '262656', '262688', '328192', '328224'
|
||||
];
|
||||
$item['activated'] = ( in_array($results[$i]['useraccountcontrol'][0], $enabled_accounts) ) ? 1 : 0;
|
||||
|
||||
// Fall through to LDAP
|
||||
} else {
|
||||
$item['activated'] = 0;
|
||||
}
|
||||
|
||||
@@ -74,6 +74,7 @@ class ObjectImportCommand extends Command
|
||||
$importer->setCallbacks([$this, 'log'], [$this, 'progress'], [$this, 'errorCallback'])
|
||||
->setUserId($this->option('user_id'))
|
||||
->setUpdating($this->option('update'))
|
||||
->setShouldNotify($this->option('send-welcome'))
|
||||
->setUsernameFormat($this->option('username_format'));
|
||||
|
||||
$logFile = $this->option('logfile');
|
||||
@@ -172,6 +173,7 @@ class ObjectImportCommand extends Command
|
||||
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'),
|
||||
array('send-welcome', null, InputOption::VALUE_NONE, 'Whether to send a welcome email to any new users that are created.'),
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
@@ -79,6 +79,7 @@ class PaveIt extends Command
|
||||
DB::statement('delete from accessories_users');
|
||||
DB::statement('delete from asset_logs');
|
||||
DB::statement('delete from asset_maintenances');
|
||||
DB::statement('delete from login_attempts');
|
||||
DB::statement('delete from asset_uploads');
|
||||
DB::statement('delete from action_logs');
|
||||
DB::statement('delete from checkout_requests');
|
||||
|
||||
@@ -63,6 +63,8 @@ class ResetDemoSettings extends Command
|
||||
$settings->time_display_format = 'g:iA';
|
||||
$settings->thumbnail_max_h = '30';
|
||||
$settings->locale = 'en';
|
||||
$settings->version_footer = 'on';
|
||||
$settings->support_footer = 'on';
|
||||
$settings->save();
|
||||
|
||||
if ($user = User::where('username', '=', 'admin')->first()) {
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use App\Models\User;
|
||||
use App\Models\Actionlog;
|
||||
use App\Models\Asset;
|
||||
use App\Models\Consumable;
|
||||
use App\Models\Accessory;
|
||||
use App\Models\LicenseSeat;
|
||||
use App\Models\License;
|
||||
use DB;
|
||||
use Artisan;
|
||||
|
||||
class RestoreDeletedUsers extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'snipeit:restore-users {--start_date=} {--end_date=}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Restore users, and any associated assets and license checkouts.';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
|
||||
$start_date = $this->option('start_date');
|
||||
$end_date = $this->option('end_date');
|
||||
$asset_totals = 0;
|
||||
$license_totals = 0;
|
||||
$user_count = 0;
|
||||
|
||||
|
||||
if (($start_date=='') || ($end_date=='')) {
|
||||
$this->info('ERROR: All fields are required.');
|
||||
return false;
|
||||
}
|
||||
|
||||
$users = User::whereBetween('deleted_at', [$start_date, $end_date])->withTrashed()->get();
|
||||
$this->info('There are '.$users->count().' users deleted between '.$start_date.' and '.$end_date);
|
||||
$this->warn('Making a backup!');
|
||||
Artisan::call('backup:run');
|
||||
|
||||
foreach ($users as $user) {
|
||||
$user_count++;
|
||||
$user_logs = Actionlog::where('target_id', $user->id)->where('target_type',User::class)
|
||||
->where('action_type','checkout')->with('item')->get();
|
||||
|
||||
$this->info($user_count.'. '.$user->username.' ('.$user->id.') was deleted at '.$user->deleted_at. ' and has '.$user_logs->count().' checkouts associated.');
|
||||
|
||||
foreach ($user_logs as $user_log) {
|
||||
$this->info(' * '.$user_log->item_type.': '.$user_log->item->name.' - item_id: '.$user_log->item_id);
|
||||
|
||||
if ($user_log->item_type==Asset::class) {
|
||||
$asset_totals++;
|
||||
|
||||
DB::table('assets')
|
||||
->where('id', $user_log->item_id)
|
||||
->update(['assigned_to' => $user->id, 'assigned_type'=> User::class]);
|
||||
|
||||
$this->info(' ** Asset '.$user_log->item->id.' ('.$user_log->item->asset_tag.') restored to user '.$user->id.'');
|
||||
|
||||
} elseif ($user_log->item_type==License::class) {
|
||||
$license_totals++;
|
||||
|
||||
$avail_seat = DB::table('license_seats')->where('license_id','=',$user_log->item->id)
|
||||
->whereNull('assigned_to')->whereNull('asset_id')->whereBetween('updated_at', [$start_date, $end_date])->first();
|
||||
if ($avail_seat) {
|
||||
$this->info(' ** Allocating seat '.$avail_seat->id.' for this License');
|
||||
|
||||
DB::table('license_seats')
|
||||
->where('id', $avail_seat->id)
|
||||
->update(['assigned_to' => $user->id]);
|
||||
|
||||
} else {
|
||||
$this->warn('ERROR: No available seats for '.$user_log->item->name);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$this->warn('Restoring user '.$user->username.'!');
|
||||
$user->restore();
|
||||
|
||||
|
||||
}
|
||||
|
||||
$this->info($asset_totals.' assets affected');
|
||||
$this->info($license_totals.' licenses affected');
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -57,12 +57,12 @@ class SendExpectedCheckinAlerts extends Command
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Send a rollup to the admin, if settings dictate
|
||||
$recipient = new \App\Models\Recipients\AlertRecipient();
|
||||
|
||||
if (($assets) && ($assets->count() > 0) && ($settings->alert_email!='')) {
|
||||
$recipient->notify(new ExpectedCheckinAdminNotification($assets));
|
||||
if (($assets) && ($assets->count() > 0) && ($settings->alert_email != '')) {
|
||||
// Send a rollup to the admin, if settings dictate
|
||||
$recipients = collect(explode(',', $settings->alert_email))->map(function ($item, $key) {
|
||||
return new \App\Models\Recipients\AlertRecipient($item);
|
||||
});
|
||||
\Notification::send($recipients, new ExpectedCheckinAdminNotification($assets));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -50,26 +50,28 @@ class SendExpirationAlerts extends Command
|
||||
$threshold = $settings->alert_interval;
|
||||
|
||||
|
||||
// Expiring Assets
|
||||
$assets = Asset::getExpiringWarrantee(Setting::getSettings()->alert_interval);
|
||||
$this->info(trans_choice('mail.assets_warrantee_alert', $assets->count(), ['count'=>$assets->count(), 'threshold' => $threshold]));
|
||||
if (($settings->alert_email != '') && ($settings->alerts_enabled == 1)) {
|
||||
|
||||
// Expiring licenses
|
||||
$licenses = License::getExpiringLicenses($threshold);
|
||||
|
||||
$this->info(trans_choice('mail.license_expiring_alert', $licenses->count(), ['count'=>$licenses->count(), 'threshold' => $threshold]));
|
||||
|
||||
$recipient = new \App\Models\Recipients\AlertRecipient();
|
||||
|
||||
if ((Setting::getSettings()->alert_email!='') && ($settings->alerts_enabled==1)) {
|
||||
// Send a rollup to the admin, if settings dictate
|
||||
$recipients = collect(explode(',', $settings->alert_email))->map(function ($item, $key) {
|
||||
return new \App\Models\Recipients\AlertRecipient($item);
|
||||
});
|
||||
|
||||
// Expiring Assets
|
||||
$assets = Asset::getExpiringWarrantee(Setting::getSettings()->alert_interval);
|
||||
if ($assets->count() > 0) {
|
||||
// Send a rollup to the admin, if settings dictate
|
||||
$recipient->notify(new ExpiringAssetsNotification($assets, $threshold));
|
||||
$this->info(trans_choice('mail.assets_warrantee_alert', $assets->count(),
|
||||
['count' => $assets->count(), 'threshold' => $threshold]));
|
||||
\Notification::send($recipients, new ExpiringAssetsNotification($assets, $threshold));
|
||||
}
|
||||
|
||||
// Expiring licenses
|
||||
$licenses = License::getExpiringLicenses($threshold);
|
||||
|
||||
|
||||
if ($licenses->count() > 0) {
|
||||
$recipient->notify(new ExpiringLicenseNotification($licenses, $threshold));
|
||||
$this->info(trans_choice('mail.license_expiring_alert', $licenses->count(), ['count' => $licenses->count(), 'threshold' => $threshold]));
|
||||
\Notification::send($recipients, new ExpiringLicenseNotification($licenses, $threshold));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -50,13 +50,14 @@ class SendInventoryAlerts extends Command
|
||||
$items = Helper::checkLowInventory();
|
||||
|
||||
// Send a rollup to the admin, if settings dictate
|
||||
$recipient = new \App\Models\Recipients\AlertRecipient();
|
||||
|
||||
if (($items) && (count($items) > 0) && ($settings->alert_email!='')) {
|
||||
|
||||
$this->info( trans_choice('mail.low_inventory_alert',count($items)) );
|
||||
|
||||
$recipient->notify(new InventoryAlert($items, $settings->alert_threshold));
|
||||
if (($items) && (count($items) > 0)) {
|
||||
$this->info(trans_choice('mail.low_inventory_alert', count($items)));
|
||||
// Send a rollup to the admin, if settings dictate
|
||||
$recipients = collect(explode(',', $settings->alert_email))->map(function ($item, $key) {
|
||||
return new \App\Models\Recipients\AlertRecipient($item);
|
||||
});
|
||||
\Notification::send($recipients, new InventoryAlert($items, $settings->alert_threshold));
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
@@ -30,6 +30,7 @@ class Kernel extends ConsoleKernel
|
||||
Commands\SyncAssetLocations::class,
|
||||
Commands\RegenerateAssetTags::class,
|
||||
Commands\SyncAssetCounters::class,
|
||||
Commands\RestoreDeletedUsers::class,
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
@@ -291,7 +291,7 @@ class AssetsController extends Controller
|
||||
$this->authorize('view', $asset);
|
||||
return (new AssetsTransformer)->transformAsset($asset);
|
||||
}
|
||||
return response()->json(Helper::formatStandardApiResponse('error', null, 'Asset not found'), 404);
|
||||
return response()->json(Helper::formatStandardApiResponse('error', null, 'Asset not found'), 200);
|
||||
|
||||
}
|
||||
|
||||
@@ -310,7 +310,7 @@ class AssetsController extends Controller
|
||||
$this->authorize('view', $assets);
|
||||
return (new AssetsTransformer)->transformAssets($assets, $assets->count());
|
||||
}
|
||||
return response()->json(Helper::formatStandardApiResponse('error', null, 'Asset not found'), 404);
|
||||
return response()->json(Helper::formatStandardApiResponse('error', null, 'Asset not found'), 200);
|
||||
|
||||
}
|
||||
|
||||
@@ -468,43 +468,15 @@ class AssetsController extends Controller
|
||||
$this->authorize('update', Asset::class);
|
||||
|
||||
if ($asset = Asset::find($id)) {
|
||||
($request->has('model_id')) ?
|
||||
$asset->model()->associate(AssetModel::find($request->get('model_id'))) : '';
|
||||
($request->has('name')) ?
|
||||
$asset->name = $request->get('name') : '';
|
||||
($request->has('serial')) ?
|
||||
$asset->serial = $request->get('serial') : '';
|
||||
($request->has('model_id')) ?
|
||||
$asset->model_id = $request->get('model_id') : '';
|
||||
($request->has('order_number')) ?
|
||||
$asset->order_number = $request->get('order_number') : '';
|
||||
($request->has('notes')) ?
|
||||
$asset->notes = $request->get('notes') : '';
|
||||
($request->has('asset_tag')) ?
|
||||
$asset->asset_tag = $request->get('asset_tag') : '';
|
||||
($request->has('archived')) ?
|
||||
$asset->archived = $request->get('archived') : '';
|
||||
($request->has('status_id')) ?
|
||||
$asset->status_id = $request->get('status_id') : '';
|
||||
($request->has('warranty_months')) ?
|
||||
$asset->warranty_months = $request->get('warranty_months') : '';
|
||||
($request->has('purchase_cost')) ?
|
||||
$asset->purchase_cost = Helper::ParseFloat($request->get('purchase_cost')) : '';
|
||||
($request->has('purchase_date')) ?
|
||||
$asset->purchase_date = $request->get('purchase_date') : '';
|
||||
($request->has('assigned_to')) ?
|
||||
$asset->assigned_to = $request->get('assigned_to') : '';
|
||||
($request->has('supplier_id')) ?
|
||||
$asset->supplier_id = $request->get('supplier_id') : '';
|
||||
($request->has('requestable')) ?
|
||||
$asset->requestable = $request->get('requestable') : '';
|
||||
($request->has('rtd_location_id')) ?
|
||||
$asset->rtd_location_id = $request->get('rtd_location_id') : '';
|
||||
($request->has('rtd_location_id')) ?
|
||||
$asset->location_id = $request->get('rtd_location_id') : '';
|
||||
($request->has('company_id')) ?
|
||||
$asset->company_id = Company::getIdForCurrentUser($request->get('company_id')) : '';
|
||||
|
||||
$asset->fill($request->all());
|
||||
|
||||
($request->has('model_id')) ?
|
||||
$asset->model()->associate(AssetModel::find($request->get('model_id'))) : null;
|
||||
($request->has('company_id')) ?
|
||||
$asset->company_id = Company::getIdForCurrentUser($request->get('company_id')) : null;
|
||||
($request->has('rtd_location_id')) ?
|
||||
$asset->location_id = $request->get('rtd_location_id') : null;
|
||||
|
||||
// Update custom fields
|
||||
if (($model = AssetModel::find($asset->model_id)) && (isset($model->fieldset))) {
|
||||
|
||||
@@ -106,7 +106,26 @@ class LocationsController extends Controller
|
||||
public function show($id)
|
||||
{
|
||||
$this->authorize('view', Location::class);
|
||||
$location = Location::findOrFail($id);
|
||||
$location = Location::with('parent', 'manager', 'childLocations')
|
||||
->select([
|
||||
'locations.id',
|
||||
'locations.name',
|
||||
'locations.address',
|
||||
'locations.address2',
|
||||
'locations.city',
|
||||
'locations.state',
|
||||
'locations.zip',
|
||||
'locations.country',
|
||||
'locations.parent_id',
|
||||
'locations.manager_id',
|
||||
'locations.created_at',
|
||||
'locations.updated_at',
|
||||
'locations.image',
|
||||
'locations.currency'
|
||||
])
|
||||
->withCount('assignedAssets')
|
||||
->withCount('assets')
|
||||
->withCount('users')->findOrFail($id);
|
||||
return (new LocationsTransformer)->transformLocation($location);
|
||||
}
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ class ManufacturersController extends Controller
|
||||
public function show($id)
|
||||
{
|
||||
$this->authorize('view', Manufacturer::class);
|
||||
$manufacturer = Manufacturer::findOrFail($id);
|
||||
$manufacturer = Manufacturer::withCount('assets')->withCount('licenses')->withCount('consumables')->withCount('accessories')->findOrFail($id);
|
||||
return (new ManufacturersTransformer)->transformManufacturer($manufacturer);
|
||||
}
|
||||
|
||||
|
||||
@@ -238,8 +238,7 @@ class StatuslabelsController extends Controller
|
||||
*/
|
||||
public function checkIfDeployable($id) {
|
||||
$statuslabel = Statuslabel::findOrFail($id);
|
||||
|
||||
$this->authorize('view', $statuslabel);
|
||||
$this->authorize('view', Asset::class);
|
||||
|
||||
if ($statuslabel->getStatuslabelType()=='deployable') {
|
||||
return '1';
|
||||
|
||||
@@ -105,7 +105,7 @@ class UsersController extends Controller
|
||||
'assets','accessories', 'consumables','licenses','groups','activated','created_at',
|
||||
'two_factor_enrolled','two_factor_optin','last_login', 'assets_count', 'licenses_count',
|
||||
'consumables_count', 'accessories_count', 'phone', 'address', 'city', 'state',
|
||||
'country', 'zip'
|
||||
'country', 'zip', 'id'
|
||||
];
|
||||
|
||||
$sort = in_array($request->get('sort'), $allowed_columns) ? $request->get('sort') : 'first_name';
|
||||
@@ -200,6 +200,12 @@ class UsersController extends Controller
|
||||
$user->password = bcrypt($request->get('password', $tmp_pass));
|
||||
|
||||
if ($user->save()) {
|
||||
if ($request->has('groups')) {
|
||||
$user->groups()->sync($request->input('groups'));
|
||||
} else {
|
||||
$user->groups()->sync(array());
|
||||
}
|
||||
|
||||
return response()->json(Helper::formatStandardApiResponse('success', (new UsersTransformer)->transformUser($user), trans('admin/users/message.success.create')));
|
||||
}
|
||||
return response()->json(Helper::formatStandardApiResponse('error', null, $user->getErrors()));
|
||||
@@ -292,7 +298,7 @@ class UsersController extends Controller
|
||||
{
|
||||
$this->authorize('view', User::class);
|
||||
$this->authorize('view', Asset::class);
|
||||
$assets = Asset::where('assigned_to', '=', $id)->with('model')->get();
|
||||
$assets = Asset::where('assigned_to', '=', $id)->where('assigned_type', '=', User::class)->with('model')->get();
|
||||
return (new AssetsTransformer)->transformAssets($assets, $assets->count());
|
||||
}
|
||||
|
||||
|
||||
@@ -162,6 +162,9 @@ class AssetMaintenancesController extends Controller
|
||||
// Redirect to the improvement management page
|
||||
return redirect()->route('maintenances.index')
|
||||
->with('error', trans('admin/asset_maintenances/message.not_found'));
|
||||
} elseif (!$assetMaintenance->asset) {
|
||||
return redirect()->route('maintenances.index')
|
||||
->with('error', 'The asset associated with this maintenance does not exist.');
|
||||
} elseif (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
|
||||
return static::getInsufficientPermissionsRedirect();
|
||||
}
|
||||
|
||||
@@ -143,7 +143,7 @@ class AssetsController extends Controller
|
||||
}
|
||||
|
||||
// Create the image (if one was chosen.)
|
||||
if ($request->hasFile('image')) {
|
||||
if ($request->has('image')) {
|
||||
$image = $request->input('image');
|
||||
|
||||
// After modification, the image is prefixed by mime info like the following:
|
||||
|
||||
@@ -55,7 +55,10 @@ class ForgotPasswordController extends Controller
|
||||
// to send the link, we will examine the response then see the message we
|
||||
// need to show to the user. Finally, we'll send out a proper response.
|
||||
$response = $this->broker()->sendResetLink(
|
||||
$request->only('email')
|
||||
array_merge(
|
||||
$request->only('email'),
|
||||
['activated' => '1']
|
||||
)
|
||||
);
|
||||
|
||||
if ($response === \Password::RESET_LINK_SENT) {
|
||||
|
||||
@@ -68,7 +68,7 @@ class LoginController extends Controller
|
||||
{
|
||||
$remote_user = $request->server('REMOTE_USER');
|
||||
if (Setting::getSettings()->login_remote_user_enabled == "1" && isset($remote_user) && !empty($remote_user)) {
|
||||
LOG::debug("Authenticatiing via REMOTE_USER.");
|
||||
Log::debug("Authenticatiing via REMOTE_USER.");
|
||||
|
||||
$pos = strpos($remote_user, '\\');
|
||||
if ($pos > 0) {
|
||||
@@ -77,45 +77,45 @@ class LoginController extends Controller
|
||||
|
||||
try {
|
||||
$user = User::where('username', '=', $remote_user)->whereNull('deleted_at')->where('activated', '=', '1')->first();
|
||||
LOG::debug("Remote user auth lookup complete");
|
||||
Log::debug("Remote user auth lookup complete");
|
||||
if(!is_null($user)) Auth::login($user, true);
|
||||
} catch(Exception $e) {
|
||||
LOG::error("There was an error authenticating the Remote user: " . $e->getMessage());
|
||||
Log::debug("There was an error authenticating the Remote user: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function loginViaLdap(Request $request)
|
||||
{
|
||||
LOG::debug("Binding user to LDAP.");
|
||||
Log::debug("Binding user to LDAP.");
|
||||
$ldap_user = Ldap::findAndBindUserLdap($request->input('username'), $request->input('password'));
|
||||
if (!$ldap_user) {
|
||||
LOG::debug("LDAP user ".$request->input('username')." not found in LDAP or could not bind");
|
||||
Log::debug("LDAP user ".$request->input('username')." not found in LDAP or could not bind");
|
||||
throw new \Exception("Could not find user in LDAP directory");
|
||||
} else {
|
||||
LOG::debug("LDAP user ".$request->input('username')." successfully bound to LDAP");
|
||||
Log::debug("LDAP user ".$request->input('username')." successfully bound to LDAP");
|
||||
}
|
||||
|
||||
// Check if the user already exists in the database and was imported via LDAP
|
||||
$user = User::where('username', '=', Input::get('username'))->whereNull('deleted_at')->where('ldap_import', '=', 1)->where('activated', '=', '1')->first();
|
||||
LOG::debug("Local auth lookup complete");
|
||||
Log::debug("Local auth lookup complete");
|
||||
|
||||
// The user does not exist in the database. Try to get them from LDAP.
|
||||
// If user does not exist and authenticates successfully with LDAP we
|
||||
// will create it on the fly and sign in with default permissions
|
||||
if (!$user) {
|
||||
LOG::debug("Local user ".Input::get('username')." does not exist");
|
||||
LOG::debug("Creating local user ".Input::get('username'));
|
||||
Log::debug("Local user ".Input::get('username')." does not exist");
|
||||
Log::debug("Creating local user ".Input::get('username'));
|
||||
|
||||
if ($user = Ldap::createUserFromLdap($ldap_user)) { //this handles passwords on its own
|
||||
LOG::debug("Local user created.");
|
||||
Log::debug("Local user created.");
|
||||
} else {
|
||||
LOG::debug("Could not create local user.");
|
||||
Log::debug("Could not create local user.");
|
||||
throw new \Exception("Could not create local user");
|
||||
}
|
||||
// If the user exists and they were imported from LDAP already
|
||||
} else {
|
||||
LOG::debug("Local user ".$request->input('username')." exists in database. Updating existing user against LDAP.");
|
||||
Log::debug("Local user ".$request->input('username')." exists in database. Updating existing user against LDAP.");
|
||||
|
||||
$ldap_attr = Ldap::parseAndMapLdapAttributes($ldap_user);
|
||||
|
||||
@@ -161,7 +161,7 @@ class LoginController extends Controller
|
||||
|
||||
// Should we even check for LDAP users?
|
||||
if (Setting::getSettings()->ldap_enabled=='1') {
|
||||
LOG::debug("LDAP is enabled.");
|
||||
Log::debug("LDAP is enabled.");
|
||||
try {
|
||||
$user = $this->loginViaLdap($request);
|
||||
Auth::login($user, true);
|
||||
@@ -169,13 +169,13 @@ class LoginController extends Controller
|
||||
// If the user was unable to login via LDAP, log the error and let them fall through to
|
||||
// local authentication.
|
||||
} catch (\Exception $e) {
|
||||
LOG::error("There was an error authenticating the LDAP user: ".$e->getMessage());
|
||||
Log::debug("There was an error authenticating the LDAP user: ".$e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// If the user wasn't authenticated via LDAP, skip to local auth
|
||||
if (!$user) {
|
||||
LOG::debug("Authenticating user against database.");
|
||||
Log::debug("Authenticating user against database.");
|
||||
// Try to log the user in
|
||||
if (!Auth::attempt(['username' => $request->input('username'), 'password' => $request->input('password'), 'activated' => 1], $request->input('remember'))) {
|
||||
|
||||
@@ -183,7 +183,7 @@ class LoginController extends Controller
|
||||
$this->incrementLoginAttempts($request);
|
||||
}
|
||||
|
||||
LOG::debug("Local authentication failed.");
|
||||
Log::debug("Local authentication failed.");
|
||||
return redirect()->back()->withInput()->with('error', trans('auth/message.account_not_found'));
|
||||
} else {
|
||||
|
||||
|
||||
@@ -4,6 +4,8 @@ namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Foundation\Auth\ResetsPasswords;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ResetPasswordController extends Controller
|
||||
{
|
||||
@@ -36,4 +38,8 @@ class ResetPasswordController extends Controller
|
||||
{
|
||||
$this->middleware('guest');
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ final class CompaniesController extends Controller
|
||||
{
|
||||
$this->authorize('view', Company::class);
|
||||
|
||||
return view('companies/index')->with('companies', Company::all());
|
||||
return view('companies/index');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -34,7 +34,7 @@ class DepreciationsController extends Controller
|
||||
$this->authorize('view', Depreciation::class);
|
||||
|
||||
// Show the page
|
||||
return view('depreciations/index', compact('depreciations'));
|
||||
return view('depreciations/index');
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ class GroupsController extends Controller
|
||||
public function index()
|
||||
{
|
||||
// Show the page
|
||||
return view('groups/index', compact('groups'));
|
||||
return view('groups/index');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -72,7 +72,7 @@ class GroupsController extends Controller
|
||||
if ($group->save()) {
|
||||
return redirect()->route("groups.index")->with('success', trans('admin/groups/message.success.create'));
|
||||
}
|
||||
return redirect(route('groups.create'))->withInput()->withErrors($group->getErrors());
|
||||
return redirect()->back()->withInput()->withErrors($group->getErrors());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -111,7 +111,7 @@ class GroupsController extends Controller
|
||||
{
|
||||
$permissions = config('permissions');
|
||||
if (!$group = Group::find($id)) {
|
||||
return redirect()->route('groups')->with('error', trans('admin/groups/message.group_not_found', compact('id')));
|
||||
return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', compact('id')));
|
||||
}
|
||||
$group->name = e(Input::get('name'));
|
||||
$group->permissions = json_encode(Input::get('permission'));
|
||||
@@ -138,7 +138,7 @@ class GroupsController extends Controller
|
||||
{
|
||||
if (!config('app.lock_passwords')) {
|
||||
if (!$group = Group::find($id)) {
|
||||
return redirect()->route('groups')->with('error', trans('admin/groups/message.group_not_found', compact('id')));
|
||||
return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', compact('id')));
|
||||
}
|
||||
$group->delete();
|
||||
// Redirect to the group management page
|
||||
|
||||
@@ -265,31 +265,40 @@ class LicensesController extends Controller
|
||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||
* @since [v1.0]
|
||||
* @param Request $request
|
||||
* @param int $licenseId
|
||||
* @param int $seatId
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function postCheckout(Request $request, $licenseId)
|
||||
public function postCheckout(Request $request, $licenseId, $seatId = null)
|
||||
{
|
||||
|
||||
// Check that the license is valid
|
||||
if ($license = License::where('id',$licenseId)->first()) {
|
||||
|
||||
if ($license = License::where('id', $licenseId)->first()) {
|
||||
|
||||
// If the license is valid, check that there is an available seat
|
||||
if ($license->getAvailSeatsCountAttribute() < 1) {
|
||||
return redirect()->route('licenses.index')->with('error', 'There are no available seats for this license');
|
||||
}
|
||||
|
||||
// Get the next available seat for this license
|
||||
$next = $license->freeSeat();
|
||||
|
||||
if (!$next) {
|
||||
return redirect()->route('licenses.index')->with('error', 'There are no available seats for this license');
|
||||
if (!$seatId) {
|
||||
// Get the next available seat for this license
|
||||
$next = $license->freeSeat();
|
||||
if (!$next) {
|
||||
return redirect()->route('licenses.index')->with('error', 'There are no available seats for this license');
|
||||
}
|
||||
if (!$licenseSeat = LicenseSeat::where('id', '=', $next->id)->first()) {
|
||||
return redirect()->route('licenses.index')->with('error', 'There are no available seats for this license');
|
||||
}
|
||||
} else {
|
||||
$licenseSeat = LicenseSeat::where('id', '=', $seatId)->first();
|
||||
if (!$licenseSeat) {
|
||||
return redirect()->route('licenses.index')->with('error', 'License seat is not available for checkout');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!$licenseSeat = LicenseSeat::where('id', '=', $next->id)->first()) {
|
||||
return redirect()->route('licenses.index')->with('error', 'There are no available seats for this license');
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
$this->authorize('checkout', $license);
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ class LocationsController extends Controller
|
||||
$locations = Location::orderBy('created_at', 'DESC')->with('parent', 'assets', 'assignedassets')->get();
|
||||
|
||||
// Show the page
|
||||
return view('locations/index', compact('locations'));
|
||||
return view('locations/index');
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ class ManufacturersController extends Controller
|
||||
public function index()
|
||||
{
|
||||
$this->authorize('index', Manufacturer::class);
|
||||
return view('manufacturers/index', compact('manufacturers'));
|
||||
return view('manufacturers/index');
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -45,15 +45,21 @@ class ProfileController extends Controller
|
||||
{
|
||||
|
||||
$user = Auth::user();
|
||||
$user->first_name = Input::get('first_name');
|
||||
$user->last_name = Input::get('last_name');
|
||||
$user->website = Input::get('website');
|
||||
$user->location_id = Input::get('location_id');
|
||||
$user->gravatar = Input::get('gravatar');
|
||||
$user->locale = Input::get('locale');
|
||||
$user->first_name = $request->input('first_name');
|
||||
$user->last_name = $request->input('last_name');
|
||||
$user->website = $request->input('website');
|
||||
$user->gravatar = $request->input('gravatar');
|
||||
|
||||
if (!config('app.lock_passwords')) {
|
||||
$user->locale = $request->input('locale', 'en');
|
||||
}
|
||||
|
||||
if ((Gate::allows('self.two_factor')) && ((Setting::getSettings()->two_factor_enabled=='1') && (!config('app.lock_passwords')))) {
|
||||
$user->two_factor_optin = Input::get('two_factor_optin', '0');
|
||||
$user->two_factor_optin = $request->input('two_factor_optin', '0');
|
||||
}
|
||||
|
||||
if (Gate::allows('self.edit_location') && (!config('app.lock_passwords'))) {
|
||||
$user->location_id = $request->input('location_id');
|
||||
}
|
||||
|
||||
if (Input::file('avatar')) {
|
||||
|
||||
@@ -603,8 +603,8 @@ class ReportsController extends Controller
|
||||
|
||||
|
||||
if ($request->has('assigned_to')) {
|
||||
$row[] = ($asset->checkedOutToUser() && $asset->assigned) ? e($asset->assigned->getFullNameAttribute()) : ($asset->assigned ? e($asset->assigned->display_name) : '');
|
||||
$row[] = ($asset->checkedOutToUser() && $asset->assigned) ? 'user' : e($asset->assignedType());
|
||||
$row[] = ($asset->checkedOutToUser() && $asset->assigned) ? $asset->assigned->getFullNameAttribute() : ($asset->assigned ? $asset->assigned->display_name : '');
|
||||
$row[] = ($asset->checkedOutToUser() && $asset->assigned) ? 'user' : $asset->assignedType();
|
||||
}
|
||||
|
||||
if ($request->has('username')) {
|
||||
|
||||
@@ -401,6 +401,8 @@ class SettingsController extends Controller
|
||||
$setting->footer_text = $request->input('footer_text');
|
||||
$setting->skin = $request->input('skin');
|
||||
$setting->show_url_in_emails = $request->input('show_url_in_emails', '0');
|
||||
$setting->logo_print_assets = $request->input('logo_print_assets', '0');
|
||||
|
||||
|
||||
|
||||
// Only allow the site name and CSS to be changed if lock_passwords is false
|
||||
@@ -480,13 +482,12 @@ class SettingsController extends Controller
|
||||
$setting->two_factor_enabled = null;
|
||||
} else {
|
||||
$setting->two_factor_enabled = $request->input('two_factor_enabled');
|
||||
|
||||
# remote user login
|
||||
$setting->login_remote_user_enabled = (int)$request->input('login_remote_user_enabled');
|
||||
$setting->login_common_disabled= (int)$request->input('login_common_disabled');
|
||||
$setting->login_remote_user_custom_logout_url = $request->input('login_remote_user_custom_logout_url');
|
||||
}
|
||||
|
||||
# remote user login
|
||||
$setting->login_remote_user_enabled = (int)$request->input('login_remote_user_enabled');
|
||||
$setting->login_common_disabled = (int)$request->input('login_common_disabled');
|
||||
$setting->login_remote_user_custom_logout_url = $request->input('login_remote_user_custom_logout_url');
|
||||
}
|
||||
|
||||
$setting->pwd_secure_uncommon = (int) $request->input('pwd_secure_uncommon');
|
||||
@@ -537,7 +538,9 @@ class SettingsController extends Controller
|
||||
return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error'));
|
||||
}
|
||||
|
||||
$setting->locale = $request->input('locale', 'en');
|
||||
if (!config('app.lock_passwords')) {
|
||||
$setting->locale = $request->input('locale', 'en');
|
||||
}
|
||||
$setting->default_currency = $request->input('default_currency', '$');
|
||||
$setting->date_display_format = $request->input('date_display_format');
|
||||
$setting->time_display_format = $request->input('time_display_format');
|
||||
@@ -791,30 +794,36 @@ class SettingsController extends Controller
|
||||
|
||||
|
||||
|
||||
if (Input::has('labels_display_name')) {
|
||||
if ($request->has('labels_display_name')) {
|
||||
$setting->labels_display_name = 1;
|
||||
} else {
|
||||
$setting->labels_display_name = 0;
|
||||
}
|
||||
|
||||
if (Input::has('labels_display_serial')) {
|
||||
if ($request->has('labels_display_serial')) {
|
||||
$setting->labels_display_serial = 1;
|
||||
} else {
|
||||
$setting->labels_display_serial = 0;
|
||||
}
|
||||
|
||||
if (Input::has('labels_display_tag')) {
|
||||
if ($request->has('labels_display_tag')) {
|
||||
$setting->labels_display_tag = 1;
|
||||
} else {
|
||||
$setting->labels_display_tag = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (Input::has('labels_display_tag')) {
|
||||
if ($request->has('labels_display_tag')) {
|
||||
$setting->labels_display_tag = 1;
|
||||
} else {
|
||||
$setting->labels_display_tag = 0;
|
||||
}
|
||||
|
||||
if ($request->has('labels_display_model')) {
|
||||
$setting->labels_display_model = 1;
|
||||
} else {
|
||||
$setting->labels_display_model = 0;
|
||||
}
|
||||
|
||||
if ($setting->save()) {
|
||||
return redirect()->route('settings.index')
|
||||
->with('success', trans('admin/settings/message.update.success'));
|
||||
|
||||
@@ -33,7 +33,7 @@ class StatuslabelsController extends Controller
|
||||
public function index()
|
||||
{
|
||||
$this->authorize('view', Statuslabel::class);
|
||||
return view('statuslabels.index', compact('statuslabels'));
|
||||
return view('statuslabels.index');
|
||||
}
|
||||
|
||||
public function show($id)
|
||||
|
||||
@@ -34,10 +34,9 @@ class SuppliersController extends Controller
|
||||
{
|
||||
// Grab all the suppliers
|
||||
$this->authorize('view', Supplier::class);
|
||||
$suppliers = Supplier::orderBy('created_at', 'DESC')->get();
|
||||
|
||||
// Show the page
|
||||
return view('suppliers/index', compact('suppliers'));
|
||||
return view('suppliers/index');
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -86,8 +86,11 @@ class UsersController extends Controller
|
||||
$userPermissions = Helper::selectedPermissionsArray($permissions, Input::old('permissions', array()));
|
||||
$permissions = $this->filterDisplayable($permissions);
|
||||
|
||||
$user = new User;
|
||||
$user->activated = 1;
|
||||
|
||||
return view('users/edit', compact('groups', 'userGroups', 'permissions', 'userPermissions'))
|
||||
->with('user', new User);
|
||||
->with('user', $user);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -112,7 +115,7 @@ class UsersController extends Controller
|
||||
$user->last_name = $request->input('last_name');
|
||||
$user->locale = $request->input('locale');
|
||||
$user->employee_num = $request->input('employee_num');
|
||||
$user->activated = $request->input('activated', $user->activated);
|
||||
$user->activated = $request->input('activated', 0);
|
||||
$user->jobtitle = $request->input('jobtitle');
|
||||
$user->phone = $request->input('phone');
|
||||
$user->location_id = $request->input('location_id', null);
|
||||
@@ -247,19 +250,16 @@ class UsersController extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
} catch (UserNotFoundException $e) {
|
||||
$error = trans('admin/users/message.user_not_found', compact('id'));
|
||||
return redirect()->route('users.index')->with('error', $error);
|
||||
|
||||
} catch (ModelNotFoundException $e) {
|
||||
return redirect()->route('users.index')
|
||||
->with('error', trans('admin/users/message.user_not_found', compact('id')));
|
||||
}
|
||||
|
||||
|
||||
// Only save groups if the user is a super user
|
||||
if (Auth::user()->isSuperUser()) {
|
||||
if ($request->has('groups')) {
|
||||
$user->groups()->sync($request->input('groups'));
|
||||
} else {
|
||||
$user->groups()->sync(array());
|
||||
}
|
||||
$user->groups()->sync($request->input('groups'));
|
||||
}
|
||||
|
||||
|
||||
@@ -982,7 +982,7 @@ class UsersController extends Controller
|
||||
*/
|
||||
public function printInventory($id)
|
||||
{
|
||||
|
||||
$this->authorize('view', User::class);
|
||||
$show_user = User::where('id',$id)->withTrashed()->first();
|
||||
$assets = Asset::where('assigned_to', $id)->where('assigned_type', User::class)->with('model', 'model.category')->get();
|
||||
$licenses = $show_user->licenses()->get();
|
||||
|
||||
@@ -73,7 +73,7 @@ class ViewAssetsController extends Controller
|
||||
$assets = Asset::with('model', 'defaultLoc', 'location', 'assignedTo', 'requests')->Hardware()->RequestableAssets()->get();
|
||||
$models = AssetModel::with('category', 'requests', 'assets')->RequestableModels()->get();
|
||||
|
||||
return view('account/requestable-assets', compact('user', 'assets', 'models'));
|
||||
return view('account/requestable-assets', compact('assets', 'models'));
|
||||
}
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -25,7 +25,7 @@ class Kernel extends HttpKernel
|
||||
\Fideloper\Proxy\TrustProxies::class,
|
||||
\App\Http\Middleware\CheckForSetup::class,
|
||||
\App\Http\Middleware\CheckForDebug::class,
|
||||
// \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
|
||||
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
@@ -50,6 +50,7 @@ class ItemImportRequest extends FormRequest
|
||||
$importer->setCallbacks([$this, 'log'], [$this, 'progress'], [$this, 'errorCallback'])
|
||||
->setUserId(Auth::id())
|
||||
->setUpdating($this->has('import-update'))
|
||||
->setShouldNotify($this->has('send-welcome'))
|
||||
->setUsernameFormat('firstname.lastname')
|
||||
->setFieldMappings($fieldMappings);
|
||||
// $logFile = storage_path('logs/importer.log');
|
||||
@@ -60,7 +61,7 @@ class ItemImportRequest extends FormRequest
|
||||
|
||||
public function log($string)
|
||||
{
|
||||
// \Log::Info($string);
|
||||
\Log::Info($string);
|
||||
}
|
||||
|
||||
public function progress($count)
|
||||
|
||||
@@ -27,6 +27,11 @@ class AssetMaintenancesTransformer
|
||||
'name'=> ($assetmaintenance->asset->name) ? e($assetmaintenance->asset->name) : null,
|
||||
'asset_tag'=> e($assetmaintenance->asset->asset_tag)
|
||||
|
||||
] : null,
|
||||
'company' => (($assetmaintenance->asset) && ($assetmaintenance->asset->company)) ? [
|
||||
'id' => (int) $assetmaintenance->asset->company->id,
|
||||
'name'=> ($assetmaintenance->asset->company->name) ? e($assetmaintenance->asset->company->name) : null,
|
||||
|
||||
] : null,
|
||||
'title' => ($assetmaintenance->title) ? e($assetmaintenance->title) : null,
|
||||
'location' => (($assetmaintenance->asset) && ($assetmaintenance->asset->location)) ? [
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace App\Importer;
|
||||
use App\Models\CustomField;
|
||||
use App\Models\Setting;
|
||||
use App\Models\User;
|
||||
use App\Models\Department;
|
||||
use ForceUTF8\Encoding;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
@@ -29,6 +30,7 @@ abstract class Importer
|
||||
*/
|
||||
private $defaultFieldMap = [
|
||||
'asset_tag' => 'asset tag',
|
||||
'activated' => 'activated',
|
||||
'category' => 'category',
|
||||
'checkout_class' => 'checkout type', // Supports Location or User for assets. Using checkout_class instead of checkout_type because type exists on asset already.
|
||||
'checkout_location' => 'checkout location',
|
||||
@@ -66,6 +68,9 @@ abstract class Importer
|
||||
'phone_number' => 'phone number',
|
||||
'first_name' => 'first name',
|
||||
'last_name' => 'last name',
|
||||
'department' => 'department',
|
||||
'manager_first_name' => 'manager first name',
|
||||
'manager_last_name' => 'manager last name',
|
||||
];
|
||||
/**
|
||||
* Map of item fields->csv names
|
||||
@@ -176,10 +181,9 @@ abstract class Importer
|
||||
{
|
||||
|
||||
$val = $default;
|
||||
|
||||
$key = $this->lookupCustomKey($key);
|
||||
|
||||
$this->log("Custom Key: ${key}");
|
||||
// $this->log("Custom Key: ${key}");
|
||||
if (array_key_exists($key, $array)) {
|
||||
$val = Encoding::toUTF8(trim($array[ $key ]));
|
||||
}
|
||||
@@ -198,7 +202,6 @@ abstract class Importer
|
||||
public function lookupCustomKey($key)
|
||||
{
|
||||
if (array_key_exists($key, $this->fieldMap)) {
|
||||
// $this->log("Found a match in our custom map: {$key} is " . $this->fieldMap[$key]);
|
||||
return $this->fieldMap[$key];
|
||||
}
|
||||
// Otherwise no custom key, return original.
|
||||
@@ -248,7 +251,10 @@ abstract class Importer
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the user matching given data, or creates a new one if there is no match
|
||||
* Finds the user matching given data, or creates a new one if there is no match.
|
||||
* This is NOT used by the User Import, only for Asset/Accessory/etc where
|
||||
* there are users listed and we have to create them and associate them at
|
||||
* the same time. [ALG]
|
||||
*
|
||||
* @author Daniel Melzter
|
||||
* @since 3.0
|
||||
@@ -261,8 +267,13 @@ abstract class Importer
|
||||
$user_array = [
|
||||
'full_name' => $this->findCsvMatch($row, "full_name"),
|
||||
'email' => $this->findCsvMatch($row, "email"),
|
||||
'username' => $this->findCsvMatch($row, "username")
|
||||
'manager_id'=> '',
|
||||
'department_id' => '',
|
||||
'username' => $this->findCsvMatch($row, "username"),
|
||||
'activated' => $this->fetchHumanBoolean($this->findCsvMatch($row, 'activated')),
|
||||
];
|
||||
\Log::debug('Importer.php Activated: '.$this->findCsvMatch($row, 'activated'));
|
||||
|
||||
// If the full name is empty, bail out--we need this to extract first name (at the very least)
|
||||
if(empty($user_array['full_name'])) {
|
||||
$this->log('Insufficient user data provided (Full name is required)- skipping user creation, just adding asset');
|
||||
@@ -283,6 +294,7 @@ abstract class Importer
|
||||
$user_formatted_array = User::generateFormattedNameFromFullName(Setting::getSettings()->username_format, $user_array['full_name']);
|
||||
$user_array['first_name'] = $user_formatted_array['first_name'];
|
||||
$user_array['last_name'] = $user_formatted_array['last_name'];
|
||||
|
||||
if (empty($user_array['username'])) {
|
||||
$user_array['username'] = $user_formatted_array['username'];
|
||||
if ($this->usernameFormat =='email') {
|
||||
@@ -290,8 +302,9 @@ abstract class Importer
|
||||
}
|
||||
}
|
||||
|
||||
// Does this ever actually fire??
|
||||
// Check for a matching user after trying to guess username.
|
||||
if($user = User::where('username', $user_array['username'])->first()) {
|
||||
if ($user = User::where('username', $user_array['username'])->first()) {
|
||||
$this->log('User '.$user_array['username'].' already exists');
|
||||
return $user;
|
||||
}
|
||||
@@ -307,10 +320,15 @@ abstract class Importer
|
||||
$user->last_name = $user_array['last_name'];
|
||||
$user->username = $user_array['username'];
|
||||
$user->email = $user_array['email'];
|
||||
$user->activated = 1;
|
||||
$user->manager_id = (isset($user_array['manager_id']) ? $user_array['manager_id'] : null);
|
||||
$user->department_id = (isset($user_array['department_id']) ? $user_array['department_id']: null);
|
||||
$user->activated = $user_array['activated'];
|
||||
$user->password = $this->tempPassword;
|
||||
|
||||
\Log::debug('Creating a user with the following attributes: '.print_r($user_array, true));
|
||||
|
||||
if ($user->save()) {
|
||||
\Log::debug('Importer.php Name: '.$user->first_name.' '.$user->last_name.' ('.$user->username.')');
|
||||
$this->log('User '.$user_array['username'].' created');
|
||||
return $user;
|
||||
}
|
||||
@@ -360,6 +378,20 @@ abstract class Importer
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the Are we updating items in the import.
|
||||
*
|
||||
* @param bool $updating the updating
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public function setShouldNotify($send_welcome)
|
||||
{
|
||||
$this->send_welcome = $send_welcome;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines mappings of csv fields
|
||||
*
|
||||
@@ -407,4 +439,64 @@ abstract class Importer
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function fetchHumanBoolean($value)
|
||||
{
|
||||
if (($value =='1') || (strtolower($value) =='true') || (strtolower($value) =='yes'))
|
||||
{
|
||||
return '1';
|
||||
}
|
||||
return '0';
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch an existing department, or create new if it doesn't exist
|
||||
*
|
||||
* @author A. Gianotto
|
||||
* @since 4.6.5
|
||||
* @param $user_department string
|
||||
* @return int id of company created/found
|
||||
*/
|
||||
public function createOrFetchDepartment($user_department_name)
|
||||
{
|
||||
if ($user_department_name!='') {
|
||||
$department = Department::where('name', '=', $user_department_name)->first();
|
||||
|
||||
if ($department) {
|
||||
$this->log('A matching Department ' . $user_department_name . ' already exists');
|
||||
return $department->id;
|
||||
}
|
||||
|
||||
$department = new Department();
|
||||
$department->name = $user_department_name;
|
||||
|
||||
if ($department->save()) {
|
||||
$this->log('Department ' . $user_department_name . ' was created');
|
||||
return $department->id;
|
||||
}
|
||||
$this->logError($department, 'Department');
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch an existing manager
|
||||
*
|
||||
* @author A. Gianotto
|
||||
* @since 4.6.5
|
||||
* @param $user_manager string
|
||||
* @return int id of company created/found
|
||||
*/
|
||||
public function fetchManager($user_manager_first_name, $user_manager_last_name)
|
||||
{
|
||||
$manager = User::where('first_name', '=', $user_manager_first_name)
|
||||
->where('last_name', '=', $user_manager_last_name)->first();
|
||||
if ($manager) {
|
||||
$this->log('A matching Manager ' . $user_manager_first_name . ' '. $user_manager_last_name . ' already exists');
|
||||
return $manager->id;
|
||||
}
|
||||
$this->log('No matching Manager ' . $user_manager_first_name . ' '. $user_manager_last_name . ' found. If their user account is being created through this import, you should re-process this file again. ');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ use App\Models\Location;
|
||||
use App\Models\Manufacturer;
|
||||
use App\Models\Statuslabel;
|
||||
use App\Models\Supplier;
|
||||
use App\Models\Department;
|
||||
use App\Models\User;
|
||||
|
||||
class ItemImporter extends Importer
|
||||
@@ -54,6 +55,18 @@ class ItemImporter extends Importer
|
||||
if ($this->shouldUpdateField($item_supplier)) {
|
||||
$this->item['supplier_id'] = $this->createOrFetchSupplier($item_supplier);
|
||||
}
|
||||
|
||||
$item_department = $this->findCsvMatch($row, "department");
|
||||
if ($this->shouldUpdateField($item_department)) {
|
||||
$this->item['department_id'] = $this->createOrFetchDepartment($item_department);
|
||||
}
|
||||
|
||||
$item_manager_first_name = $this->findCsvMatch($row, "manager_first_name");
|
||||
$item_manager_last_name = $this->findCsvMatch($row, "manager_last_name");
|
||||
if ($this->shouldUpdateField($item_manager_first_name)) {
|
||||
$this->item['manager_id'] = $this->fetchManager($item_manager_first_name, $item_manager_last_name);
|
||||
}
|
||||
|
||||
$this->item["name"] = $this->findCsvMatch($row, "item_name");
|
||||
$this->item["notes"] = $this->findCsvMatch($row, "notes");
|
||||
$this->item["order_number"] = $this->findCsvMatch($row, "order_number");
|
||||
@@ -84,7 +97,7 @@ class ItemImporter extends Importer
|
||||
*/
|
||||
protected function determineCheckout($row)
|
||||
{
|
||||
// We only support checkout-to-location for asset, so short circuit otherw.
|
||||
// We only support checkout-to-location for asset, so short circuit otherwise.
|
||||
if(get_class($this) != AssetImporter::class) {
|
||||
return $this->createOrFetchUser($row);
|
||||
}
|
||||
@@ -161,7 +174,7 @@ class ItemImporter extends Importer
|
||||
* @since 3.0
|
||||
* @param array
|
||||
* @param $category Category
|
||||
* @param $manufacturer Manufacturer
|
||||
* @param $row Manufacturer
|
||||
* @return int Id of asset model created/found
|
||||
* @internal param $asset_modelno string
|
||||
*/
|
||||
@@ -279,6 +292,8 @@ class ItemImporter extends Importer
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Fetch the existing status label or create new if it doesn't exist.
|
||||
*
|
||||
|
||||
@@ -6,13 +6,21 @@ use App\Helpers\Helper;
|
||||
use App\Models\User;
|
||||
use App\Notifications\WelcomeNotification;
|
||||
|
||||
/**
|
||||
* This is ONLY used for the User Import. When we are importing users
|
||||
* via an Asset/etc import, we use createOrFetchUser() in
|
||||
* App\Importer.php. [ALG]
|
||||
*
|
||||
* Class UserImporter
|
||||
* @package App\Importer
|
||||
*
|
||||
*/
|
||||
class UserImporter extends ItemImporter
|
||||
{
|
||||
protected $users;
|
||||
public function __construct($filename)
|
||||
{
|
||||
parent::__construct($filename);
|
||||
// $this->users = User::all();
|
||||
}
|
||||
|
||||
protected function handle($row)
|
||||
@@ -31,25 +39,40 @@ class UserImporter extends ItemImporter
|
||||
*/
|
||||
public function createUserIfNotExists(array $row)
|
||||
{
|
||||
// User Specific Bits
|
||||
// Pull the records from the CSV to determine their values
|
||||
$this->item['username'] = $this->findCsvMatch($row, 'username');
|
||||
$this->item['first_name'] = $this->findCsvMatch($row, 'first_name');
|
||||
$this->item['last_name'] = $this->findCsvMatch($row, 'last_name');
|
||||
\Log::debug('UserImporter.php Name: '.$this->item['first_name'].' '.$this->item['last_name'].' ('.$this->item['username'].')');
|
||||
$this->item['email'] = $this->findCsvMatch($row, 'email');
|
||||
$this->item['phone'] = $this->findCsvMatch($row, 'phone_number');
|
||||
$this->item['jobtitle'] = $this->findCsvMatch($row, 'jobtitle');
|
||||
$this->item['activated'] = ($this->fetchHumanBoolean($this->findCsvMatch($row, 'activated')) == 1) ? '1' : 0;
|
||||
|
||||
\Log::debug('UserImporter.php Activated: '.$this->findCsvMatch($row, 'activated'));
|
||||
\Log::debug('UserImporter.php Activated fetchHumanBoolean: '. $this->fetchHumanBoolean($this->findCsvMatch($row, 'activated')));
|
||||
|
||||
$this->item['employee_num'] = $this->findCsvMatch($row, 'employee_num');
|
||||
$this->item['department_id'] = $this->createOrFetchDepartment($this->findCsvMatch($row, 'department')) ? $this->createOrFetchDepartment($this->findCsvMatch($row, 'department')) : null;
|
||||
$this->item['manager_id'] = $this->fetchManager($this->findCsvMatch($row, 'manager_first_name'), $this->findCsvMatch($row, 'manager_last_name')) ? $this->fetchManager($this->findCsvMatch($row, 'manager_first_name'), $this->findCsvMatch($row, 'manager_last_name')) : null;
|
||||
|
||||
|
||||
$user = User::where('username', $this->item['username'])->first();
|
||||
if ($user) {
|
||||
if (!$this->updating) {
|
||||
$this->log('A matching User ' . $this->item["name"] . ' already exists. ');
|
||||
\Log::debug('A matching User ' . $this->item["name"] . ' already exists. ');
|
||||
return;
|
||||
}
|
||||
$this->log('Updating User');
|
||||
$user->update($this->sanitizeItemForUpdating($user));
|
||||
$user->save();
|
||||
// \Log::debug('UserImporter.php Updated User ' . print_r($user, true));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// This needs to be applied after the update logic, otherwise we'll overwrite user passwords
|
||||
// Issue #5408
|
||||
$this->item['password'] = $this->tempPassword;
|
||||
@@ -57,10 +80,11 @@ class UserImporter extends ItemImporter
|
||||
$this->log("No matching user, creating one");
|
||||
$user = new User();
|
||||
$user->fill($this->sanitizeItemForStoring($user));
|
||||
|
||||
if ($user->save()) {
|
||||
// $user->logCreate('Imported using CSV Importer');
|
||||
$this->log("User " . $this->item["name"] . ' was created');
|
||||
if($user->email) {
|
||||
|
||||
if(($user->email) && ($user->activated=='1')) {
|
||||
$data = [
|
||||
'email' => $user->email,
|
||||
'username' => $user->username,
|
||||
@@ -68,7 +92,11 @@ class UserImporter extends ItemImporter
|
||||
'last_name' => $user->last_name,
|
||||
'password' => $this->tempPassword,
|
||||
];
|
||||
$user->notify(new WelcomeNotification($data));
|
||||
|
||||
if ($this->send_welcome) {
|
||||
$user->notify(new WelcomeNotification($data));
|
||||
}
|
||||
|
||||
}
|
||||
$user = null;
|
||||
$this->item = null;
|
||||
|
||||
@@ -1,16 +1,20 @@
|
||||
| CSV | Item | Applicable Types |
|
||||
|---------------------|------------------|-------------------------------------------|
|
||||
| activated | | User |
|
||||
| asset tag | asset_tag | Asset |
|
||||
| category | category | All |
|
||||
| company | company | All |
|
||||
| department_id | | User ? All |
|
||||
| item name | item_name | All |
|
||||
| image | image | asset |
|
||||
| image | image | Asset |
|
||||
| email | | |
|
||||
| expiration date | expiration_date | License |
|
||||
| location | location | All |
|
||||
| notes | notes | All |
|
||||
| licensed to email | license_email | License |
|
||||
| licensed to name | license_name | License |
|
||||
| maintained | maintained | License |
|
||||
| manager_id | | User |
|
||||
| manufacturer | manufacturer | All |
|
||||
| model name | asset_model | Asset |
|
||||
| model number | model_number | Asset |
|
||||
@@ -22,12 +26,12 @@
|
||||
| reassignable | reassignable | License |
|
||||
| requestable | requestable | Asset, Accessory? |
|
||||
| seats | seats | License |
|
||||
| serial number | serial | asset, license |
|
||||
| status | status | asset ? All |
|
||||
| serial number | serial | Asset, license |
|
||||
| status | status | Asset ? All |
|
||||
| supplier | supplier | Asset ? All |
|
||||
| termination date | termination_date | License |
|
||||
| warranty months | warranty_months | asset |
|
||||
| warranty months | warranty_months | Asset |
|
||||
| User Related Fields | assigned_to | Asset |
|
||||
| name | | |
|
||||
| email | | |
|
||||
| username | | |
|
||||
| username | | |
|
||||
|
||||
|
||||
@@ -228,6 +228,9 @@ class Asset extends Depreciable
|
||||
if($target->location) {
|
||||
$this->location_id = $target->location->id;
|
||||
}
|
||||
if($target instanceof Location) {
|
||||
$this->location_id = $target->id;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1177,8 +1180,8 @@ class Asset extends Depreciable
|
||||
*/
|
||||
public function scopeInCategory($query, $category_id)
|
||||
{
|
||||
return $query->join('models', 'assets.model_id', '=', 'models.id')
|
||||
->join('categories', 'models.category_id', '=', 'categories.id')->where('models.category_id', '=', $category_id);
|
||||
return $query->join('models as category_models', 'assets.model_id', '=', 'category_models.id')
|
||||
->join('categories', 'category_models.category_id', '=', 'categories.id')->where('category_models.category_id', '=', $category_id);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -72,6 +72,8 @@ class AssetMaintenance extends Model implements ICompanyableChild
|
||||
trans('admin/asset_maintenances/general.repair') => trans('admin/asset_maintenances/general.repair'),
|
||||
trans('admin/asset_maintenances/general.upgrade') => trans('admin/asset_maintenances/general.upgrade'),
|
||||
'PAT test' => 'PAT test',
|
||||
trans('admin/asset_maintenances/general.calibration') => trans('admin/asset_maintenances/general.calibration'),
|
||||
'PAT test' => 'PAT test',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ class Consumable extends SnipeModel
|
||||
'qty' => 'required|integer|min:0',
|
||||
'category_id' => 'required|integer',
|
||||
'company_id' => 'integer|nullable',
|
||||
'min_amt' => 'integer|min:1|nullable',
|
||||
'min_amt' => 'integer|min:0|nullable',
|
||||
'purchase_cost' => 'numeric|nullable',
|
||||
);
|
||||
|
||||
@@ -156,6 +156,10 @@ class Consumable extends SnipeModel
|
||||
return $this->belongsToMany('\App\Models\User', 'consumables_users', 'consumable_id', 'assigned_to')->count();
|
||||
}
|
||||
|
||||
public function checkin_email()
|
||||
{
|
||||
return $this->category->checkin_email;
|
||||
}
|
||||
|
||||
public function requireAcceptance()
|
||||
{
|
||||
|
||||
@@ -25,11 +25,11 @@ class Department extends SnipeModel
|
||||
use ValidatingTrait, UniqueUndeletedTrait;
|
||||
|
||||
protected $rules = [
|
||||
'name' => 'required|max:255',
|
||||
'user_id' => 'required',
|
||||
'location_id' => 'numeric|nullable',
|
||||
'company_id' => 'numeric|nullable',
|
||||
'manager_id' => 'numeric|nullable',
|
||||
'name' => 'required|max:255',
|
||||
'user_id' => 'nullable|exists:users,id',
|
||||
'location_id' => 'numeric|nullable',
|
||||
'company_id' => 'numeric|nullable',
|
||||
'manager_id' => 'numeric|nullable',
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
+5
-2
@@ -96,8 +96,11 @@ class Ldap extends Model
|
||||
|
||||
$filterQuery = $settings->ldap_auth_filter_query . $username;
|
||||
|
||||
|
||||
if (!$ldapbind = @ldap_bind($connection, $userDn, $password)) {
|
||||
return false;
|
||||
if(!$ldapbind = Ldap::bindAdminToLdap($connection)){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$results = ldap_search($connection, $baseDn, $filterQuery)) {
|
||||
@@ -112,7 +115,7 @@ class Ldap extends Model
|
||||
return false;
|
||||
}
|
||||
|
||||
return $user;
|
||||
return array_change_key_case($user);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -110,6 +110,7 @@ class License extends Depreciable
|
||||
protected $searchableRelations = [
|
||||
'manufacturer' => ['name'],
|
||||
'company' => ['name'],
|
||||
'category' => ['name'],
|
||||
];
|
||||
|
||||
public static function boot()
|
||||
@@ -228,7 +229,7 @@ class License extends Depreciable
|
||||
|
||||
public function checkin_email()
|
||||
{
|
||||
return $this->model->category->checkin_email;
|
||||
return $this->category->checkin_email;
|
||||
}
|
||||
|
||||
public function requireAcceptance()
|
||||
|
||||
@@ -26,7 +26,7 @@ class Location extends SnipeModel
|
||||
'address' => 'max:80|nullable',
|
||||
'address2' => 'max:80|nullable',
|
||||
'zip' => 'min:3|max:10|nullable',
|
||||
// 'manager_id' => 'exists:users'
|
||||
'manager_id' => 'exists:users,id|nullable'
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -57,6 +57,7 @@ class Location extends SnipeModel
|
||||
'zip',
|
||||
'ldap_ou',
|
||||
'currency',
|
||||
'manager_id',
|
||||
'image',
|
||||
];
|
||||
protected $hidden = ['user_id'];
|
||||
|
||||
@@ -41,7 +41,8 @@ trait Loggable
|
||||
$settings = Setting::getSettings();
|
||||
$log = new Actionlog;
|
||||
$log = $this->determineLogItemType($log);
|
||||
$log->user_id = Auth::user()->id;
|
||||
if(Auth::user())
|
||||
$log->user_id = Auth::user()->id;
|
||||
|
||||
if (!isset($target)) {
|
||||
throw new Exception('All checkout logs require a target');
|
||||
|
||||
@@ -5,10 +5,9 @@ use App\Models\Setting;
|
||||
|
||||
class AlertRecipient extends Recipient{
|
||||
|
||||
public function __construct()
|
||||
public function __construct(string $email)
|
||||
{
|
||||
$settings = Setting::getSettings();
|
||||
$this->email = $settings->alert_email;
|
||||
$this->email = trim($email);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ trait Searchable {
|
||||
* @param string $search The search term
|
||||
* @return array An array of search terms
|
||||
*/
|
||||
private function prepeareSearchTerms(string $search) {
|
||||
private function prepeareSearchTerms($search) {
|
||||
return explode(' OR ', $search);
|
||||
}
|
||||
|
||||
@@ -68,6 +68,8 @@ trait Searchable {
|
||||
|
||||
$table = $this->getTable();
|
||||
|
||||
$firstConditionAdded = false;
|
||||
|
||||
foreach($this->getSearchableAttributes() as $column) {
|
||||
|
||||
foreach($terms as $term) {
|
||||
@@ -80,6 +82,19 @@ trait Searchable {
|
||||
continue;
|
||||
}
|
||||
|
||||
/**
|
||||
* We need to form the query properly, starting with a "where",
|
||||
* otherwise the generated select is wrong.
|
||||
*
|
||||
* @todo This does the job, but is inelegant and fragile
|
||||
*/
|
||||
if (!$firstConditionAdded) {
|
||||
$query = $query->where($table . '.' . $column, 'LIKE', '%'.$term.'%');
|
||||
|
||||
$firstConditionAdded = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
$query = $query->orWhere($table . '.' . $column, 'LIKE', '%'.$term.'%');
|
||||
}
|
||||
}
|
||||
|
||||
+4
-8
@@ -47,6 +47,7 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo
|
||||
'manager_id',
|
||||
'password',
|
||||
'phone',
|
||||
'notes',
|
||||
'state',
|
||||
'username',
|
||||
'zip',
|
||||
@@ -166,11 +167,6 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo
|
||||
return $this->belongsTo('\App\Models\Department', 'department_id');
|
||||
}
|
||||
|
||||
public function isActivated()
|
||||
{
|
||||
return $this->activated ==1;
|
||||
}
|
||||
|
||||
public function getFullNameAttribute()
|
||||
{
|
||||
return $this->first_name . " " . $this->last_name;
|
||||
@@ -274,7 +270,7 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo
|
||||
**/
|
||||
public function managedLocations()
|
||||
{
|
||||
return $this->hasMany('\App\Models\Location', 'manager_id')->withTrashed();
|
||||
return $this->hasMany('\App\Models\Location', 'manager_id');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -333,7 +329,7 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo
|
||||
|
||||
public function scopeGetDeleted($query)
|
||||
{
|
||||
return $query->withTrashed()->whereNotNull('deleted_at');
|
||||
return $query->withTrashed()->whereNotNull('users.deleted_at');
|
||||
}
|
||||
|
||||
public function scopeGetNotDeleted($query)
|
||||
@@ -450,7 +446,7 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo
|
||||
|
||||
public function scopeDeleted($query)
|
||||
{
|
||||
return $query->whereNotNull('deleted_at');
|
||||
return $query->whereNotNull('users.deleted_at');
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ class AppServiceProvider extends ServiceProvider
|
||||
if (($this->app->environment('production')) && (config('services.rollbar.access_token'))){
|
||||
$this->app->register(\Rollbar\Laravel\RollbarServiceProvider::class);
|
||||
}
|
||||
|
||||
|
||||
foreach ($monolog->getHandlers() as $handler) {
|
||||
$handler->setLevel($log_level);
|
||||
}
|
||||
|
||||
@@ -135,6 +135,10 @@ class AuthServiceProvider extends ServiceProvider
|
||||
return $user->hasAccess('self.api');
|
||||
});
|
||||
|
||||
Gate::define('self.edit_location', function($user) {
|
||||
return $user->hasAccess('self.edit_location');
|
||||
});
|
||||
|
||||
Gate::define('backend.interact', function ($user) {
|
||||
return $user->can('view', Statuslabel::class)
|
||||
|| $user->can('view', AssetModel::class)
|
||||
|
||||
+4
-4
@@ -2,7 +2,7 @@
|
||||
"name": "snipe/snipe-it",
|
||||
"description": "Open source asset management system built on Laravel.",
|
||||
"keywords": ["assets", "asset-management", "laravel"],
|
||||
"license": "AGPL-3",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"type": "project",
|
||||
"require": {
|
||||
"php": ">=5.6.4",
|
||||
@@ -12,8 +12,9 @@
|
||||
"doctrine/dbal": "^2.5.13",
|
||||
"doctrine/inflector": "1.1.*",
|
||||
"doctrine/instantiator": "1.0.*",
|
||||
"eduardokum/laravel-mail-auto-embed": "^1.0",
|
||||
"erusev/parsedown": "^1.6",
|
||||
"fideloper/proxy": "^3.1",
|
||||
"fideloper/proxy": "^3.3",
|
||||
"intervention/image": "^2.3",
|
||||
"javiereguiluz/easyslugger": "^1.0",
|
||||
"laravel/framework": "5.4.35",
|
||||
@@ -28,7 +29,7 @@
|
||||
"phpspec/prophecy": "1.6.2",
|
||||
"pragmarx/google2fa": "^1.0",
|
||||
"predis/predis": "^1.1",
|
||||
"rollbar/rollbar-laravel": "^2.2",
|
||||
"rollbar/rollbar-laravel": "2.4.1",
|
||||
"schuppo/password-strength": "~1.5",
|
||||
"spatie/laravel-backup": "3.11.0",
|
||||
"tecnickcom/tc-lib-barcode": "^1.15",
|
||||
@@ -41,7 +42,6 @@
|
||||
"fzaninotto/faker": "~1.4",
|
||||
"phpunit/php-token-stream": "1.4.11",
|
||||
"phpunit/phpunit": "~5.7",
|
||||
"roave/security-advisories": "dev-master",
|
||||
"squizlabs/php_codesniffer": "*",
|
||||
"symfony/css-selector": "3.1.*",
|
||||
"symfony/dom-crawler": "3.1.*"
|
||||
|
||||
Generated
+283
-215
File diff suppressed because it is too large
Load Diff
@@ -297,6 +297,7 @@ return [
|
||||
Unicodeveloper\DumbPassword\DumbPasswordServiceProvider::class,
|
||||
Schuppo\PasswordStrength\PasswordStrengthServiceProvider::class,
|
||||
Tightenco\Ziggy\ZiggyServiceProvider::class, // Laravel routes in vue
|
||||
Eduardokum\LaravelMailAutoEmbed\ServiceProvider::class,
|
||||
|
||||
/*
|
||||
* Application Service Providers...
|
||||
|
||||
+1
-1
@@ -86,6 +86,6 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'prefix' => 'snipeit',
|
||||
'prefix' => env('CACHE_PREFIX', 'snipeit'),
|
||||
|
||||
];
|
||||
|
||||
@@ -571,6 +571,13 @@ return array(
|
||||
'display' => true,
|
||||
),
|
||||
|
||||
array(
|
||||
'permission' => 'self.edit_location',
|
||||
'label' => 'Profile Edit Location',
|
||||
'note' => 'The user may update their own location in their profile. Note that this is not affected by any additional Users permissions you grant to this user or group.',
|
||||
'display' => true,
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
|
||||
|
||||
@@ -63,11 +63,12 @@ return [
|
||||
* We may also want to add something like:
|
||||
* \Illuminate\Http\Request::HEADER_CLIENT_PROTO => 'X_FORWARDED_SCHEME',
|
||||
*/
|
||||
// These are defaults already set in the config:
|
||||
'headers' => [
|
||||
(defined('Illuminate\Http\Request::HEADER_FORWARDED') ? Illuminate\Http\Request::HEADER_FORWARDED : 'forwarded') => 'FORWARDED',
|
||||
\Illuminate\Http\Request::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',
|
||||
\Illuminate\Http\Request::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST',
|
||||
\Illuminate\Http\Request::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
|
||||
\Illuminate\Http\Request::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT',
|
||||
|
||||
]
|
||||
];
|
||||
|
||||
+5
-5
@@ -1,10 +1,10 @@
|
||||
<?php
|
||||
return array (
|
||||
'app_version' => 'v4.6.2',
|
||||
'full_app_version' => 'v4.6.2 - build 3844-',
|
||||
'build_version' => '3844',
|
||||
'app_version' => 'v4.6.9',
|
||||
'full_app_version' => 'v4.6.9 - build 3968-gf3c12f38b',
|
||||
'build_version' => '3968',
|
||||
'prerelease_version' => '',
|
||||
'hash_version' => 'gbbb15d610',
|
||||
'full_hash' => 'v4.6.2-10-gbbb15d610',
|
||||
'hash_version' => 'gf3c12f38b',
|
||||
'full_hash' => 'v4.6.9-8-gf3c12f38b',
|
||||
'branch' => 'master',
|
||||
);
|
||||
|
||||
@@ -26,7 +26,11 @@ $factory->define(Asset::class, function (Faker\Generator $faker) {
|
||||
'purchase_cost' => $faker->randomFloat(2, '299.99', '2999.99'),
|
||||
'order_number' => $faker->numberBetween(1000000, 50000000),
|
||||
'supplier_id' => 1,
|
||||
'requestable' => $faker->boolean()
|
||||
'requestable' => $faker->boolean(),
|
||||
'assigned_to' => null,
|
||||
'assigned_type' => null,
|
||||
'next_audit_date' => null,
|
||||
'last_checkout' => null,
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddLogoToPrintAssets extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('settings', function (Blueprint $table) {
|
||||
$table->boolean('logo_print_assets')->default('0');
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('settings', function (Blueprint $table) {
|
||||
$table->dropColumn('logo_print_assets');
|
||||
});
|
||||
}
|
||||
}
|
||||
+20
-3
@@ -17,8 +17,24 @@ else
|
||||
fi
|
||||
|
||||
# create data directories
|
||||
for dir in 'data/private_uploads' 'data/uploads' 'data/uploads/avatars' 'data/uploads/barcodes' 'data/uploads/categories' 'data/uploads/companies' 'data/uploads/departments' 'data/uploads/locations' 'data/uploads/manufacturers' 'data/uploads/models' 'data/uploads/suppliers' 'dumps' 'keys'; do
|
||||
mkdir -p "/var/lib/snipeit/$dir"
|
||||
for dir in \
|
||||
'data/private_uploads' \
|
||||
'data/uploads/accessories' \
|
||||
'data/uploads/avatars' \
|
||||
'data/uploads/barcodes' \
|
||||
'data/uploads/categories' \
|
||||
'data/uploads/companies' \
|
||||
'data/uploads/components' \
|
||||
'data/uploads/consumables' \
|
||||
'data/uploads/departments' \
|
||||
'data/uploads/locations' \
|
||||
'data/uploads/manufacturers' \
|
||||
'data/uploads/models' \
|
||||
'data/uploads/suppliers' \
|
||||
'dumps' \
|
||||
'keys'
|
||||
do
|
||||
[ ! -d "/var/lib/snipeit/$dir" ] && mkdir -p "/var/lib/snipeit/$dir"
|
||||
done
|
||||
|
||||
chown -R docker:root /var/lib/snipeit/data/*
|
||||
@@ -26,7 +42,8 @@ chown -R docker:root /var/lib/snipeit/dumps
|
||||
chown -R docker:root /var/lib/snipeit/keys
|
||||
|
||||
# If the Oauth DB files are not present copy the vendor files over to the db migrations
|
||||
if [ ! -f "/var/www/html/database/migrations/*create_oauth*" ]; then
|
||||
if [ ! -f "/var/www/html/database/migrations/*create_oauth*" ]
|
||||
then
|
||||
cp -ax /var/www/html/vendor/laravel/passport/database/migrations/* /var/www/html/database/migrations/
|
||||
fi
|
||||
|
||||
|
||||
@@ -32,3 +32,4 @@
|
||||
# Header set X-Permitted-Cross-Domain-Policies "master-only"
|
||||
|
||||
</IfModule>
|
||||
Options -Indexes
|
||||
|
||||
+20
-20
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
Vendored
+20
-20
File diff suppressed because one or more lines are too long
@@ -1,14 +1,14 @@
|
||||
{
|
||||
"/js/build/vue.js": "/js/build/vue.js?id=832c22cb5b66ac81ed06",
|
||||
"/js/build/vue.js": "/js/build/vue.js?id=af0a53aa1b89d0e19039",
|
||||
"/css/AdminLTE.css": "/css/AdminLTE.css?id=5e72463a66acbcc740d5",
|
||||
"/css/app.css": "/css/app.css?id=407edb63cc6b6dc62405",
|
||||
"/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=79fce5e6515d8a4cc760",
|
||||
"/css/AdminLTE.css.map": "/css/AdminLTE.css.map?id=0be7790b84909dca6a0a",
|
||||
"/css/app.css.map": "/css/app.css.map?id=96b5c985e860716e6a16",
|
||||
"/css/overrides.css.map": "/css/overrides.css.map?id=f7ce9ca49027594ac402",
|
||||
"/css/dist/all.css": "/css/dist/all.css?id=98db4e9b7650453c8b00",
|
||||
"/js/dist/all.js": "/js/dist/all.js?id=9d02373ef452329336d3",
|
||||
"/js/dist/all.js": "/js/dist/all.js?id=a3a656ed6316d4c4efe7",
|
||||
"/css/build/all.css": "/css/build/all.css?id=98db4e9b7650453c8b00",
|
||||
"/js/build/all.js": "/js/build/all.js?id=9d02373ef452329336d3"
|
||||
"/js/build/all.js": "/js/build/all.js?id=a3a656ed6316d4c4efe7"
|
||||
}
|
||||
@@ -6,29 +6,50 @@ tr {
|
||||
|
||||
<template>
|
||||
<tr v-show="processDetail">
|
||||
<td colspan="3">
|
||||
<td colspan="5">
|
||||
<div class="col-md-2 text-left">
|
||||
</div>
|
||||
<div class="col-md-8 col-md-offset-2 text-center" style="padding-top: 30px; margin: 0 auto;">
|
||||
<div class="col-md-12 text-left">
|
||||
|
||||
<h4 class="modal-title">Import File:</h4>
|
||||
<div class="dynamic-form-row">
|
||||
<div class="col-md-4 col-xs-12">
|
||||
<div class="col-md-5 col-xs-12">
|
||||
<label for="import-type">Import Type:</label>
|
||||
</div>
|
||||
<div class="col-md-4 col-xs-12">
|
||||
<div class="col-md-7 col-xs-12">
|
||||
<select2 :options="options.importTypes" v-model="options.importType" required>
|
||||
<option disabled value="0"></option>
|
||||
</select2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dynamic-form-row">
|
||||
<div class="col-md-4 col-xs-12">
|
||||
<div class="col-md-5 col-xs-12">
|
||||
<label for="import-update">Update Existing Values?:</label>
|
||||
</div>
|
||||
<div class="col-md-4 col-xs-12">
|
||||
<div class="col-md-7 col-xs-12">
|
||||
<input type="checkbox" name="import-update" v-model="options.update">
|
||||
</div>
|
||||
</div>
|
||||
<div class="dynamic-form-row">
|
||||
<div class="col-md-5 col-xs-12">
|
||||
<label for="send-welcome">Send Welcome Email for new Users?</label>
|
||||
</div>
|
||||
<div class="col-md-7 col-xs-12">
|
||||
<input type="checkbox" name="send-welcome" v-model="options.send_welcome">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="alert col-md-12"
|
||||
:class="alertClass"
|
||||
style="text-align:left"
|
||||
v-if="statusText">
|
||||
{{ this.statusText }}
|
||||
</div>
|
||||
|
||||
<div class="col-md-12" style="padding-top: 30px;">
|
||||
<table class="table">
|
||||
|
||||
<div class="text-left" style="padding-top: 30px;">
|
||||
<table class="table table-striped snipe-table">
|
||||
<thead>
|
||||
<th>Header Field</th>
|
||||
<th>Import Field</th>
|
||||
@@ -54,21 +75,25 @@ tr {
|
||||
</template>
|
||||
</tbody>
|
||||
</table>
|
||||
<br>
|
||||
<div class="col-md-8 col-md-offset-2 text-right">
|
||||
<button type="button" class="btn btn-sm btn-default" @click="processDetail = false">Cancel</button>
|
||||
<button type="submit" class="btn btn-sm btn-primary" @click="postSave">Import</button>
|
||||
<br><br>
|
||||
</div>
|
||||
|
||||
<div class="alert col-md-12" style="padding-top: 20px;"
|
||||
:class="alertClass"
|
||||
style="text-align:left"
|
||||
v-if="statusText">
|
||||
{{ this.statusText }}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<button type="button" class="btn btn-sm btn-default" @click="processDetail = false">Cancel</button>
|
||||
<button type="submit" class="btn btn-sm btn-primary" @click="postSave">Import</button>
|
||||
<div
|
||||
class="alert col-md-5 col-md-offset-1"
|
||||
:class="alertClass"
|
||||
style="text-align:left"
|
||||
v-if="statusText"
|
||||
>
|
||||
{{ this.statusText }}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</template>
|
||||
|
||||
@@ -113,6 +138,7 @@ tr {
|
||||
{id: 'serial', text: 'Serial Number' },
|
||||
{id: 'supplier', text: 'Supplier' },
|
||||
{id: 'username', text: 'Username' },
|
||||
{id: 'department', text: 'Department' },
|
||||
],
|
||||
assets: [
|
||||
{id: 'asset_tag', text: 'Asset Tag' },
|
||||
@@ -143,6 +169,9 @@ tr {
|
||||
{id: 'jobtitle', text: 'Job Title' },
|
||||
{id: 'last_name', text: 'Last Name' },
|
||||
{id: 'phone_number', text: 'Phone Number' },
|
||||
{id: 'manager_first_name', text: 'Manager First Name' },
|
||||
{id: 'manager_last_name', text: 'Manager Last Name' },
|
||||
{id: 'activated', text: 'Activated' },
|
||||
|
||||
],
|
||||
customFields: this.customFields,
|
||||
@@ -211,6 +240,7 @@ tr {
|
||||
this.statusText = "Processing...";
|
||||
this.$http.post(route('api.imports.importFile', this.file.id), {
|
||||
'import-update': this.options.update,
|
||||
'send-welcome': this.options.send_welcome,
|
||||
'import-type': this.options.importType,
|
||||
'column-mappings': this.columnMappings
|
||||
}).then( ({body}) => {
|
||||
|
||||
@@ -5,8 +5,8 @@ return array(
|
||||
'about_categories' => 'Kategorieë help jou om jou items te organiseer. Sommige voorbeeldkategorieë kan wees "Desktops", "Laptops", "Mobile Phones", "Tablets", ensovoorts, maar jy kan kategorieë gebruik wat vir jou sin maak.',
|
||||
'asset_categories' => 'Bate kategorieë',
|
||||
'category_name' => 'Kategorie Naam',
|
||||
'checkin_email' => 'Send email to user on checkin/checkout.',
|
||||
'checkin_email_notification' => 'This user will be sent an email on checkin/checkout.',
|
||||
'checkin_email' => 'Stuur e-pos aan gebruiker by aanmelding/afmelding.',
|
||||
'checkin_email_notification' => 'Hierdie gebruiker sal \'n e-pos gestuur word by aanmelding/afmelding.',
|
||||
'clone' => 'Klone Kategorie',
|
||||
'create' => 'Skep Kategorie',
|
||||
'edit' => 'Wysig Kategorie',
|
||||
|
||||
@@ -88,6 +88,8 @@ return array(
|
||||
'login_remote_user_custom_logout_url_text' => 'Custom logout URL',
|
||||
'login_remote_user_custom_logout_url_help' => 'If a url is provided here, users will get redirected to this URL after the user logs out of Snipe-IT. This is useful to close the user sessions of your Authentication provider correctly.',
|
||||
'logo' => 'logo',
|
||||
'logo_print_assets' => 'Use in Print',
|
||||
'logo_print_assets_help' => 'Use branding on printable asset lists ',
|
||||
'full_multiple_companies_support_help_text' => 'Beperking van gebruikers (insluitend administrateurs) wat aan maatskappye toegewys is aan hul maatskappy se bates.',
|
||||
'full_multiple_companies_support_text' => 'Volledige Veelvuldige Maatskappye Ondersteuning',
|
||||
'show_in_model_list' => 'Show in Model Dropdowns',
|
||||
@@ -121,7 +123,7 @@ return array(
|
||||
'slack_test_help' => 'Test whether your Slack integration is configured correctly. YOU MUST SAVE YOUR UPDATED SLACK SETTINGS FIRST.',
|
||||
'snipe_version' => 'Snipe-IT-weergawe',
|
||||
'support_footer' => 'Support Footer Links ',
|
||||
'support_footer_help' => 'Specify who sees the links to the Snipe-IT Support info and Users Manual.',
|
||||
'support_footer_help' => 'Specify who sees the links to the Snipe-IT Support info and Users Manual',
|
||||
'version_footer' => 'Version in Footer ',
|
||||
'version_footer_help' => 'Specify who sees the Snipe-IT version and build number.',
|
||||
'system' => 'Stelselinligting',
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
|
||||
return [
|
||||
'sent' => 'Jou wagwoord skakel is gestuur!',
|
||||
'user' => 'Daardie gebruiker bestaan nie of het \'n e-pos adres geassosieer nie',
|
||||
'user' => 'No matching active user found with that email.',
|
||||
];
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ return array(
|
||||
'alt_barcode_type' => '1D نوع الباركود',
|
||||
'eula_settings' => 'إعدادات اتفاقية ترخيص المستخدم النهائي',
|
||||
'eula_markdown' => 'تسمح اتفاقية ترخيص المستخدم هذه <a href="https://help.github.com/articles/github-flavored-markdown/">بتطبيق نمط الكتابة من Github</a>.',
|
||||
'footer_text' => 'Additional Footer Text ',
|
||||
'footer_text' => 'إضافة نص لتذييل الصفحة ',
|
||||
'footer_text_help' => 'This text will appear in the right-side footer. Links are allowed using <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>. Line breaks, headers, images, etc may result in unpredictable results.',
|
||||
'general_settings' => 'الاعدادات العامة',
|
||||
'generate_backup' => 'إنشاء النسخ الاحتياطي',
|
||||
@@ -75,7 +75,7 @@ return array(
|
||||
'ldap_active_flag' => 'لداب العلم النشط',
|
||||
'ldap_emp_num' => 'رقم موظف لداب',
|
||||
'ldap_email' => 'بريد لداب',
|
||||
'license' => 'Software License',
|
||||
'license' => 'ترخيص البرنامج',
|
||||
'load_remote_text' => 'المخطوطات عن بعد',
|
||||
'load_remote_help_text' => 'هذا قنص إيت تثبيت يمكن تحميل البرامج النصية من العالم الخارجي.',
|
||||
'login_note' => 'تسجيل الدخول ملاحظة',
|
||||
@@ -83,14 +83,16 @@ return array(
|
||||
'login_remote_user_text' => 'Remote User login options',
|
||||
'login_remote_user_enabled_text' => 'Enable Login with Remote User Header',
|
||||
'login_remote_user_enabled_help' => 'This option enables Authentication via the REMOTE_USER header according to the "Common Gateway Interface (rfc3875)"',
|
||||
'login_common_disabled_text' => 'Disable other authentication mechanisms',
|
||||
'login_common_disabled_text' => 'تعطيل آليات المصادقة الأخرى',
|
||||
'login_common_disabled_help' => 'This option disables other authentication mechanisms. Just enable this option if you are sure that your REMOTE_USER login is already working',
|
||||
'login_remote_user_custom_logout_url_text' => 'Custom logout URL',
|
||||
'login_remote_user_custom_logout_url_text' => 'عنوان صفحة مخصص لتسجيل الخروج',
|
||||
'login_remote_user_custom_logout_url_help' => 'If a url is provided here, users will get redirected to this URL after the user logs out of Snipe-IT. This is useful to close the user sessions of your Authentication provider correctly.',
|
||||
'logo' => 'شعار',
|
||||
'logo_print_assets' => 'الاستخدام في الطباعة',
|
||||
'logo_print_assets_help' => 'استخدم العلامة التجارية في قوائم الأصول القابلة للطباعة ',
|
||||
'full_multiple_companies_support_help_text' => 'تقييد المستخدمين (بما في ذلك المشرفون) المعينون للشركات إلى أصول شركاتهم.',
|
||||
'full_multiple_companies_support_text' => 'كامل دعم الشركات المتعددة',
|
||||
'show_in_model_list' => 'Show in Model Dropdowns',
|
||||
'show_in_model_list' => 'إظهار في القوائم المنسدلة للنماذج',
|
||||
'optional' => 'اختياري',
|
||||
'per_page' => 'النتائج لكل صفحة',
|
||||
'php' => 'نسخة فب',
|
||||
@@ -106,10 +108,10 @@ return array(
|
||||
'qr_text' => 'نص رمز الاستجابة السريعة',
|
||||
'setting' => 'ضبط',
|
||||
'settings' => 'إعدادات',
|
||||
'show_alerts_in_menu' => 'Show alerts in top menu',
|
||||
'show_archived_in_list' => 'Archived Assets',
|
||||
'show_archived_in_list_text' => 'Show archived assets in the "all assets" listing',
|
||||
'show_images_in_email' => 'Show images in emails',
|
||||
'show_alerts_in_menu' => 'عرض التنبيهات في القائمة العلوية',
|
||||
'show_archived_in_list' => 'الأصول المحفوظة',
|
||||
'show_archived_in_list_text' => 'عرض الأصول المحفوظة في قائمة "جميع الأصول"',
|
||||
'show_images_in_email' => 'إظهار الصور في رسائل البريد الإلكتروني',
|
||||
'show_images_in_email_help' => 'Uncheck this box if your Snipe-IT installation is behind a VPN or closed network and users outside the network will not be able to load images served from this installation in their emails.',
|
||||
'site_name' => 'اسم الموقع',
|
||||
'slack_botname' => 'سلاك بوتنام',
|
||||
@@ -121,8 +123,8 @@ return array(
|
||||
'slack_test_help' => 'Test whether your Slack integration is configured correctly. YOU MUST SAVE YOUR UPDATED SLACK SETTINGS FIRST.',
|
||||
'snipe_version' => 'قنص-إيت الإصدار',
|
||||
'support_footer' => 'Support Footer Links ',
|
||||
'support_footer_help' => 'Specify who sees the links to the Snipe-IT Support info and Users Manual.',
|
||||
'version_footer' => 'Version in Footer ',
|
||||
'support_footer_help' => 'Specify who sees the links to the Snipe-IT Support info and Users Manual',
|
||||
'version_footer' => 'رقم الاصدار في التذييل ',
|
||||
'version_footer_help' => 'Specify who sees the Snipe-IT version and build number.',
|
||||
'system' => 'معلومات النظام',
|
||||
'update' => 'إعدادات التحديث',
|
||||
@@ -134,8 +136,8 @@ return array(
|
||||
'label_dimensions' => 'أبعاد التسمية (بوصة)',
|
||||
'next_auto_tag_base' => 'الزيادة التلقائية التالية',
|
||||
'page_padding' => 'هوامش الصفحة (بوصة)',
|
||||
'privacy_policy_link' => 'Link to Privacy Policy',
|
||||
'privacy_policy' => 'Privacy Policy',
|
||||
'privacy_policy_link' => 'رابط سياسة الخصوصية',
|
||||
'privacy_policy' => 'سياسة الخصوصية',
|
||||
'privacy_policy_link_help' => 'If a url is included here, a link to your privacy policy will be included in the app footer and in any emails that the system sends out, in compliance with GDPR. ',
|
||||
'purge' => 'تطهير السجلات المحذوفة',
|
||||
'labels_display_bgutter' => 'الجزء السفلي للتسمية',
|
||||
@@ -180,6 +182,6 @@ return array(
|
||||
'vertical' => 'عمودي',
|
||||
'horizontal' => 'أفقي',
|
||||
'unique_serial' => 'Unique serial numbers',
|
||||
'unique_serial_help_text' => 'Checking this box will enforce a uniqueness constraint on asset serials',
|
||||
'unique_serial_help_text' => 'تحديد المربع سيؤدي الى فرض سياسة التفرد على الرقم التسلسلي للمتلكات',
|
||||
'zerofill_count' => 'طول ترميز الأصل، بما في ذلك تعبئة الاصفار',
|
||||
);
|
||||
|
||||
@@ -5,7 +5,7 @@ return array(
|
||||
'archived' => 'مؤرشف',
|
||||
'create' => 'إنشاء تسمية الحالة',
|
||||
'color' => 'لون الرسم البياني',
|
||||
'default_label' => 'Default Label',
|
||||
'default_label' => 'الوسم الافتراضي',
|
||||
'default_label_help' => 'This is used to ensure your most commonly used status labels appear at the top of the select box when creating/editing assets.',
|
||||
'deployable' => 'قابل للتوزيع',
|
||||
'info' => 'يتم استخدام تسميات الحالة لوصف الحالات المحتملة للأصول التابعة لك. قد تكون قيد الصيانة أو ضمن المفقودة أو المسروقة، وما إلى ذلك. يمكنك إنشاء تسميات حالة جديدة للأصول القابلة للتوزيع وقيد الانتظار والمؤرشفة.',
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
return array(
|
||||
'activated_help_text' => 'This user can login',
|
||||
'activated_help_text' => 'هذا المستخدم تسجيل الدخول',
|
||||
'activated_disabled_help_text' => 'You cannot edit activation status for your own account.',
|
||||
'assets_user' => 'الأصول التي تم اخراجها إلى :name',
|
||||
'bulk_update_warn' => 'أنت على وشك تعديل خصائص :user_count من المستخدمين. يرجى ملاحظة أنه لا يمكنك تغيير سمات المستخدم الخاصة بك باستخدام هذا النموذج، ويجب إجراء تعديلات على المستخدم الخاص بك بشكل على حدة.',
|
||||
|
||||
@@ -12,5 +12,5 @@ return array(
|
||||
'submit' => 'إرسال',
|
||||
'upload' => 'رفع',
|
||||
'select_file' => 'حدد ملف ...',
|
||||
'select_files' => 'Select Files...',
|
||||
'select_files' => 'إختيار ملف...',
|
||||
);
|
||||
|
||||
@@ -39,9 +39,9 @@
|
||||
'checkin' => 'تسجيل',
|
||||
'checkin_from' => 'تحقق من',
|
||||
'checkout' => 'ترجيع',
|
||||
'checkouts_count' => 'Checkouts',
|
||||
'checkins_count' => 'Checkins',
|
||||
'user_requests_count' => 'Requests',
|
||||
'checkouts_count' => 'الخارج',
|
||||
'checkins_count' => 'المٌدخل',
|
||||
'user_requests_count' => 'الطلبات',
|
||||
'city' => 'المدينة',
|
||||
'click_here' => 'انقر هنا',
|
||||
'clear_selection' => 'مسح التحديد',
|
||||
@@ -68,14 +68,14 @@
|
||||
'debug_warning' => 'تحذير!',
|
||||
'debug_warning_text' => 'هذا التطبيق يعمل في وضع الإنتاج مع تمكين التصحيح. هذا يمكن أن يعرض البيانات الحساسة إذا كان التطبيق الخاص بك هو في متناول العالم الخارجي. تعطيل وضع التصحيح عن طريق تعيين قيمة <code>APP_DEBUG</code> في ملف <code>.env</code> إلى <code>false</code>.',
|
||||
'delete' => 'حذف',
|
||||
'delete_confirm' => 'Are you sure you wish to delete :item?',
|
||||
'delete_confirm' => 'هل أنت متأكد من حذف :المنتج؟',
|
||||
'deleted' => 'تم حذفها',
|
||||
'delete_seats' => 'المقاعد المحذوفة',
|
||||
'departments' => 'الإدارات',
|
||||
'department' => ' قسم، أقسام',
|
||||
'deployed' => 'مُوزعة',
|
||||
'depreciation_report' => 'تقرير الإستهلاك',
|
||||
'details' => 'Details',
|
||||
'details' => 'التفاصيل',
|
||||
'download' => 'تحميل',
|
||||
'depreciation' => 'الإستهلاك',
|
||||
'editprofile' => 'تعديل الملف الشخصي',
|
||||
@@ -85,12 +85,12 @@
|
||||
'email_domain_help' => 'يتم استخدام هذا لتوليد عناوين البريد الإلكتروني عند الاستيراد',
|
||||
'filastname_format' => 'الاسم الأخير الأول (jsmith@example.com)',
|
||||
'firstname_lastname_format' => 'الاسم الأول الاسم الأخير (jane.smith@example.com)',
|
||||
'firstname_lastname_underscore_format' => 'First Name Last Name (jane_smith@example.com)',
|
||||
'lastnamefirstinitial_format' => 'Last Name First Initial (smithj@example.com)',
|
||||
'firstname_lastname_underscore_format' => 'الاسم الأول الاسم الأخير (jane_smith@example.com)',
|
||||
'lastnamefirstinitial_format' => 'اللقب والحرف الاول من الاسم (smithj@example.com)',
|
||||
'first' => 'الأول',
|
||||
'first_name' => 'الإسم الأول',
|
||||
'first_name_format' => 'الاسم الأول (jane@example.com)',
|
||||
'files' => 'Files',
|
||||
'files' => 'الملفات',
|
||||
'file_name' => 'ملف',
|
||||
'file_uploads' => 'تحميلات الملفات',
|
||||
'generate' => 'توفير',
|
||||
@@ -103,7 +103,7 @@
|
||||
'image' => 'صورة',
|
||||
'image_delete' => 'حذف الصورة',
|
||||
'image_upload' => 'رفع صورة',
|
||||
'image_filetypes_help' => 'Accepted filetypes are jpg, png, gif, and svg. Max upload size allowed is :size.',
|
||||
'image_filetypes_help' => 'أنواع الملفات المقبولة هي jpg و png و gif و svg. الحد الأقصى لحجم التحميل المسموح به هو: الحجم.',
|
||||
'import' => 'استيراد',
|
||||
'import-history' => 'استيراد الأرشيف',
|
||||
'asset_maintenance' => 'صيانة الأصول',
|
||||
@@ -127,7 +127,7 @@
|
||||
'locations' => 'المواقع',
|
||||
'logout' => 'تسجيل خروج',
|
||||
'lookup_by_tag' => 'البحث عن طريق ترميز الأصل',
|
||||
'maintenances' => 'Maintenances',
|
||||
'maintenances' => 'الصيانة',
|
||||
'manufacturer' => 'الشركة المصنعة',
|
||||
'manufacturers' => 'الشركات المصنعة',
|
||||
'markdown' => 'يتيح هذا الحقل <a href="https://help.github.com/articles/github-flavored-markdown/">بتطبيق نمط الكتابة من Github</a>.',
|
||||
@@ -162,7 +162,7 @@
|
||||
'recent_activity' => 'آخر نشاط',
|
||||
'remove_company' => 'إزالة جمعية الشركة',
|
||||
'reports' => 'التقارير',
|
||||
'restored' => 'restored',
|
||||
'restored' => 'المعاد',
|
||||
'requested' => 'طلب',
|
||||
'request_canceled' => 'تم إلغاء الطلب',
|
||||
'save' => 'حفظ',
|
||||
@@ -181,11 +181,11 @@
|
||||
'select_company' => 'حدد الشركة',
|
||||
'select_asset' => 'حدد مادة العرض',
|
||||
'settings' => 'الإعدادات',
|
||||
'show_deleted' => 'Show Deleted',
|
||||
'show_current' => 'Show Current',
|
||||
'show_deleted' => 'إظهار المحذوف',
|
||||
'show_current' => 'اظهار الحالي',
|
||||
'sign_in' => 'تسجيل الدخول',
|
||||
'signature' => 'التوقيع',
|
||||
'skin' => 'Skin',
|
||||
'skin' => 'المظهر',
|
||||
'some_features_disabled' => 'التثبيت التجريبي (DEMO): يتم تعطيل بعض الميزات لهذا التثبيت.',
|
||||
'site_name' => 'إسم الموقع',
|
||||
'state' => 'المنطقة / الولاية',
|
||||
@@ -206,7 +206,7 @@
|
||||
'unknown_admin' => 'إداري غير معروف',
|
||||
'username_format' => 'تنسيق اسم المستخدم',
|
||||
'update' => 'تحديث',
|
||||
'upload_filetypes_help' => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, xls, txt, lic, zip, and rar. Max upload size allowed is :size.',
|
||||
'upload_filetypes_help' => 'أنواع الملفات المسموح بها هي png و gif و jpg و jpeg و doc و docx و pdf و xls و txt و lic و zip و rar. الحد الأقصى لحجم التحميل المسموح به هو: الحجم.',
|
||||
'uploaded' => 'تم تحميلها',
|
||||
'user' => 'المستخدم',
|
||||
'accepted' => 'قبلت',
|
||||
|
||||
@@ -21,7 +21,7 @@ return array(
|
||||
'Confirm_Asset_Checkin' => 'تأكيد فحص الأصول.',
|
||||
'Confirm_Accessory_Checkin' => 'تأكيد الإيداع المساعد.',
|
||||
'Confirm_accessory_delivery' => 'تأكيد التسليم التبعي.',
|
||||
'Confirm_license_delivery' => 'Confirm license delivery.',
|
||||
'Confirm_license_delivery' => 'تأكيد تسليم الرخصة.',
|
||||
'Confirm_asset_delivery' => 'تأكيد تسليم الأصول.',
|
||||
'Confirm_consumable_delivery' => 'تأكيد التسليم المستهلكة.',
|
||||
'current_QTY' => 'الكمية الحالية',
|
||||
@@ -52,7 +52,7 @@ return array(
|
||||
'requested' => 'تم الطلب:',
|
||||
'reset_link' => 'رابط إعادة تعيين كلمة المرور',
|
||||
'reset_password' => 'انقر هنا لإعادة تعيين كلمة المرور:',
|
||||
'serial' => 'Serial',
|
||||
'serial' => 'الرقم التسلسلي',
|
||||
'supplier' => 'المورد',
|
||||
'tag' => 'الترميز',
|
||||
'test_email' => 'اختبار البريد الإلكتروني من قنص-تكنولوجيا المعلومات',
|
||||
@@ -63,8 +63,8 @@ return array(
|
||||
'license_expiring_alert' => 'There is :count license expiring in the next :threshold days.|There are :count licenses expiring in the next :threshold days.',
|
||||
'to_reset' => 'لإعادة تعيين كلمة مرور على :web، رجاءا أكمل هذا النموذج:',
|
||||
'type' => 'اكتب',
|
||||
'user' => 'User',
|
||||
'username' => 'Username',
|
||||
'user' => 'المستخدم',
|
||||
'username' => 'اسم المستخدم',
|
||||
'welcome' => 'مرحباً :name',
|
||||
'welcome_to' => 'مرحبا بكم في :web!',
|
||||
'your_credentials' => 'أوراق اعتماد قنص-إيت الخاص بك',
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
|
||||
return [
|
||||
'sent' => 'تم إرسال رابط كلمة المرور الخاصة بك!',
|
||||
'user' => 'هذا المستخدم غير موجود أو ليس لديه عنوان بريد إلكتروني مرتبط',
|
||||
'user' => 'No matching active user found with that email.',
|
||||
];
|
||||
|
||||
|
||||
@@ -88,6 +88,8 @@ return array(
|
||||
'login_remote_user_custom_logout_url_text' => 'Персонализиран адрес за изход',
|
||||
'login_remote_user_custom_logout_url_help' => 'If a url is provided here, users will get redirected to this URL after the user logs out of Snipe-IT. This is useful to close the user sessions of your Authentication provider correctly.',
|
||||
'logo' => 'Лого',
|
||||
'logo_print_assets' => 'Use in Print',
|
||||
'logo_print_assets_help' => 'Use branding on printable asset lists ',
|
||||
'full_multiple_companies_support_help_text' => 'Ограничаване на потребителите (включително административните) до активите на собствената им компания.',
|
||||
'full_multiple_companies_support_text' => 'Поддръжка на множество компании',
|
||||
'show_in_model_list' => 'Показване в падащите менюта на моделите',
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
|
||||
return [
|
||||
'sent' => 'Линк към вашата парола бе изпратен!',
|
||||
'user' => 'Този потребител не съществува или няма свързан email адрес',
|
||||
'user' => 'No matching active user found with that email.',
|
||||
];
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ return array(
|
||||
'about_categories' => 'Kategorie usnadňují organizovat majetek. Takovou kategorii může být např. "Desktopy", "Notebooky", "Mobilní telefony", "Tablety", apod., ale můžete použít kategorie jakýmkoli způsobem.',
|
||||
'asset_categories' => 'Kategorie majetku',
|
||||
'category_name' => 'Jméno kategorie',
|
||||
'checkin_email' => 'Send email to user on checkin/checkout.',
|
||||
'checkin_email_notification' => 'This user will be sent an email on checkin/checkout.',
|
||||
'checkin_email' => 'Při naskladnění/vyskladnění poslat uživateli e-mail.',
|
||||
'checkin_email_notification' => 'Tomuto uživateli bude poslán e-mail při naskladnění/vyskladnění.',
|
||||
'clone' => 'Klonovat Kategorii',
|
||||
'create' => 'Vytvořit kategorii',
|
||||
'edit' => 'Upravit Kategorii',
|
||||
|
||||
@@ -20,7 +20,7 @@ return array(
|
||||
'field_element_short' => 'Typ',
|
||||
'field_format' => 'Formát',
|
||||
'field_custom_format' => 'Vlastní formát',
|
||||
'field_custom_format_help' => 'This field allows you to use a regex expression for validation. It should start with "regex:" - for example, to validate that a custom field value contains a valid IMEI (15 numeric digits), you would use <code>regex:/^[0-9]{15}$/</code>.',
|
||||
'field_custom_format_help' => 'Toto pole umožňuje použít pro validaci regulární výrazy. Mělo by začínat slovem "regex:" - například pro ověření, že zadaná hodnota pole obsahuje platný IMEI (15 číslic), použijte <code>regex:/^[0-9]{15}$/</code>.',
|
||||
'required' => 'Povinné',
|
||||
'req' => 'Pov.',
|
||||
'used_by_models' => 'Užito u modelů',
|
||||
@@ -28,5 +28,5 @@ return array(
|
||||
'create_fieldset' => 'Nová sada',
|
||||
'create_field' => 'Nové vlastní pole',
|
||||
'value_encrypted' => 'Hodnota tohoto pole je zašifrována v databázi. Pouze administrátoři budou moci zobrazit dešifrovanou hodnotu',
|
||||
'show_in_email' => 'Include the value of this field in checkout emails sent to the user? Encrypted fields cannot be included in emails.',
|
||||
'show_in_email' => 'Zahrnout hodnotu této kolonky do e-mailu o vyskladnění pro uživatele? Šifrované kolonky nemohou být součástí e-mailů.',
|
||||
);
|
||||
|
||||
@@ -5,7 +5,7 @@ return array(
|
||||
'about_assets_text' => 'Majetky jsou položky sledované sériovým číslem nebo značkou. Mají tendenci mít vyšší hodnotou, tam kde je důležitá identifikace určité položky.',
|
||||
'archived' => 'Archivováno',
|
||||
'asset' => 'Majetek',
|
||||
'bulk_checkout' => 'Checkout Assets',
|
||||
'bulk_checkout' => 'Vyskladnit majetek',
|
||||
'checkin' => 'Převzít majetek',
|
||||
'checkout' => 'Pokladní majetek',
|
||||
'clone' => 'Klonovat majetek',
|
||||
|
||||
@@ -16,8 +16,8 @@ return array(
|
||||
),
|
||||
|
||||
'restore' => array(
|
||||
'error' => 'Manufacturer was not restored, please try again',
|
||||
'success' => 'Manufacturer restored successfully.'
|
||||
'error' => 'Výrobce nebyl obnoven, zkuste to znovu',
|
||||
'success' => 'Výrobce úspěšně obnoven.'
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
|
||||
@@ -4,9 +4,9 @@ return array(
|
||||
'about_models_title' => 'O modelech majetku',
|
||||
'about_models_text' => 'Modely majetku jsou způsoby seskupení shodných majetků. "MBP 2013", "iPhone 6s" atd.',
|
||||
'deleted' => 'Model byl vymazán. <a href="/hardware/models/:model_id/restore">Klikněte sem pro jeho obnovení</a>.',
|
||||
'bulk_delete' => 'Bulk Delete Asset Models',
|
||||
'bulk_delete_help' => 'Use the checkboxes below to confirm the deletion of the selected asset models. Asset models that have assets associated with them cannot be deleted until the assets are associated with a different model.',
|
||||
'bulk_delete_warn' => 'You are about to delete :model_count asset models.',
|
||||
'bulk_delete' => 'Hromadné mazání modelů majetku',
|
||||
'bulk_delete_help' => 'Pomocí zaškrtávacích kolonek potvrďte smazání označených modelů majetku. Modely majetku, ke kterým je přiřazen majetek nemohou být smazány dokud jim přiřazený majetek nebude přeřazen k jinému modulu.',
|
||||
'bulk_delete_warn' => 'Chystáte se smazat :model_count asset models.',
|
||||
'restore' => 'Obnovení Modelu',
|
||||
'requestable' => 'Uživatelé můžou požádat o tento model',
|
||||
'show_mac_address' => 'Zobrazovat pole MAC adresa u zařízení tohoto druhu',
|
||||
@@ -14,5 +14,5 @@ return array(
|
||||
'view_models' => 'Zobrazit Modely',
|
||||
'fieldset' => 'Sada polí',
|
||||
'no_custom_field' => 'Bez vlastních polí',
|
||||
'add_default_values' => 'Add default values',
|
||||
'add_default_values' => 'Přidat výchozí hodnoty',
|
||||
);
|
||||
|
||||
@@ -34,9 +34,9 @@ return array(
|
||||
),
|
||||
|
||||
'bulkdelete' => array(
|
||||
'error' => 'No models were selected, so nothing was deleted.',
|
||||
'success' => ':success_count model(s) deleted!',
|
||||
'success_partial' => ':success_count model(s) were deleted, however :fail_count were unable to be deleted because they still have assets associated with them.'
|
||||
'error' => 'Nebyly vybrány žádné modely, takže nebylo nic smazáno.',
|
||||
'success' => ':success_count modelů smazáno!',
|
||||
'success_partial' => ':success_count modelů smazáno, ale :fail_count nebylo možné smazat protože pořád mají přiřazený majetek.'
|
||||
),
|
||||
|
||||
);
|
||||
|
||||
@@ -4,8 +4,8 @@ return array(
|
||||
'ad' => 'Active Directory',
|
||||
'ad_domain' => 'Doména služby Active Directory',
|
||||
'ad_domain_help' => 'Toto je někdy stejné jako vaše emailová doména, ale ne vždy.',
|
||||
'admin_cc_email' => 'CC Email',
|
||||
'admin_cc_email_help' => 'If you would like to send a copy of checkin/checkout emails that are sent to users to an additional email account, enter it here. Otherwise leave this field blank.',
|
||||
'admin_cc_email' => 'Ve skryté kopii',
|
||||
'admin_cc_email_help' => 'Chcete-li poslat kopii e-mailů pro check-in / checkout, které jsou uživatelům zaslány na další e-mailový účet, zadejte je zde. V opačném případě nechte toto pole prázdné.',
|
||||
'is_ad' => 'Toto je server služby Active Directory',
|
||||
'alert_email' => 'Zasílat upozornění na',
|
||||
'alerts_enabled' => 'Upozornění zapnutá',
|
||||
@@ -25,10 +25,10 @@ return array(
|
||||
'confirm_purge_help' => 'Do rámečku níže zadejte text "DELETE", čímž odstraníte odstraněné záznamy. Tuto akci nelze vrátit zpět.',
|
||||
'custom_css' => 'Vlastní CSS',
|
||||
'custom_css_help' => 'Zadejte libovolné vlastní CSS, které chcete použít. Nezahrnujte <style></style> tagy.',
|
||||
'custom_forgot_pass_url' => 'Custom Password Reset URL',
|
||||
'custom_forgot_pass_url_help' => 'This replaces the built-in forgotten password URL on the login screen, useful to direct people to internal or hosted LDAP password reset functionality. It will effectively disable local user forgotten password functionality.',
|
||||
'custom_forgot_pass_url' => 'Uživatelem určená URL adresa pro resetování hesla',
|
||||
'custom_forgot_pass_url_help' => 'Nahrazuje vestavěnou URL pro změnu zapomenutého hesla na přihlašovací obrazovce, slouží k přesměrování uživatelů na interní nebo hostované funkce obnovení hesla LDAP. Zablokuje přístup k funkci změny hesla lokálního uživatele.',
|
||||
'dashboard_message' => 'Hlášení na nástěnce',
|
||||
'dashboard_message_help' => 'This text will appear on the dashboard for anyone with permission to view the dashboard.',
|
||||
'dashboard_message_help' => 'Tento text se objeví na nástěnce každému, kdo má oprávnění k zobrazení nástěnky.',
|
||||
'default_currency' => 'Výchozí měna',
|
||||
'default_eula_text' => 'Výchozí EULA',
|
||||
'default_language' => 'Výchozí jazyk',
|
||||
@@ -42,8 +42,8 @@ return array(
|
||||
'alt_barcode_type' => 'Typ 1D čárového kódu',
|
||||
'eula_settings' => 'Nastavení EULA',
|
||||
'eula_markdown' => 'Tato EULA umožňuje <a href="https://help.github.com/articles/github-flavored-markdown/">Github markdown</a>.',
|
||||
'footer_text' => 'Additional Footer Text ',
|
||||
'footer_text_help' => 'This text will appear in the right-side footer. Links are allowed using <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>. Line breaks, headers, images, etc may result in unpredictable results.',
|
||||
'footer_text' => 'Další text do zápatí ',
|
||||
'footer_text_help' => 'Tento text se zobrazí v pravém zápatí. Odkazy jsou povoleny pomocí <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>. Zalamování řádků, záhlaví, obrázky atd. mohou mít za následek nepředvídatelné výsledky.',
|
||||
'general_settings' => 'Obecné nastavení',
|
||||
'generate_backup' => 'Vytvořit zálohu',
|
||||
'header_color' => 'Barva záhlaví',
|
||||
@@ -52,8 +52,8 @@ return array(
|
||||
'ldap_enabled' => 'LDAP povoleno',
|
||||
'ldap_integration' => 'LDAP integrace',
|
||||
'ldap_settings' => 'Nastavení LDAP',
|
||||
'ldap_login_test_help' => 'Enter a valid LDAP username and password from the base DN you specified above to test whether your LDAP login is configured correctly. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.',
|
||||
'ldap_login_sync_help' => 'This only tests that LDAP can sync correctly. If your LDAP Authentication query is not correct, users may still not be able to login. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.',
|
||||
'ldap_login_test_help' => 'Zadejte platné LDAP uživatelské jméno a heslo ze základu rozlišeného názvu který jste určili výše a vyzkoušejte zda je LDAP přihlašování správně nastavené. NEJPRVE JE TŘEBA ULOŽIT ZMĚNĚNÉ NASTAVENÍ LDAP.',
|
||||
'ldap_login_sync_help' => 'Otestujte, že LDAP může správně synchronizovat. Pokud ověřovací LDAP dotaz není správný, uživatelé se nemusí být schopni přihlásit. JE NUTNÉ NEJPRVE NEJDŘÍVE ULOŽIT NASTAVENÍ LDAP POKUD BYLO ZMĚNĚNO.',
|
||||
'ldap_server' => 'LDAP server',
|
||||
'ldap_server_help' => 'Toto by mělo začít s ldap: // (pro nešifrované nebo TLS) nebo ldaps: // (pro SSL)',
|
||||
'ldap_server_cert' => 'Validace certifikátů LDAP SSL',
|
||||
@@ -80,17 +80,19 @@ return array(
|
||||
'load_remote_help_text' => 'Tato instalace Snipe-IT může nahrávat skripty z vnějšího světa.',
|
||||
'login_note' => 'Přihlásit se Poznámka',
|
||||
'login_note_help' => 'Volitelně můžete na obrazovce přihlášení zadat několik vět, například pomoci lidem, kteří nalezli ztracené nebo ukradené zařízení. Toto pole akceptuje značku <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavedmarkdown</a>',
|
||||
'login_remote_user_text' => 'Remote User login options',
|
||||
'login_remote_user_enabled_text' => 'Enable Login with Remote User Header',
|
||||
'login_remote_user_enabled_help' => 'This option enables Authentication via the REMOTE_USER header according to the "Common Gateway Interface (rfc3875)"',
|
||||
'login_common_disabled_text' => 'Disable other authentication mechanisms',
|
||||
'login_common_disabled_help' => 'This option disables other authentication mechanisms. Just enable this option if you are sure that your REMOTE_USER login is already working',
|
||||
'login_remote_user_text' => 'Volby vzdáleného přihlašování uživatele',
|
||||
'login_remote_user_enabled_text' => 'Zapnout přihlašování s hlavičkou vzdálený uživatel',
|
||||
'login_remote_user_enabled_help' => 'Tato volba zapne ověřování prostřednictvím hlavičky REMOTE_USER v souladu s „ommon Gateway Interface (norma rfc3875)“',
|
||||
'login_common_disabled_text' => 'Vypnout ostatní způsoby ověřování',
|
||||
'login_common_disabled_help' => 'Tato volba vypne ostatní způsoby ověřování. Použijte ji pouze pokud jste si jistí, že už funguje přihlašování REMOTE_USER',
|
||||
'login_remote_user_custom_logout_url_text' => 'Uživatelsky určená URL adresa odhlašování',
|
||||
'login_remote_user_custom_logout_url_help' => 'If a url is provided here, users will get redirected to this URL after the user logs out of Snipe-IT. This is useful to close the user sessions of your Authentication provider correctly.',
|
||||
'login_remote_user_custom_logout_url_help' => 'Pokud je zde uvedena adresa URL, uživatelé budou po odhlášení ze Snipe-IT přesměrování na tuto URL. To je užitečné pro správné ukončení relací Authentication providera.',
|
||||
'logo' => 'Logo',
|
||||
'logo_print_assets' => 'Použijte v tisku',
|
||||
'logo_print_assets_help' => 'Používat branding na seznamech k tisku ',
|
||||
'full_multiple_companies_support_help_text' => 'Omezení uživatelů (včetně správců) jsou přiřazená ke společnostem s majetkem společnosti.',
|
||||
'full_multiple_companies_support_text' => 'Plná podpora více společností',
|
||||
'show_in_model_list' => 'Show in Model Dropdowns',
|
||||
'show_in_model_list' => 'Zobrazit v rozbalovacích nabídkách modelu',
|
||||
'optional' => 'volitelný',
|
||||
'per_page' => 'Výsledků na stránku',
|
||||
'php' => 'Verze PHP',
|
||||
@@ -108,22 +110,22 @@ return array(
|
||||
'settings' => 'Nastavení',
|
||||
'show_alerts_in_menu' => 'Zobrazovat upozornění v horní nabídce',
|
||||
'show_archived_in_list' => 'Archivovaný majetek',
|
||||
'show_archived_in_list_text' => 'Show archived assets in the "all assets" listing',
|
||||
'show_images_in_email' => 'Show images in emails',
|
||||
'show_images_in_email_help' => 'Uncheck this box if your Snipe-IT installation is behind a VPN or closed network and users outside the network will not be able to load images served from this installation in their emails.',
|
||||
'show_archived_in_list_text' => 'Zobrazit archivovaný majetek ve výpisu „veškerý majetek“',
|
||||
'show_images_in_email' => 'Zobrazovat obrázky v e-mailech',
|
||||
'show_images_in_email_help' => 'Zrušte zaškrtnutí této kolonky, pokud je instalace Snipe-IT za VPN nebo uzavřenou sítí a uživatelé mimo síť nebudou moci do svých e-mailů načíst obrázky z této instalace.',
|
||||
'site_name' => 'Název stránky',
|
||||
'slack_botname' => 'Slack Botname',
|
||||
'slack_channel' => 'Slack kanál',
|
||||
'slack_endpoint' => 'Slack koncový bod',
|
||||
'slack_integration' => 'Nastavení Slack',
|
||||
'slack_integration_help' => 'Slack integrace je dobrovolná, nicméně pokud ho chcete používat jsou vyžadovány koncový bod a kanál. Chcete-li nakonfigurovat integraci Slack, nejprve <a href=":slack_link" target="_new"> ytvořte příchozí webhook</a> na vašem Slack účtu.',
|
||||
'slack_integration_help_button' => 'Once you have saved your Slack information, a test button will appear.',
|
||||
'slack_test_help' => 'Test whether your Slack integration is configured correctly. YOU MUST SAVE YOUR UPDATED SLACK SETTINGS FIRST.',
|
||||
'slack_integration_help_button' => 'Po uložení informací ke Slack se zobrazí tlačítko pro vyzkoušení.',
|
||||
'slack_test_help' => 'Zkontrolujte, zda je správně nakonfigurována integrace Slack. MUSÍTE NEJDŘÍVE ULOŽIT NASTAVENÍ SLACK POKUD BYLO ZMĚNĚNO.',
|
||||
'snipe_version' => 'Verze Snipe-IT',
|
||||
'support_footer' => 'Support Footer Links ',
|
||||
'support_footer_help' => 'Specify who sees the links to the Snipe-IT Support info and Users Manual.',
|
||||
'version_footer' => 'Version in Footer ',
|
||||
'version_footer_help' => 'Specify who sees the Snipe-IT version and build number.',
|
||||
'support_footer' => 'Odkazy v zápatí na podporu ',
|
||||
'support_footer_help' => 'Určete, kdo uvidí odkazy na Snipe-IT podporu a uživatelskou příručku',
|
||||
'version_footer' => 'Verze v zápatí ',
|
||||
'version_footer_help' => 'Určete kdo uvidí verzi Snipe-IT a číslo sestavení.',
|
||||
'system' => 'Systémové informace',
|
||||
'update' => 'Upravit nastavení',
|
||||
'value' => 'Hodnota',
|
||||
@@ -134,9 +136,9 @@ return array(
|
||||
'label_dimensions' => 'Rozměry štítku (palce)',
|
||||
'next_auto_tag_base' => 'Další auto přírůstek',
|
||||
'page_padding' => 'Okraje stránky (palce)',
|
||||
'privacy_policy_link' => 'Link to Privacy Policy',
|
||||
'privacy_policy' => 'Privacy Policy',
|
||||
'privacy_policy_link_help' => 'If a url is included here, a link to your privacy policy will be included in the app footer and in any emails that the system sends out, in compliance with GDPR. ',
|
||||
'privacy_policy_link' => 'Odkaz na zásady osobních údajů',
|
||||
'privacy_policy' => 'Zásady ochrany soukromí',
|
||||
'privacy_policy_link_help' => 'Pokud je zde zahrnuta URL adresa, odkaz na zásady ochrany osobních údajů budou obsaženy do zápatí aplikace a pokud bude zahrnuto ve všech e-mailech, které systém odešle, díky čemuž bude odpovídat požadavkům předpisu GDPR. ',
|
||||
'purge' => 'Vyčištění odstraněných záznamů',
|
||||
'labels_display_bgutter' => 'Spodní okraj štítku',
|
||||
'labels_display_sgutter' => 'Boční okraj štítku',
|
||||
@@ -179,7 +181,7 @@ return array(
|
||||
'bottom' => 'dole',
|
||||
'vertical' => 'svislé',
|
||||
'horizontal' => 'vodorovné',
|
||||
'unique_serial' => 'Unique serial numbers',
|
||||
'unique_serial_help_text' => 'Checking this box will enforce a uniqueness constraint on asset serials',
|
||||
'unique_serial' => 'Neopakující se sériová čísla',
|
||||
'unique_serial_help_text' => 'Zaškrtnutím tohoto políčka bude vynucena jedinečnost seriových čísel položek majetku',
|
||||
'zerofill_count' => 'Délka značek majetku včetně zerofill',
|
||||
);
|
||||
|
||||
@@ -6,7 +6,7 @@ return array(
|
||||
'create' => 'Vytvořit označení stavu',
|
||||
'color' => 'Barva grafu',
|
||||
'default_label' => 'Výchozí štítek',
|
||||
'default_label_help' => 'This is used to ensure your most commonly used status labels appear at the top of the select box when creating/editing assets.',
|
||||
'default_label_help' => 'Toto se používá k zajištění zobrazení nejčastěji používaných štítků v horní části rozbalovacího pole, při vytváření nebo úpravách položek majetku.',
|
||||
'deployable' => 'Připraveno k nasazení',
|
||||
'info' => 'Označení stavu se používá k popisu různých stavů majetku. Můžou být v opravě, ztracení atd. Lze vytvořit nové stavy pro další možné stavy.',
|
||||
'name' => 'Název stavu',
|
||||
|
||||
@@ -19,9 +19,9 @@ return array(
|
||||
'confirm' => 'Opravdu si přejete odstranit tohoto dodavatele?',
|
||||
'error' => 'Vyskytl se problém při mazání dodavatele. Zkuste to prosím znovu.',
|
||||
'success' => 'Dodavatel byl úspěšně smazán.',
|
||||
'assoc_assets' => 'This supplier is currently associated with :asset_count asset(s) and cannot be deleted. Please update your assets to no longer reference this supplier and try again. ',
|
||||
'assoc_licenses' => 'This supplier is currently associated with :licenses_count licences(s) and cannot be deleted. Please update your licenses to no longer reference this supplier and try again. ',
|
||||
'assoc_maintenances' => 'This supplier is currently associated with :asset_maintenances_count asset maintenances(s) and cannot be deleted. Please update your asset maintenances to no longer reference this supplier and try again. ',
|
||||
'assoc_assets' => 'Tento dodavatel je v současné době přiřazen k :asset_count položkám majetku a nelze jej smazat. Aktualizujte svůj majetek tak, aby již tento dodavatel nebyl přiřazen a zkuste to znovu. ',
|
||||
'assoc_licenses' => 'Tento dodavatel je v současné době spojen s :licenses_count licencemi a nelze jej smazat. Aktualizujte prosím své licence, abyste již tento dodavatel nebyl přiřazen a zkuste to znovu. ',
|
||||
'assoc_maintenances' => 'Tento dodavatel je v současné době spojen s údržbou :asset_maintenances_count položek majetku a nemůže být smazán. Aktualizujte prosím údržbu vašeho majetku, aby již tento dodavatel nebyl přiřazen a zkuste to znovu. ',
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
|
||||
return array(
|
||||
'activated_help_text' => 'This user can login',
|
||||
'activated_disabled_help_text' => 'You cannot edit activation status for your own account.',
|
||||
'activated_help_text' => 'Tento uživatel se může přihlásit',
|
||||
'activated_disabled_help_text' => 'Nelze upravit stav aktivace pro svůj vlastní účet.',
|
||||
'assets_user' => 'Majetky přiřazené :name',
|
||||
'bulk_update_warn' => 'Chystáte se upravit vlastnosti :user_count uživatelů. Nezapomeňte, že pomocí tohoto formuláře nemůžete změnit vlastní atributy uživatele a musíte provádět vlastní úpravy individuálně.',
|
||||
'bulk_update_help' => 'Tento formulář umožňuje aktualizovat více uživatelů najednou. Vyplňte pouze pole, která potřebujete změnit. Všechna pole, která jsou prázdná, zůstanou nezměněny.',
|
||||
|
||||
@@ -12,5 +12,5 @@ return array(
|
||||
'submit' => 'Odeslat',
|
||||
'upload' => 'Nahrát',
|
||||
'select_file' => 'Vybrat soubor...',
|
||||
'select_files' => 'Select Files...',
|
||||
'select_files' => 'Vybrat soubory…',
|
||||
);
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
'activity_report' => 'Report aktivity',
|
||||
'address' => 'Adresa',
|
||||
'admin' => 'Admin',
|
||||
'administrator' => 'Administrator',
|
||||
'administrator' => 'Správce',
|
||||
'add_seats' => 'Přidaná licenční místa',
|
||||
'all_assets' => 'Všechna zařízení',
|
||||
'all' => 'Vše',
|
||||
@@ -39,9 +39,9 @@
|
||||
'checkin' => 'Příjem',
|
||||
'checkin_from' => 'Převzít od',
|
||||
'checkout' => 'Výdej',
|
||||
'checkouts_count' => 'Checkouts',
|
||||
'checkins_count' => 'Checkins',
|
||||
'user_requests_count' => 'Requests',
|
||||
'checkouts_count' => 'Vyskladnění',
|
||||
'checkins_count' => 'Naskladnění',
|
||||
'user_requests_count' => 'Požadavky',
|
||||
'city' => 'Město',
|
||||
'click_here' => 'Klikněte zde',
|
||||
'clear_selection' => 'Vyprázdnit výběr',
|
||||
@@ -68,7 +68,7 @@
|
||||
'debug_warning' => 'Varování!',
|
||||
'debug_warning_text' => 'Tato aplikace běží ve výrobním režimu s povoleným laděním. To znamená že citlivá data mohou být přístupná vnějšímu světu. Deaktivujte režim ladění nastavením hodnoty <code>APP_DEBUG</code> v souboru <code>.env</code> na <code>false</code>.',
|
||||
'delete' => 'Odstranit',
|
||||
'delete_confirm' => 'Are you sure you wish to delete :item?',
|
||||
'delete_confirm' => 'Opravdu chcete smazat :item?',
|
||||
'deleted' => 'Odstraněno',
|
||||
'delete_seats' => 'Vymazaná licenční místa',
|
||||
'departments' => 'Oddělení',
|
||||
@@ -85,8 +85,8 @@
|
||||
'email_domain_help' => 'Toto je použito na generování e-mailových adres při importu',
|
||||
'filastname_format' => 'Iniciál Jména Příjmení (jsmith@example.com)',
|
||||
'firstname_lastname_format' => 'Jméno Příjmení (jane.smith@example.com)',
|
||||
'firstname_lastname_underscore_format' => 'First Name Last Name (jane_smith@example.com)',
|
||||
'lastnamefirstinitial_format' => 'Last Name First Initial (smithj@example.com)',
|
||||
'firstname_lastname_underscore_format' => 'Jméno Příjmení (jan_novak@example.com)',
|
||||
'lastnamefirstinitial_format' => 'Příjmení první písmeno ze jména (novakj@example.com)',
|
||||
'first' => 'První',
|
||||
'first_name' => 'Jméno',
|
||||
'first_name_format' => 'Jméno (jane@example.com)',
|
||||
@@ -94,16 +94,16 @@
|
||||
'file_name' => 'Soubor',
|
||||
'file_uploads' => 'Nahrání souboru',
|
||||
'generate' => 'Vytvořit',
|
||||
'github_markdown' => 'This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
|
||||
'github_markdown' => 'V kolonce je možné použít <a href="https://help.github.com/articles/github-flavored-markdown/">Github variantu markdown</a>.',
|
||||
'groups' => 'Skupiny',
|
||||
'gravatar_email' => 'Emailová adresa Gravatar',
|
||||
'history' => 'Historie',
|
||||
'history_for' => 'Historie uživatele',
|
||||
'id' => 'ID',
|
||||
'image' => 'Image',
|
||||
'image' => 'Obrázek',
|
||||
'image_delete' => 'Smazat obrázek',
|
||||
'image_upload' => 'Nahrát obrázek',
|
||||
'image_filetypes_help' => 'Accepted filetypes are jpg, png, gif, and svg. Max upload size allowed is :size.',
|
||||
'image_filetypes_help' => 'Podporované typy souborů jsou jpg, png, gif, a svg. Velikost může být nejvýše :size.',
|
||||
'import' => 'Import',
|
||||
'import-history' => 'Historie importu',
|
||||
'asset_maintenance' => 'Údržba zařízení',
|
||||
@@ -127,7 +127,7 @@
|
||||
'locations' => 'Umístění',
|
||||
'logout' => 'Odhlásit',
|
||||
'lookup_by_tag' => 'Vyhledávání podle značky majetku',
|
||||
'maintenances' => 'Maintenances',
|
||||
'maintenances' => 'Údržby',
|
||||
'manufacturer' => 'Výrobce',
|
||||
'manufacturers' => 'Výrobci',
|
||||
'markdown' => 'Toto pole umožňuje <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
|
||||
@@ -162,7 +162,7 @@
|
||||
'recent_activity' => 'Nedávná aktivita',
|
||||
'remove_company' => 'Odstraňte sdružení společnosti',
|
||||
'reports' => 'Reporty',
|
||||
'restored' => 'restored',
|
||||
'restored' => 'obnoveno',
|
||||
'requested' => 'Požadováno',
|
||||
'request_canceled' => 'Žádost zrušena',
|
||||
'save' => 'Uložit',
|
||||
@@ -182,10 +182,10 @@
|
||||
'select_asset' => 'Zvolte majetek',
|
||||
'settings' => 'Nastavení',
|
||||
'show_deleted' => 'Zobrazit smazané',
|
||||
'show_current' => 'Show Current',
|
||||
'show_current' => 'Zobrazit aktuální',
|
||||
'sign_in' => 'Přihlásit se',
|
||||
'signature' => 'Podpis',
|
||||
'skin' => 'Skin',
|
||||
'skin' => 'Vzhled',
|
||||
'some_features_disabled' => 'REŽIM DEMO: Některé funkce jsou pro tuto instalaci zakázány.',
|
||||
'site_name' => 'Název lokality',
|
||||
'state' => 'Stát',
|
||||
@@ -206,7 +206,7 @@
|
||||
'unknown_admin' => 'Neznámy správce',
|
||||
'username_format' => 'Formát uživatelského jména',
|
||||
'update' => 'Aktualizace',
|
||||
'upload_filetypes_help' => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, xls, txt, lic, zip, and rar. Max upload size allowed is :size.',
|
||||
'upload_filetypes_help' => 'Podporované typy souborů jsou png, gif, jpg, jpeg, doc, docx, pdf, xls, txt, lic, zip, a rar. Velikost může být nejvýše :size.',
|
||||
'uploaded' => 'Nahráno',
|
||||
'user' => 'Uživatel',
|
||||
'accepted' => 'přijato',
|
||||
|
||||
@@ -21,7 +21,7 @@ return array(
|
||||
'Confirm_Asset_Checkin' => 'Potvrďte převzetí majetku.',
|
||||
'Confirm_Accessory_Checkin' => 'Potvrďte převzetí příslušenství.',
|
||||
'Confirm_accessory_delivery' => 'Potvrďte dodání příslušenství.',
|
||||
'Confirm_license_delivery' => 'Confirm license delivery.',
|
||||
'Confirm_license_delivery' => 'Potvrdit dodání licence.',
|
||||
'Confirm_asset_delivery' => 'Potvrďte dodání produktu.',
|
||||
'Confirm_consumable_delivery' => 'Potvrďte dodání spotřebního zboží.',
|
||||
'current_QTY' => 'Aktuální množství',
|
||||
@@ -52,19 +52,19 @@ return array(
|
||||
'requested' => 'Zažádáno:',
|
||||
'reset_link' => 'Váš odkaz pro resetování hesla',
|
||||
'reset_password' => 'Pro zresetování vašeho hesla klikněte na odkaz:',
|
||||
'serial' => 'Serial',
|
||||
'serial' => 'Sériové číslo',
|
||||
'supplier' => 'Dodavatelé',
|
||||
'tag' => 'Značka',
|
||||
'test_email' => 'Testovací email od Snipe-IT',
|
||||
'test_mail_text' => 'Toto je test ze systému Snipe-IT Asset Management System. Pokud jste ho dostali, email funguje :)',
|
||||
'the_following_item' => 'Následující položka byla převzata: ',
|
||||
'low_inventory_alert' => 'There is :count item that is below minimum inventory or will soon be low.|There are :count items that are below minimum inventory or will soon be low.',
|
||||
'assets_warrantee_alert' => 'There is :count asset with a warrantee expiring in the next :threshold days.|There are :count assets with warrantees expiring in the next :threshold days.',
|
||||
'license_expiring_alert' => 'There is :count license expiring in the next :threshold days.|There are :count licenses expiring in the next :threshold days.',
|
||||
'low_inventory_alert' => 'Je zde :count položka která je pod minimálním stavem nebo brzy bude.|Jsou zde :count položky které jsou pod minimálním stavem nebo brzy budou.',
|
||||
'assets_warrantee_alert' => 'Je zde :count majetek se zárukou končící v následujících :threshold dnech.|Jsou zde :count majetky se zárukou končící v následujících :threshold dnech.',
|
||||
'license_expiring_alert' => 'Je zde :count licence, které končí platnost v příštích :threshold dnech.|Jsou zde :count licence, kterým končí platnost v příštích :threshold dnech.',
|
||||
'to_reset' => 'Pro resetování vašeho hesla vyplňte tento formulář:',
|
||||
'type' => 'Typ',
|
||||
'user' => 'User',
|
||||
'username' => 'Username',
|
||||
'user' => 'Uživatel',
|
||||
'username' => 'Uživatelské jméno',
|
||||
'welcome' => 'Vítej uživateli :name',
|
||||
'welcome_to' => 'Vítejte na :web!',
|
||||
'your_credentials' => 'Vaše pověření Snipe-IT',
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user