Compare commits

...

123 Commits

Author SHA1 Message Date
snipe f88fee0f21 Make user notes field editable via API 2019-02-12 23:58:30 -08:00
snipe c0669150fb Bumped point version 2019-02-12 23:48:31 -08:00
snipe f3c12f38b6 Fixed #6061 - Assigned user group cannot be removed
This bug was a result of attempting to check if the groups field had a value, and only THEN trying to sync the groups. This meant that uf you were removing ALL groups, the  sync wouldn’t be triggered.

This still needs to be updated in the API.
2019-02-12 23:43:38 -08:00
snipe 5e19178a30 Do not count deleted locations in managedLocation check on user delete 2019-02-12 23:32:10 -08:00
snipe 90cddb7aee Fixed #6113 - use $asset->fill vs filled() to allow blanking values via API (#6693)
Need to confirm that re-enabling `\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,` won’t mangle anything. I know we ran into some issues when testing a long time ago, but not sure those issues apply anymore, and I can’t remember what they were.
2019-02-12 22:08:38 -08:00
snipe 6d828964be Merge branch 'master' of https://github.com/snipe/snipe-it 2019-02-04 18:58:32 -08:00
snipe 971fcf5800 Fixed #6633 - return 200 status code 2019-02-04 18:58:28 -08:00
Daniel Ruf 2ad270cf33 ci: fix indentation (#6669) 2019-01-30 15:14:17 -08:00
Daniel Ruf 8ce78c6b31 tests: allow to fail on PHP 7.3 and use the latest PHP 7.1 release (#6666) 2019-01-30 14:32:33 -08:00
Daniel Ruf af3c8195af tests: fix expected string (#6665) 2019-01-30 14:12:20 -08:00
snipe 117b4c59cc Bumped minor version 2019-01-25 21:06:08 -08:00
snipe 194d0733d4 Fixed #6644 - asset name not linked in Reports > Asset Maintenance Report
This report will likely be deprecated.
2019-01-25 20:57:14 -08:00
snipe a371e8d53f Added calibration as a maintenance type
Should just make these custmizable options
2019-01-24 15:17:33 -08:00
snipe 8f09cca043 Fixed incorrect group route 2019-01-24 15:17:11 -08:00
snipe 39bca49e8f Specify table name in deleted user display 2019-01-24 14:38:18 -08:00
snipe b8269020ae Specify table name in deleted user display 2019-01-24 14:37:39 -08:00
snipe 601c129bbf Embed images in emails 2019-01-17 20:45:24 -08:00
snipe b293d00699 Switch LDAP error to debug, to avoid crapping up the logs 2019-01-17 20:18:03 -08:00
snipe 75a0cf97e2 Return an error if asset maintenance is associated with a non-existant asset 2019-01-16 02:19:57 -08:00
snipe c055e3af21 Only try to return the asset tag link if a valid asset id has been passed 2019-01-16 02:19:35 -08:00
snipe a1f93e733c Fixed undefined error when maintenance is associated with a deleted asset 2019-01-16 01:45:51 -08:00
fanta8897 49073742b5 Updating LDAP such that each user is not required to be bindable to LDAP (#6571)
* Update Ldap.php

* Update Ldap.php

* Update Ldap.php

* Update Ldap.php

* Update Ldap.php

Updating LDAP.php such that the admin bind will ONLY occur if the user attempting auth cannot bind. If that is the case, it will attempt to bind as admin and search for that user, prior to failing.
2019-01-15 14:04:21 -08:00
Sxderp 187206cb88 Fix saving of REMOTE_USER setting broken by 1a64879b6 (#6565)
The previous commit made it such that remote user login could only
be enabled if two factor authentication was also enabled. Unnest
the configuration so that the setting can be applied without.
2019-01-15 13:59:36 -08:00
Hubert 8420cb7ec1 Fixed problem with import when using snipeit:import command (#6550) 2019-01-15 13:58:23 -08:00
Andrey Bolonin 75252bce05 add php 7.3 (#6556) 2019-01-10 13:21:04 -08:00
snipe 794824713e Bumped minor version 2019-01-03 11:22:06 -08:00
snipe 8f6ea84fca Fixed #4568 - escaping values in custom report 2018-12-12 19:38:24 -08:00
snipe ea1b792a93 Fixed #6491 - cleaner return methods for PHP 7.3 compact() 2018-12-12 18:23:39 -08:00
Ben RUBSON 4ffb8f14b8 Improve Memcached settings (#6485)
* Improved memcached settings

* Improved memcached settings
2018-12-06 14:39:14 -08:00
Wes Hulette d023f61bc4 Fixed missing importer (#6413)
Fixed missing manager_id
Fixed missing department_id
2018-12-04 13:06:12 -08:00
snipe dd5ca73602 Set support footer and version footer to on when resetting the demo 2018-11-08 12:52:37 -08:00
snipe 2632f730d1 Sets activated to 0 in UserImporter if the activated column isn’t set 2018-11-07 22:36:58 -08:00
snipe 24c158bfe6 Added missing use statement for departments in importer 2018-11-07 18:33:43 -08:00
snipe 3d4a5a8066 More importer tweaks for dept and manager 2018-11-07 18:05:53 -08:00
snipe db7e0b56f2 Fixed department id on asset import with users 2018-11-07 17:36:34 -08:00
snipe f2478d813c Fix manager id if no manager is given in importer 2018-11-07 17:33:27 -08:00
snipe 192aa9eb71 Fixed #6386 - licenses not searching on category name 2018-11-02 17:14:08 -07:00
Tim Bishop 0eef0fc1dd Sync with develop branch. (#6377)
Without this change argv[1] is ignored.
2018-10-31 11:11:41 -07:00
snipe 81f8fe34cd Removed debugging line 2018-10-30 18:11:27 -07:00
snipe f744696043 Fixed #6375 - lowercase keys on findAndBindUser to address LDAP syncing issue 2018-10-30 13:12:10 -07:00
snipe 29b0780c6c Added company info to asset maintenances transforrmer 2018-10-30 00:20:16 -07:00
Wes Hulette 6b3b673daa Changed NULL coalesce from ?? (#6353)
PHP 5 does not have the double question mark null coalesce support.
2018-10-26 15:53:18 -07:00
snipe a4876e9f3e Updated language files 2018-10-26 15:51:38 -07:00
snipe 925258bfb4 Bumped version 2018-10-26 15:29:10 -07:00
snipe 1a10aa0dda Fixed #6349 - add view permission for print all assigned 2018-10-19 16:43:28 -07:00
snipe d6f8d1b464 Updated composer lock 2018-10-19 16:40:54 -07:00
snipe 09a102fea8 Only try to return a department if there is a matching field 2018-10-19 01:44:45 -07:00
snipe 304fce73fc Null if blank on user import 2018-10-19 01:38:14 -07:00
snipe 295a68bb7a Try false instead of null 2018-10-19 01:36:15 -07:00
snipe 3aeb521782 Patch PR #6335 to master 2018-10-19 01:30:05 -07:00
snipe f587d2248b WIP: Better handle activation column in importer (#6290)
* Better handle activation column

* Added comments for clarity on importer methods
2018-10-19 00:23:12 -07:00
snipe 8579c5a68a Allow 0 as a consumable min amt 2018-10-15 17:04:51 -07:00
snipe 835b461d7d Fixed #6323 - typo in link for low inventory 2018-10-11 15:31:10 -07:00
Wes Hulette b8a37a0c73 Fixed Expiring Assets Email (#6321) 2018-10-11 14:03:00 -07:00
snipe 41b5b1dfd0 Bumped hash 2018-10-09 17:32:46 -07:00
snipe c7596e7741 Fixed image not uploading on asset create 2018-10-09 17:31:52 -07:00
snipe d4fa81301d Check if user can see assets in statuslabels gate 2018-10-09 16:34:12 -07:00
snipe ec7245965f Bumped to rollbar 2.4.1
https://github.com/rollbar/rollbar-php-laravel/issues/65
2018-10-04 17:09:12 -07:00
snipe de76e8db5f Re-enable rollbar 2018-10-04 12:11:36 -07:00
snipe a52575c7bf Lock rollbar to v2.3.0
https://github.com/rollbar/rollbar-php-laravel/issues/65
https://github.com/rollbar/rollbar-php-laravel/issues/67
2018-10-04 12:11:36 -07:00
Nenad Ticaric bf6703c2e8 fixing double word typo (#6292)
Thanks!
2018-10-04 09:41:50 -07:00
snipe 4db1dd8afc Fixed #6291 - send-welcome argument in cli importer 2018-10-04 04:43:06 -07:00
snipe c39e3acb59 Bumped hash 2018-10-04 02:24:41 -07:00
snipe 7a44da85a0 Fixed issue where admin users could disable activation when editing their own profile 2018-10-04 02:18:20 -07:00
snipe 890b613f71 Temporarily suppress rollbar 2018-10-03 15:47:56 -07:00
snipe 1014bd74e0 Updated rollbar 2018-10-03 14:58:14 -07:00
snipe db385e024b Possible proxy issue fix 2018-10-03 13:04:25 -07:00
snipe c8bff3ef38 Features/add manager and dept to importer (#6277)
* Ignore the simlink for public storage

* Added manager and department to user import

* More UI importer tweaks

* Fisxed typos
2018-10-02 15:43:54 -07:00
snipe 10bc35d604 Fixed PHP warning Undefined offset: 1 in upgrade.php 2018-09-28 12:13:35 -07:00
snipe eea65a3f26 Fixed manufacturers item count 2018-09-28 12:03:27 -07:00
snipe 3b21a19491 Updated language strings 2018-09-28 11:54:52 -07:00
snipe 7a52477294 Added Icelandic and Serbian to locale list 2018-09-28 11:47:59 -07:00
snipe ef0bd72076 Bumped version 2018-09-28 11:21:39 -07:00
snipe ff824ec4db Fixes #6252 - activated flag not checked when editing active user 2018-09-28 11:18:33 -07:00
snipe 75032def9e Fixed #4151 - Undefined index: samaccountname on LDAP import 2018-09-27 16:11:09 -07:00
snipe 3a0f738fb0 Added some hepful comments 2018-09-26 19:20:50 -07:00
snipe 55846cc717 Changed LOG:: to Log:: 2018-09-26 19:06:31 -07:00
snipe 1784278a59 Fixed importer email test 2018-09-26 19:06:09 -07:00
snipe afac0bc441 Removed old isActive model (unused) 2018-09-26 19:05:42 -07:00
snipe ffbee77f6f Patch for 5965 - multiple email recipients no longer working (#6238) 2018-09-26 15:47:53 -07:00
snipe b69b5fdf84 Added counts to location show() API method 2018-09-21 15:50:14 -07:00
Brady Wetherington 89e06054bf Merge pull request #6205 from dasjoe/patch-1
Fixes #5630
2018-09-17 21:45:48 -07:00
Hajo Möller 3159e7713a Fixes #5630 2018-09-11 13:07:45 +02:00
snipe adf6e7d1cd Added group support for user API 2018-09-07 18:25:58 -07:00
snipe ba3662a9ed Bumped hash 2018-09-07 18:12:29 -07:00
snipe 05ea61421f Added manager_id to fillable for locations API 2018-09-07 18:11:38 -07:00
snipe 22ef2ce0b6 Bumped hash 2018-09-07 03:20:31 -07:00
snipe 51d3d130e4 Fixed Not unique table/alias: 'models' on custom report triggered when category is selected 2018-09-07 03:19:54 -07:00
snipe d8a8e1cc09 Bumped version 2018-08-28 11:43:56 -07:00
snipe 522dc1db2a Fixed #6124 2018-08-23 21:05:10 -07:00
snipe db907815ff Removed check for active in password reset form 2018-08-21 18:40:27 -07:00
snipe ae6abdddad Check the user is active before displaying password reset
This would only come into play if an inactive user already received a password reset email and then the system was upgraded to prevent those emails from being sent to inactive users
2018-08-14 19:04:47 -07:00
snipe 63c9fbe10c Temporarily disbable notifying users on import 2018-08-14 18:27:46 -07:00
snipe 101dfd01f2 Bumped hash 2018-08-14 18:22:53 -07:00
snipe 5db5134ae0 Set activated to default on when new user is created 2018-08-14 18:14:41 -07:00
snipe 5294489b0e Fixed HTML typo 2018-08-14 18:14:29 -07:00
snipe 05b2b8fb59 Tweaked code/language for password reset 2018-08-14 18:09:33 -07:00
snipe 0100c56046 Only allow password reset if user is active 2018-08-14 17:46:29 -07:00
Jordi Boggiano e81b221fd1 Fix license identifier (#6043) 2018-08-08 20:36:45 -07:00
snipe f374ac1bf7 Removed duplicate BACKUP_ENV in example env 2018-08-01 15:31:43 -07:00
snipe 524c6c502e Features/restore deleted cmd (#5982)
* Delete content from login attempts table

* Script to restore deleted users and put their asset assignments back

* Uncomment backup
2018-07-27 02:42:55 -07:00
snipe 614e858e44 Restrict users asset listing to just assets checked out to users 2018-07-25 21:38:14 -07:00
snipe 708b1a962c Split out custom_css from custom_header
This makes it so that the custom_css will still be respected even if there is no custom header
2018-07-25 19:01:47 -07:00
snipe 4e55a18a60 Bumped version 2018-07-24 19:46:23 -07:00
snipe 3de1de9dc6 Merge branch 'develop' 2018-07-24 14:04:16 -07:00
snipe e320d2ba05 Fixed #5944 - added logo option for print-assets page (#5950) 2018-07-24 13:37:02 -07:00
snipe ed78a4b8a0 Fixed activated issue for strict mode 2018-07-24 13:28:59 -07:00
snipe 376eb52f00 Fixed #5938 - added “self location edit” as permission 2018-07-24 12:42:16 -07:00
snipe 8ecceeacda Fixed weird display for self options 2018-07-24 12:41:58 -07:00
snipe f4cfb31bf4 Use request object 2018-07-24 12:10:02 -07:00
snipe 227dc7e81d Save model display setting - fix for issue in #5301 2018-07-24 12:10:02 -07:00
snipe 152d985ebc Add @Azerothian as a contributor 2018-07-24 12:10:02 -07:00
Earl Ramirez ef1e8df001 Disable file browsing (#5922)
* Added cron to list of packages

* Disable file browsing from the public directory
2018-07-23 20:40:04 -07:00
snipe 5c2b1a3b70 Add @Azerothian as a contributor 2018-07-23 20:29:15 -07:00
Azerothian 66c3f5432d implemented specific seat checkout (#5887) 2018-07-23 20:28:45 -07:00
Daniel Meltzer de413408f5 Port/reenable most unit tests. (#5921)
* Port/reenable most unit tests.

Should probably flesh out notifications tests in the next few days.

* Disable json checkin in ApiAssetsTest@index for now.  It's broken, but hiding other real broken things.

* Re Disable Groups allowDelete
2018-07-23 06:48:21 -07:00
Daniel Meltzer 059126f642 Checkout update locationid (#5919)
* Fix missing punctuation.  Bad merge.

* If we're checking out to an location, use it's id instead of location_id
2018-07-23 06:47:21 -07:00
Daniel Meltzer 3bc43210ab Add ID to the allowed sort fields in api/Users. (#5929) 2018-07-23 06:46:50 -07:00
Daniel Meltzer 82194cef8a bugfix: updating a user when an admin (not a superuser) would remove any groups from the user. (#5914) 2018-07-21 23:02:06 -07:00
snipe 1956a16d1e Merge branch 'develop' 2018-07-20 13:25:03 -07:00
Till Deeke e1c095adca Removes the typehint for search term string (#5904)
The „string“ typehint only works in PHP >= 7.0.0.
Since we are still supporting versions below that, remove the type hint.
2018-07-20 13:23:44 -07:00
Till Deeke 45a2932f4b Fixes the generation of where conditions (#5902) 2018-07-20 13:23:29 -07:00
Till Deeke b6e3715cd8 Fix: No Notifications for checking out Consumables (#5898)
* Adds a method to consumables to check if a notification should be sent

Adds the checkin_email method to Consumables, this gets checked in notifications when checking out the consumable.

Without the method, no notifications get sent for checking out consumables.

* Fixes the checkin_email method on the License model

This should allow the License to also send checkout/checkin notifications again.
2018-07-20 13:22:49 -07:00
551 changed files with 7583 additions and 2848 deletions
+9
View File
@@ -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
View File
@@ -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
+1
View File
@@ -50,3 +50,4 @@ tests/_support/_generated/*
/storage/oauth-public.key
*.cache
/public/storage
+7 -2
View File
@@ -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:
+1
View File
@@ -20,6 +20,7 @@ vim \
git \
cron \
mysql-client \
cron \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+3 -3
View File
@@ -1,5 +1,5 @@
[![Build Status](https://travis-ci.org/snipe/snipe-it.svg?branch=master)](https://travis-ci.org/snipe/snipe-it) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.svg)](https://crowdin.com/project/snipe-it) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/snipe/snipe-it?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeitapp.svg?style=social)](https://twitter.com/snipeitapp) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&utm_medium=referral&utm_content=snipe/snipe-it&utm_campaign=Badge_Grade)
[![All Contributors](https://img.shields.io/badge/all_contributors-179-orange.svg?style=flat-square)](#contributors) [![Open Source Helpers](https://www.codetriage.com/snipe/snipe-it/badges/users.svg)](https://www.codetriage.com/snipe/snipe-it)
[![All Contributors](https://img.shields.io/badge/all_contributors-180-orange.svg?style=flat-square)](#contributors) [![Open Source Helpers](https://www.codetriage.com/snipe/snipe-it/badges/users.svg)](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!
+15 -5
View File
@@ -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.'),
);
}
+1
View File
@@ -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));
}
+16 -14
View File
@@ -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));
}
+7 -6
View File
@@ -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 {
+1
View File
@@ -30,6 +30,7 @@ class Kernel extends ConsoleKernel
Commands\SyncAssetLocations::class,
Commands\RegenerateAssetTags::class,
Commands\SyncAssetCounters::class,
Commands\RestoreDeletedUsers::class,
];
/**
+10 -38
View File
@@ -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';
+8 -2
View File
@@ -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();
}
+1 -1
View File
@@ -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) {
+16 -16
View File
@@ -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');
}
}
+1 -1
View File
@@ -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');
}
+4 -4
View File
@@ -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
+21 -12
View File
@@ -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);
+1 -1
View File
@@ -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');
}
+13 -7
View File
@@ -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')) {
+2 -2
View File
@@ -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')) {
+20 -11
View File
@@ -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)
+1 -2
View File
@@ -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');
}
+11 -11
View File
@@ -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
View File
@@ -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,
];
/**
+2 -1
View File
@@ -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)) ? [
+99 -7
View File
@@ -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;
}
}
+17 -2
View File
@@ -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.
*
+33 -5
View File
@@ -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;
+10 -6
View File
@@ -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 | | |
+5 -2
View File
@@ -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);
}
/**
+2
View File
@@ -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',
];
}
+5 -1
View File
@@ -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()
{
+5 -5
View File
@@ -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
View File
@@ -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);
}
+2 -1
View File
@@ -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()
+2 -1
View File
@@ -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'];
+2 -1
View File
@@ -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');
+2 -3
View File
@@ -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);
}
}
+16 -1
View File
@@ -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
View File
@@ -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');
}
+1 -1
View File
@@ -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);
}
+4
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -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
View File
@@ -86,6 +86,6 @@ return [
|
*/
'prefix' => 'snipeit',
'prefix' => env('CACHE_PREFIX', 'snipeit'),
];
+7
View File
@@ -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,
),
),
+2 -1
View File
@@ -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
View File
@@ -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',
);
+5 -1
View File
@@ -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
View File
@@ -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
+1
View File
@@ -32,3 +32,4 @@
# Header set X-Permitted-Cross-Domain-Policies "master-only"
</IfModule>
Options -Indexes
+20 -20
View File
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
+20 -20
View File
File diff suppressed because one or more lines are too long
+4 -4
View File
@@ -1,14 +1,14 @@
{
"/js/build/vue.js": "/js/build/vue.js?id=832c22cb5b66ac81ed06",
"/js/build/vue.js": "/js/build/vue.js?id=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 &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobile Phones&quot;, &quot;Tablets&quot;, 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',
+3 -1
View File
@@ -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',
+1 -1
View File
@@ -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.',
];
+16 -14
View File
@@ -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' => 'يتم استخدام تسميات الحالة لوصف الحالات المحتملة للأصول التابعة لك. قد تكون قيد الصيانة أو ضمن المفقودة أو المسروقة، وما إلى ذلك. يمكنك إنشاء تسميات حالة جديدة للأصول القابلة للتوزيع وقيد الانتظار والمؤرشفة.',
+1 -1
View File
@@ -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 من المستخدمين. يرجى ملاحظة أنه لا يمكنك تغيير سمات المستخدم الخاصة بك باستخدام هذا النموذج، ويجب إجراء تعديلات على المستخدم الخاص بك بشكل على حدة.',
+1 -1
View File
@@ -12,5 +12,5 @@ return array(
'submit' => 'إرسال',
'upload' => 'رفع',
'select_file' => 'حدد ملف ...',
'select_files' => 'Select Files...',
'select_files' => 'إختيار ملف...',
);
+15 -15
View File
@@ -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' => 'قبلت',
+4 -4
View File
@@ -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' => 'أوراق اعتماد قنص-إيت الخاص بك',
+1 -1
View File
@@ -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' => 'Показване в падащите менюта на моделите',
+1 -1
View File
@@ -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ř. &quot;Desktopy&quot;, &quot;Notebooky&quot;, &quot;Mobilní telefony&quot;, &quot;Tablety&quot;, 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ů.',
);
+1 -1
View File
@@ -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 -4
View File
@@ -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',
);
+3 -3
View File
@@ -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.'
),
);
+32 -30
View File
@@ -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 &lt;style&gt;&lt;/style&gt; 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 -2
View File
@@ -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.',
+1 -1
View File
@@ -12,5 +12,5 @@ return array(
'submit' => 'Odeslat',
'upload' => 'Nahrát',
'select_file' => 'Vybrat soubor...',
'select_files' => 'Select Files...',
'select_files' => 'Vybrat soubory…',
);
+15 -15
View File
@@ -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',
+7 -7
View File
@@ -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