Compare commits

...

109 Commits

Author SHA1 Message Date
snipe 5979a18852 Merge branch 'develop'
# Conflicts:
#	config/version.php
2017-11-30 16:43:59 -08:00
snipe 5efb803b60 Auto-bumped hash/version 2017-11-30 16:41:06 -08:00
snipe fd4a8edae9 Fixed incorrect glyphs for users/locations 2017-11-30 16:40:58 -08:00
snipe e9fdf06bf6 Improved display of asset status and meta status 2017-11-30 16:40:37 -08:00
snipe 0a5b72e71e Fixed #4517 - order number not visible if no purchase cost given on asset view 2017-11-30 16:39:59 -08:00
snipe 51168e8e10 Auto-bumped hash/version 2017-11-30 13:40:36 -08:00
snipe cefdca3d22 Fixed incorrect has vs input 2017-11-30 13:40:26 -08:00
snipe cc5eee1890 Auto-bumped hash/version 2017-11-30 13:32:12 -08:00
snipe d3864db5e1 Switched to use $request from Input:: facade 2017-11-30 13:32:00 -08:00
snipe ece8ae3adc Fixed #4542 and #4482 - default asset location not updating on biulk edit 2017-11-30 13:31:46 -08:00
snipe e25829c759 Removed extra debug logging 2017-11-30 13:30:20 -08:00
snipe 92afd5f232 Removed debugging console code 2017-11-30 11:48:59 -08:00
snipe b934d2e504 Merge branch 'develop'
# Conflicts:
#	config/version.php
2017-11-27 22:19:24 -08:00
snipe 8cf70e7e20 Auto-bumped hash/version 2017-11-27 22:10:54 -08:00
snipe cdfd720c65 Fixed custom fields edit behavior with cutom format always selected 2017-11-27 22:10:46 -08:00
snipe c0f791cf13 Sigh. 2017-11-27 21:35:06 -08:00
snipe 290cf79778 Auto-bumped hash/version 2017-11-27 21:25:21 -08:00
snipe 8af1481749 Auto-bumped hash/version 2017-11-27 21:20:38 -08:00
snipe d8f404096c Added spacing in js 2017-11-27 21:20:31 -08:00
snipe ea2f7617df Validate checkout_to_type on asset checkout 2017-11-27 21:20:12 -08:00
snipe b6c258bb12 Redirect to back on bad checkout 2017-11-27 21:19:50 -08:00
snipe 804b49cefb Make sure the asset is available for checkout before displaying the checkout screen 2017-11-27 21:18:29 -08:00
snipe 305b0d8edb Fixed #4522 - properly check for valid target, throw error otherwise 2017-11-27 21:17:58 -08:00
snipe 05996019e5 Use asset checkout request in API 2017-11-27 21:17:16 -08:00
snipe 31a967e072 Use general order_number string to mean order number 2017-11-27 21:16:51 -08:00
snipe 0b56ebf291 Fixed radio button selector to provide correct default value in checkout 2017-11-27 21:16:25 -08:00
snipe fcc87b3219 Merge branch 'develop'
# Conflicts:
#	config/version.php
2017-11-24 11:27:54 -08:00
snipe 82fca0c72d Auto-bumped hash/version 2017-11-24 11:25:57 -08:00
snipe 51661b0a21 Fixed #4190 - Added artisan command to regenerate asset tags 2017-11-24 11:25:51 -08:00
snipe e8670fe591 Merge branch 'develop' of github.com:snipe/snipe-it into develop 2017-11-24 10:53:20 -08:00
Daniel Meltzer bee1dfc4a6 More importer fixes (#4516)
* The default locale of en does not include dollar sign in default currency.  Assume if there is no currency symbol set that the dollar sign is a good thing to look for in parsefloat.

* Fix for 4485.  Serial not serial_number

Also fix bug where updating with a csv that does not include custom field columns should not overwrite current values.

* Rename serial_number to serial in default imports to avoid needing to map weirdly.

* Add Test for 4359.  Not reproducable at current though
2017-11-24 10:42:11 -08:00
snipe 83c8449aca Auto-bumped hash/version 2017-11-22 18:43:18 -08:00
snipe 9dba1bb3e5 Merge branch 'develop'
# Conflicts:
#	config/version.php
2017-11-22 18:43:15 -08:00
snipe 76e3398d44 Auto-bumped hash/version 2017-11-22 18:42:33 -08:00
snipe a7e12931fa Check that assigned is an object in reports controller 2017-11-22 18:42:17 -08:00
snipe ba04c64567 Auto-bumped hash/version 2017-11-22 18:34:03 -08:00
snipe 8c8352ecc6 Merge branch 'develop'
# Conflicts:
#	config/version.php
2017-11-22 18:33:56 -08:00
snipe 64b670033d Auto-bumped hash/version 2017-11-22 18:30:45 -08:00
snipe b9d102a5fb Truncate the fieldset table and pivot table on seed as well 2017-11-22 15:57:05 -08:00
snipe 77076e02e8 Fixed - mark supplier as requried in maintenance 2017-11-22 15:22:44 -08:00
snipe c6a761a5ad Fixed - supplier is not required on asset creation/edit 2017-11-22 15:20:46 -08:00
snipe 6f3a90c48b Check that the assigned data is valid 2017-11-22 15:07:34 -08:00
snipe 8f160a8590 Fixed CSV asset export missing checked out to info 2017-11-22 13:05:48 -08:00
snipe 2278d5bfd8 Fixed restore permission to assets API disable delete/checkin/checkout on deleted assets 2017-11-22 10:35:24 -08:00
snipe 66ac147c9e Auto-bumped hash/version 2017-11-22 07:32:40 -08:00
snipe 05e0d15ae4 Auto-bumped hash/version 2017-11-22 07:31:50 -08:00
snipe 8562f018ed Fixed - conflicting error when a user and asset were both checked out 2017-11-22 07:31:38 -08:00
snipe 0cbdcce3ea Production asset manifest 2017-11-22 07:07:33 -08:00
snipe 980be65193 Added ability to turn items on/off in checkout-selector 2017-11-22 07:07:18 -08:00
snipe 3aaaea37e4 Added - sync locations artican call after seed 2017-11-22 06:21:56 -08:00
snipe 964c594c4c Added ItemFormatter for acrtivity report 2017-11-22 06:21:06 -08:00
snipe 9430c4bf43 Added sanity checks in BS tables formatter 2017-11-22 06:20:51 -08:00
snipe 538757317b Fixed #4411 - broken activity report if purge didn’t remove relationship entries 2017-11-22 06:20:28 -08:00
snipe fe986f7c51 Auto-bumped hash/version 2017-11-21 22:45:10 -08:00
snipe 09105871d9 Auto-bumped hash/version 2017-11-21 22:43:33 -08:00
snipe e84a6059f4 Merge branch 'develop' 2017-11-21 22:43:00 -08:00
snipe 09f20873df Auto-bumped hash/version 2017-11-21 22:35:05 -08:00
snipe 2adc1e8ba9 Auto-bumped hash/version 2017-11-21 22:35:04 -08:00
snipe 4a6c18532b Auto-bumped hash/version 2017-11-21 22:35:02 -08:00
snipe 921f882680 Auto-bumped hash/version 2017-11-21 22:35:01 -08:00
snipe f79e5add58 Auto-bumped hash/version 2017-11-21 22:34:59 -08:00
snipe d98d06377e Fixed #4098 - autolink URL and email addresses in listing 2017-11-21 22:34:53 -08:00
snipe 22fdd05314 Add UTF charset 2017-11-21 22:34:07 -08:00
snipe 8c15a4e0c6 Auto-bumped hash/version 2017-11-21 21:00:07 -08:00
snipe 9250b45e6e Auto-bumped hash/version 2017-11-21 21:00:05 -08:00
snipe 3a1de3d2a5 Auto-bumped hash/version 2017-11-21 21:00:02 -08:00
snipe b59dd11304 Auto-bumped hash/version 2017-11-21 21:00:00 -08:00
snipe b6222abb7c Auto-bumped hash/version 2017-11-21 20:59:58 -08:00
snipe dcf8e4f5ef Auto-bumped hash/version 2017-11-21 20:59:54 -08:00
snipe f195073ac3 Auto-bumped hash/version 2017-11-21 20:59:52 -08:00
snipe 452a9d6725 Auto-bumped hash/version 2017-11-21 20:59:50 -08:00
snipe 1d74ddc547 Auto-bumped hash/version 2017-11-21 20:59:45 -08:00
snipe 932b589a14 Auto-bumped hash/version 2017-11-21 20:59:43 -08:00
snipe 671e514785 Auto-bumped hash/version 2017-11-21 20:59:41 -08:00
snipe 1e2ebdb69c Auto-bumped hash/version 2017-11-21 20:59:39 -08:00
snipe 148751d927 Auto-bumped hash/version 2017-11-21 20:59:37 -08:00
snipe efecdfaea0 Auto-bumped hash/version 2017-11-21 20:59:35 -08:00
snipe ab9c84a6b6 Auto-bumped hash/version 2017-11-21 20:59:33 -08:00
snipe 8711bc0dbd Added comments for toggle checkout-to JS 2017-11-21 20:55:57 -08:00
snipe 0adebd1ec8 Add sorting and additional category types to dashboard categories
BREAKING CHANGE: Category type now reports as `category_type`, instead of `type`
2017-11-21 20:33:30 -08:00
snipe 43c1e893c0 Fixed #4494 - use audit settings for asset audit pre-populaton 2017-11-21 20:13:51 -08:00
snipe 7ce63e653b Auto-bumped hash/version 2017-11-21 19:39:53 -08:00
snipe e5129a8b98 Removed next_version 2017-11-21 19:39:33 -08:00
snipe a922c1a298 Auto-bumped hash/version 2017-11-21 19:38:29 -08:00
snipe f4aa812d96 Changed twitter handle to @snipeitapp 2017-11-21 19:02:15 -08:00
snipe 0c9e41e1fa Updated versioning script to handle githooks better 2017-11-21 19:01:47 -08:00
snipe 1d6320a88f Merge branch 'develop' 2017-11-21 16:26:41 -08:00
snipe 4696e799ed Fixes #4491 and #4483 - handle pre-selected asset on checkout, better checkout-to selection UI (#4501)
* Added form checkout selector partial

* Stupid stash

* Added radio button checkout selector javascript

* New compiled production assets

* Added $style override in form partials for select2 ajax lists

* Added checkout-to radio button selector

TODO: Fix for accessibility - currently cannot tab-select this radio button

* Added new checkout-to selector to hardware edit

* Added new checkout-to selector to asset checkout form

* Refactored postCheckout to use radio button submission

This defaults to user checkout if nothing is passed for some reason

* Better visual feedback on whether or not an asset is deployable in edit screen
2017-11-21 15:58:31 -08:00
snipe 2e08a91c53 Merge branch 'develop' 2017-11-20 21:48:57 -08:00
snipe 4fd35573ad Bumped version 2017-11-20 21:20:34 -08:00
snipe caf2cdbf6f Merge branch 'develop' 2017-11-20 20:51:22 -08:00
snipe c0293a7c1c Add @uknzaeinozpas as a contributor 2017-11-20 19:39:04 -08:00
snipe 17405f5de1 Fixed #4413 - Next license seat not bering assigned correctly 2017-11-20 19:21:05 -08:00
snipe bfefa10462 Add @TheVakman as a contributor 2017-11-20 18:54:43 -08:00
snipe 55a140045b Fixed upgrade language 2017-11-16 16:50:16 -08:00
snipe 897bd2c56e Fixed location sorting location instead of rtd 2017-11-16 16:49:48 -08:00
snipe 7321c5937f Fixed #4440 - allow username search in asset dropdown 2017-11-16 16:49:16 -08:00
snipe 98700cab8b Merge branch 'develop' 2017-11-16 14:14:49 -08:00
snipe 3d07635820 Fixed sort by model in asset listing 2017-11-16 14:14:30 -08:00
snipe 59b18a6ada Merge branch 'develop' 2017-11-16 13:49:05 -08:00
snipe ce525c1985 Fixed #4471 - removed gate for categories selectlist 2017-11-16 13:48:38 -08:00
snipe a0d163a3c4 Merge branch 'develop' 2017-11-16 11:41:18 -08:00
snipe faab971931 Improved - removed 500 pixel width on 2FA dropdown 2017-11-16 11:09:42 -08:00
snipe 38eb16dfea Fixed #4408 - requestable assets not working 2017-11-16 11:09:24 -08:00
snipe 4494456cad Merge branch 'develop' 2017-11-15 15:51:50 -08:00
snipe 876dde1280 Fixed #4428 - updated translations 2017-11-15 15:31:34 -08:00
snipe 17ee904828 Fixed #4450 - added MAIL_REPLYTO_ADDR to docker.env 2017-11-15 14:48:45 -08:00
snipe 4f1b58cd35 Merge branch 'develop' 2017-11-15 14:27:47 -08:00
snipe edcd3afc3e Fixes #4457 - use un-escaped CSS for custom CSS styles
We are already escaping the CSS in the show_custom_css() method
2017-11-15 14:27:21 -08:00
159 changed files with 973 additions and 378 deletions
+20
View File
@@ -809,6 +809,26 @@
"contributions": [
"doc"
]
},
{
"login": "TheVakman",
"name": "Lawrence",
"avatar_url": "https://avatars1.githubusercontent.com/u/18545156?v=4",
"profile": "https://github.com/TheVakman",
"contributions": [
"test",
"bug"
]
},
{
"login": "uknzaeinozpas",
"name": "uknzaeinozpas",
"avatar_url": "https://avatars1.githubusercontent.com/u/22473767?v=4",
"profile": "https://github.com/uknzaeinozpas",
"contributions": [
"test",
"code"
]
}
]
}
+2 -2
View File
@@ -1,5 +1,5 @@
[![Build Status](https://travis-ci.org/snipe/snipe-it.svg?branch=develop)](https://travis-ci.org/snipe/snipe-it) [![Stories in Ready](https://badge.waffle.io/snipe/snipe-it.png?label=ready+for+dev&title=Ready+for+development)](http://waffle.io/snipe/snipe-it) [![Maintenance](https://img.shields.io/maintenance/yes/2017.svg)]() [![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/snipeyhead.svg?style=social)](https://twitter.com/snipeyhead) [![Zenhub](https://img.shields.io/badge/Shipping_faster_with-ZenHub-5e60ba.svg)](https://zenhub.io) [![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-87-orange.svg?style=flat-square)](#contributors)
[![All Contributors](https://img.shields.io/badge/all_contributors-89-orange.svg?style=flat-square)](#contributors)
## Snipe-IT - Open Source Asset Management System
@@ -68,7 +68,7 @@ Thanks goes to all of these wonderful people ([emoji key](https://github.com/ken
| [<img src="https://avatars2.githubusercontent.com/u/857740?v=3" width="110px;"/><br /><sub>Gil Rutkowski</sub>](http://FlashingCursor.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=flashingcursor "Code") | [<img src="https://avatars3.githubusercontent.com/u/129360?v=3" width="110px;"/><br /><sub>Desmond Morris</sub>](http://www.desmondmorris.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=desmondmorris "Code") | [<img src="https://avatars2.githubusercontent.com/u/52936?v=3" width="110px;"/><br /><sub>Nick Peelman</sub>](http://peelman.us)<br />[💻](https://github.com/snipe/snipe-it/commits?author=peelman "Code") | [<img src="https://avatars0.githubusercontent.com/u/53161?v=3" width="110px;"/><br /><sub>Abraham Vegh</sub>](https://abrahamvegh.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=abrahamvegh "Code") | [<img src="https://avatars0.githubusercontent.com/u/2818680?v=3" width="110px;"/><br /><sub>Mohamed Rashid</sub>](https://github.com/rashivkp)<br />[📖](https://github.com/snipe/snipe-it/commits?author=rashivkp "Documentation") | [<img src="https://avatars3.githubusercontent.com/u/1509456?v=3" width="110px;"/><br /><sub>Kasey</sub>](http://hinchk.github.io)<br />[💻](https://github.com/snipe/snipe-it/commits?author=HinchK "Code") | [<img src="https://avatars2.githubusercontent.com/u/10522541?v=3" width="110px;"/><br /><sub>Brett</sub>](https://github.com/BrettFagerlund)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=BrettFagerlund "Tests") |
| [<img src="https://avatars2.githubusercontent.com/u/16108587?v=3" width="110px;"/><br /><sub>Jason Spriggs</sub>](http://jasonspriggs.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jasonspriggs "Code") | [<img src="https://avatars2.githubusercontent.com/u/1134568?v=3" width="110px;"/><br /><sub>Nate Felton</sub>](http://n8felton.wordpress.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=n8felton "Code") | [<img src="https://avatars2.githubusercontent.com/u/14036694?v=3" width="110px;"/><br /><sub>Manasses Ferreira</sub>](http://homepages.dcc.ufmg.br/~manassesferreira)<br />[💻](https://github.com/snipe/snipe-it/commits?author=manassesferreira "Code") | [<img src="https://avatars0.githubusercontent.com/u/15913949?v=3" width="110px;"/><br /><sub>Steve</sub>](https://github.com/steveelwood)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=steveelwood "Tests") | [<img src="https://avatars1.githubusercontent.com/u/3361683?v=3" width="110px;"/><br /><sub>matc</sub>](http://twitter.com/matc)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=matc "Tests") | [<img src="https://avatars3.githubusercontent.com/u/7405702?v=3" width="110px;"/><br /><sub>Cole R. Davis</sub>](http://www.davisracingteam.com)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=VanillaNinjaD "Tests") | [<img src="https://avatars2.githubusercontent.com/u/10167681?v=3" width="110px;"/><br /><sub>gibsonjoshua55</sub>](https://github.com/gibsonjoshua55)<br />[💻](https://github.com/snipe/snipe-it/commits?author=gibsonjoshua55 "Code") |
| [<img src="https://avatars2.githubusercontent.com/u/2809241?v=4" width="110px;"/><br /><sub>Robin Temme</sub>](https://github.com/zwerch)<br />[💻](https://github.com/snipe/snipe-it/commits?author=zwerch "Code") | [<img src="https://avatars0.githubusercontent.com/u/6961695?v=4" width="110px;"/><br /><sub>Iman</sub>](https://github.com/imanghafoori1)<br />[💻](https://github.com/snipe/snipe-it/commits?author=imanghafoori1 "Code") | [<img src="https://avatars1.githubusercontent.com/u/6551003?v=4" width="110px;"/><br /><sub>Richard Hofman</sub>](https://github.com/richardhofman6)<br />[💻](https://github.com/snipe/snipe-it/commits?author=richardhofman6 "Code") | [<img src="https://avatars0.githubusercontent.com/u/3697569?v=4" width="110px;"/><br /><sub>gizzmojr</sub>](https://github.com/gizzmojr)<br />[💻](https://github.com/snipe/snipe-it/commits?author=gizzmojr "Code") | [<img src="https://avatars3.githubusercontent.com/u/404729?v=4" width="110px;"/><br /><sub>Jenny Li</sub>](https://github.com/imjennyli)<br />[📖](https://github.com/snipe/snipe-it/commits?author=imjennyli "Documentation") | [<img src="https://avatars0.githubusercontent.com/u/869227?v=4" width="110px;"/><br /><sub>Geoff Young</sub>](https://github.com/GeoffYoung)<br />[💻](https://github.com/snipe/snipe-it/commits?author=GeoffYoung "Code") | [<img src="https://avatars3.githubusercontent.com/u/1068477?v=4" width="110px;"/><br /><sub>Elliot Blackburn</sub>](http://www.elliotblackburn.com)<br />[📖](https://github.com/snipe/snipe-it/commits?author=BlueHatbRit "Documentation") |
| [<img src="https://avatars1.githubusercontent.com/u/6357451?v=4" width="110px;"/><br /><sub>Tõnis Ormisson</sub>](http://andmemasin.eu)<br />[💻](https://github.com/snipe/snipe-it/commits?author=TonisOrmisson "Code") | [<img src="https://avatars0.githubusercontent.com/u/449411?v=4" width="110px;"/><br /><sub>Nicolai Essig</sub>](http://www.nicolai-essig.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=thakilla "Code") | [<img src="https://avatars1.githubusercontent.com/u/14809698?v=4" width="110px;"/><br /><sub>Danielle</sub>](https://github.com/techincolor)<br />[📖](https://github.com/snipe/snipe-it/commits?author=techincolor "Documentation") |
| [<img src="https://avatars1.githubusercontent.com/u/6357451?v=4" width="110px;"/><br /><sub>Tõnis Ormisson</sub>](http://andmemasin.eu)<br />[💻](https://github.com/snipe/snipe-it/commits?author=TonisOrmisson "Code") | [<img src="https://avatars0.githubusercontent.com/u/449411?v=4" width="110px;"/><br /><sub>Nicolai Essig</sub>](http://www.nicolai-essig.de)<br />[💻](https://github.com/snipe/snipe-it/commits?author=thakilla "Code") | [<img src="https://avatars1.githubusercontent.com/u/14809698?v=4" width="110px;"/><br /><sub>Danielle</sub>](https://github.com/techincolor)<br />[📖](https://github.com/snipe/snipe-it/commits?author=techincolor "Documentation") | [<img src="https://avatars1.githubusercontent.com/u/18545156?v=4" width="110px;"/><br /><sub>Lawrence</sub>](https://github.com/TheVakman)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=TheVakman "Tests") [🐛](https://github.com/snipe/snipe-it/issues?q=author%3ATheVakman "Bug reports") | [<img src="https://avatars1.githubusercontent.com/u/22473767?v=4" width="110px;"/><br /><sub>uknzaeinozpas</sub>](https://github.com/uknzaeinozpas)<br />[⚠️](https://github.com/snipe/snipe-it/commits?author=uknzaeinozpas "Tests") [💻](https://github.com/snipe/snipe-it/commits?author=uknzaeinozpas "Code") |
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!
@@ -0,0 +1,105 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Asset;
use App\Models\Setting;
use DB;
use Artisan;
class RegenerateAssetTags extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'snipeit:regenerate-tags {--start=} {--output= : info|warn|error|all} ';
/**
* The console command description.
*
* @var string
*/
protected $description = 'This utility will regenerate all asset tags. THIS IS DATA-DESTRUCTIVE AND SHOULD BE USED WITH CAUTION. ';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
if ($this->confirm('This will regenerate all of the asset tags within your system. This action is data-destructive and should be used with caution. Do you wish to continue?'))
{
$output['info'] = [];
$output['warn'] = [];
$output['error'] = [];
$settings = Setting::getSettings();
$start_tag = ($this->option('start')) ? $this->option('start') : (($settings->next_auto_tag_base) ? Setting::getSettings()->next_auto_tag_base : 1) ;
$this->info('Starting at '.$start_tag);
$total_assets = Asset::orderBy('id','asc')->get();
$bar = $this->output->createProgressBar(count($total_assets));
try {
Artisan::call('backup:run');
} catch (\Exception $e) {
$output['error'][] = $e;
}
foreach ($total_assets as $asset) {
$start_tag++;
$output['info'][] = 'Asset tag:'.$asset->asset_tag;
$asset->asset_tag = $settings->auto_increment_prefix.$settings->auto_increment_prefix.$start_tag;
if ($settings->zerofill_count > 0) {
$asset->asset_tag = $settings->auto_increment_prefix.Asset::zerofill($start_tag, $settings->zerofill_count);
}
$output['info'][] = 'New Asset tag:'.$asset->asset_tag;
// Use forceSave here to override model level validation
$asset->forceSave();
}
$bar->finish();
$this->info("\n");
if (($this->option('output')=='all') || ($this->option('output')=='info')) {
foreach ($output['info'] as $key => $output_text) {
$this->info($output_text);
}
}
if (($this->option('output')=='all') || ($this->option('output')=='warn')) {
foreach ($output['warn'] as $key => $output_text) {
$this->warn($output_text);
}
}
if (($this->option('output')=='all') || ($this->option('output')=='error')) {
foreach ($output['error'] as $key => $output_text) {
$this->error($output_text);
}
}
}
}
}
+136
View File
@@ -0,0 +1,136 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class Version extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'version:update {--branch=master} {--type=patch}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$use_branch = $this->option('branch');
$use_type = $this->option('type');
$git_branch = trim(shell_exec('git rev-parse --abbrev-ref HEAD'));
$build_version = trim(shell_exec('git rev-list --count '.$use_branch));
$versionFile = 'config/version.php';
$full_hash_version = str_replace("\n", '', shell_exec('git describe master --tags'));
$version = explode('-', $full_hash_version);
$app_version = $current_app_version = $version[0];
$hash_version = $version[2];
$prerelease_version = '';
$this->line('Branch is: '.$use_branch);
$this->line('Type is: '.$use_type);
$this->line('Current version is: '.$full_hash_version);
if (count($version)==3) {
$this->line('This does not look like an alpha/beta release.');
} else {
print_r($version);
if (array_key_exists('3',$version)) {
$this->line('The current version looks like a beta release.');
$prerelease_version = $version[1];
$hash_version = $version[3];
}
}
$app_version_raw = explode('.', $app_version);
$maj = str_replace('v', '', $app_version_raw[0]);
$min = $app_version_raw[1];
$patch = '';
// This is a major release that might not have a third .0
if (array_key_exists(2, $app_version_raw)) {
$patch = $app_version_raw[2];
}
if ($use_type=='major') {
$app_version = "v".($maj + 1).".$min.$patch";
} elseif ($use_type=='minor') {
$app_version = "v"."$maj.".($min + 1).".$patch";
} elseif ($use_type=='pre') {
$pre_raw = str_replace('beta','', $prerelease_version);
$pre_raw = str_replace('alpha','', $pre_raw);
$pre_raw = str_ireplace('rc','', $pre_raw);
$pre_raw = $pre_raw++;
$this->line('Setting the pre-release to '. $prerelease_version.'-'.$pre_raw);
$app_version = "v"."$maj.".($min + 1).".$patch";
} elseif ($use_type=='patch') {
$app_version = "v" . "$maj.$min." . ($patch + 1);
// If nothing is passed, leave the version as it is, just increment the build
} else {
$app_version = "v" . "$maj.$min." . $patch;
}
// Determine if this tag already exists, or if this prior to a release
$this->line('Running: git rev-parse master '.$current_app_version);
// $pre_release = trim(shell_exec('git rev-parse '.$use_branch.' '.$current_app_version.' 2>&1 1> /dev/null'));
if ($use_branch=='develop') {
$app_version = $app_version.'-pre';
}
$full_app_version = $app_version.' - build '.$build_version.'-'.$hash_version;
$array = var_export(
array(
'app_version' => $app_version,
'full_app_version' => $full_app_version,
'build_version' => $build_version,
'prerelease_version' => $prerelease_version,
'hash_version' => $hash_version,
'full_hash' => $full_hash_version,
'branch' => $git_branch),
true
);
// Construct our file content
$content = <<<CON
<?php
return $array;
CON;
// And finally write the file and output the current version
\File::put($versionFile, $content);
$this->info('Setting NEW version: '. $full_app_version.' ('.$git_branch.')');
}
}
-91
View File
@@ -1,91 +0,0 @@
<?php
namespace App\Console\Commands;
use Symfony\Component\Console\Input\InputArgument;
use Illuminate\Console\Command;
class Versioning extends Command
{
/**
* The console command name.
*
* @var string
*/
protected $name = 'versioning:update';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Generate and update app\'s version via git.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return void
*/
public function fire()
{
$versionFile = 'config/version.php';
$hash_version = str_replace("\n", '', shell_exec('git describe --tags'));
$version = explode('-', $hash_version);
$array = var_export(
array(
'app_version' => $version[0],
'build_version' => $version[1],
'hash_version' => $version[2],
'full_hash' => $hash_version),
true
);
// Construct our file content
$content = <<<CON
<?php
return $array;
CON;
// And finally write the file and output the current version
\File::put($versionFile, $content);
$this->line('Setting version: '. config('version.app_version').' build '.config('version.build_version').' ('.config('version.hash_version').')');
}
/**
* Get the console command arguments.
*
* @return array
*/
protected function getArguments()
{
return array(
);
}
/**
* Get the console command options.
*
* @return array
*/
protected function getOptions()
{
return array(
);
}
}
+2 -1
View File
@@ -19,7 +19,7 @@ class Kernel extends ConsoleKernel
Commands\SendInventoryAlerts::class,
Commands\SendExpectedCheckinAlerts::class,
Commands\ObjectImportCommand::class,
Commands\Versioning::class,
Commands\Version::class,
Commands\SystemBackup::class,
Commands\DisableLDAP::class,
Commands\Purge::class,
@@ -28,6 +28,7 @@ class Kernel extends ConsoleKernel
Commands\RecryptFromMcrypt::class,
Commands\ResetDemoSettings::class,
Commands\SyncAssetLocations::class,
Commands\RegenerateAssetTags::class,
];
/**
+7 -1
View File
@@ -127,7 +127,13 @@ class Helper
$floatString = str_replace(",", "", $floatString);
$floatString = str_replace($LocaleInfo["decimal_point"], ".", $floatString);
// Strip Currency symbol
$floatString = str_replace($LocaleInfo['currency_symbol'], '', $floatString);
// If no currency symbol is set, default to $ because Murica
$currencySymbol = $LocaleInfo['currency_symbol'];
if (empty($currencySymbol)) {
$currencySymbol = '$';
}
$floatString = str_replace($currencySymbol, '', $floatString);
return floatval($floatString);
}
+46 -28
View File
@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Requests\AssetRequest;
use App\Http\Requests\AssetCheckoutRequest;
use App\Http\Transformers\AssetsTransformer;
use App\Models\Asset;
use App\Models\AssetModel;
@@ -281,27 +282,34 @@ class AssetsController extends Controller
'assets.name',
'assets.asset_tag',
'assets.model_id',
'assets.assigned_to',
'assets.assigned_type',
'assets.status_id'
])->with('model', 'assetstatus')->NotArchived());
])->with('model', 'assetstatus', 'assignedTo')->NotArchived());
if ($request->has('search')) {
$assets = $assets->where('assets.name', 'LIKE', '%'.$request->get('search').'%')
->orWhere('assets.asset_tag', 'LIKE', '%'.$request->get('search').'%')
->join('models AS assets_models',function ($join) use ($request) {
$join->on('assets_models.id', "=", "assets.model_id");
})->orWhere('assets_models.name','LIKE','%'.$request->get('search').'%');
$assets = $assets->AssignedSearch($request->input('search'));
}
$assets = $assets->paginate(50);
// Loop through and set some custom properties for the transformer to use.
// This lets us have more flexibility in special cases like assets, where
// they may not have a ->name value but we want to display something anyway
foreach ($assets as $asset) {
$asset->use_text = $asset->present()->fullName;
if (($asset->checkedOutToUser()) && ($asset->assigned)) {
$asset->use_text .= ' → '.$asset->assigned->getFullNameAttribute();
}
if ($asset->assetstatus->getStatuslabelType()=='pending') {
$asset->use_text = $asset->present()->fullName.' ('.$asset->assetstatus->getStatuslabelType().')';
$asset->use_text .= '('.$asset->assetstatus->getStatuslabelType().')';
}
$asset->use_image = ($asset->getImageUrl()) ? $asset->getImageUrl() : null;
@@ -499,7 +507,7 @@ class AssetsController extends Controller
* @since [v4.0]
* @return JsonResponse
*/
public function checkout(Request $request, $asset_id)
public function checkout(AssetCheckoutRequest $request, $asset_id)
{
$this->authorize('checkout', Asset::class);
$asset = Asset::findOrFail($asset_id);
@@ -515,27 +523,37 @@ class AssetsController extends Controller
'id' => $asset->id,
'asset_tag' => $asset->asset_tag,
];
if ($request->has('user_id')) {
$target = User::find($request->input('user_id'));
$location = $target->location_id;
$error_payload['target_id'] = $request->input('user_id');
$error_payload['target_type'] = User::class;
// Don't let the user check an asset out to itself
} elseif ($request->has('asset_id')) {
$target = Asset::where('id','!=',$asset_id)->find($request->input('asset_id'));
$location = $target->location_id;
$error_payload['target_id'] = $request->input('asset_id');
$error_payload['target_type'] = Asset::class;
} elseif ($request->has('location_id')) {
$target = Location::find($request->input('location_id'));
$location = $target->id;
$target = Location::find($request->input('location_id'));
$error_payload['target_id'] = $request->input('location_id');
$error_payload['target_type'] = Location::class;
// This item is checked out to a location
if (request('checkout_to_type')=='location') {
$target = Location::find(request('assigned_location'));
$asset->location_id = ($target) ? $target->id : '';
$error_payload['target_id'] = $request->input('assigned_location');
$error_payload['target_type'] = 'location';
} elseif (request('checkout_to_type')=='asset') {
$target = Asset::where('id','!=',$assetId)->find(request('assigned_asset'));
$asset->location_id = $target->rtd_location_id;
// Override with the asset's location_id if it has one
if ($target->location_id!='') {
$asset->location_id = ($target) ? $target->location_id : '';
}
$error_payload['target_id'] = $request->input('assigned_asset');
$error_payload['target_type'] = 'asset';
} elseif (request('checkout_to_type')=='user') {
// Fetch the target and set the asset's new location_id
$target = User::find(request('assigned_user'));
$asset->location_id = ($target) ? $target->location_id : '';
$error_payload['target_id'] = $request->input('assigned_user');
$error_payload['target_type'] = 'user';
}
if (!isset($target)) {
return response()->json(Helper::formatStandardApiResponse('error', $error_payload, 'No valid checkout target specified for asset '.e($asset->asset_tag).'.'));
return response()->json(Helper::formatStandardApiResponse('error', $error_payload, 'Checkout target for asset '.e($asset->asset_tag).' is invalid - '.$error_payload['target_type'].' does not exist.'));
}
@@ -550,11 +568,11 @@ class AssetsController extends Controller
$asset->location_id = $target->rtd_location_id;
}
$asset->location_id = $location;
if ($asset->checkOut($target, Auth::user(), $checkout_at, $expected_checkin, $note, $asset_name, $location)) {
if ($asset->checkOut($target, Auth::user(), $checkout_at, $expected_checkin, $note, $asset_name, $asset->location_id)) {
return response()->json(Helper::formatStandardApiResponse('success', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkout.success')));
}
@@ -21,7 +21,7 @@ class CategoriesController extends Controller
public function index(Request $request)
{
$this->authorize('view', Category::class);
$allowed_columns = ['id', 'name','category_type','use_default_eula','eula_text', 'require_acceptance','checkin_email', 'assets_count', 'accessories_count', 'consumables_count', 'components_count', 'image'];
$allowed_columns = ['id', 'name','category_type', 'category_type','use_default_eula','eula_text', 'require_acceptance','checkin_email', 'assets_count', 'accessories_count', 'consumables_count', 'components_count', 'image'];
$categories = Category::select(['id', 'created_at', 'updated_at', 'name','category_type','use_default_eula','eula_text', 'require_acceptance','checkin_email','image'])
->withCount('assets', 'accessories', 'consumables', 'components');
@@ -141,7 +141,6 @@ class CategoriesController extends Controller
*/
public function selectlist(Request $request, $category_type = 'asset')
{
$this->authorize('view', Categories::class);
$categories = Category::select([
'id',
@@ -50,11 +50,9 @@ class ReportsController extends Controller
$offset = request('offset', 0);
$limit = request('limit', 50);
$total = $actionlogs->count();
$actionlogs = $actionlogs->orderBy($sort, $order);
$actionlogs = $actionlogs->skip($offset)->take($limit)->get();
return (new ActionlogsTransformer)->transformActionlogs($actionlogs, $total);
$actionlogs = $actionlogs->orderBy($sort, $order)->skip($offset)->take($limit)->get();
return response()->json((new ActionlogsTransformer)->transformActionlogs($actionlogs, $total), 200, ['Content-Type' => 'application/json;charset=utf8'], JSON_UNESCAPED_UNICODE);
}
}
+59 -52
View File
@@ -431,8 +431,13 @@ class AssetsController extends Controller
$this->authorize('checkout', $asset);
if ($asset->availableForCheckout()) {
return view('hardware/checkout', compact('asset'));
}
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkout.not_available'));
// Get the dropdown of users and then pass it to the checkout view
return view('hardware/checkout', compact('asset'));
}
/**
@@ -453,34 +458,33 @@ class AssetsController extends Controller
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkout.not_available'));
}
$this->authorize('checkout', $asset);
$admin = Auth::user();
// Fetch the target and set the asset's new location_id
if (request('assigned_user')) {
$target = User::find(request('assigned_user'));
$asset->location_id = ($target) ? $target->location_id : '';
} elseif (request('assigned_asset')) {
// This item is checked out to a location
if (request('checkout_to_type')=='location') {
$target = Location::find(request('assigned_location'));
$asset->location_id = ($target) ? $target->id : '';
} elseif (request('checkout_to_type')=='asset') {
$target = Asset::where('id','!=',$assetId)->find(request('assigned_asset'));
$asset->location_id = $target->rtd_location_id;
// Override with the asset's location_id if it has one
if ($target->location_id!='') {
$asset->location_id = ($target) ? $target->location_id : '';
}
} elseif (request('assigned_location')) {
$target = Location::find(request('assigned_location'));
$asset->location_id = ($target) ? $target->id : '';
} elseif (request('checkout_to_type')=='user') {
// Fetch the target and set the asset's new location_id
$target = User::find(request('assigned_user'));
$asset->location_id = ($target) ? $target->location_id : '';
}
// No valid target was found - error out
if (!$target) {
return redirect()->to("hardware/$assetId/checkout")->with('error', trans('admin/hardware/message.checkout.error'))->withErrors($asset->getErrors());
return redirect()->back()->with('error', trans('admin/hardware/message.checkout.error'))->withErrors($asset->getErrors());
}
$admin = Auth::user();
if ((Input::has('checkout_at')) && (Input::get('checkout_at')!= date("Y-m-d"))) {
$checkout_at = Input::get('checkout_at');
@@ -496,7 +500,6 @@ class AssetsController extends Controller
if ($asset->checkOut($target, $admin, $checkout_at, $expected_checkin, e(Input::get('note')), Input::get('name'))) {
// Redirect to the new asset page
return redirect()->route("hardware.index")->with('success', trans('admin/hardware/message.checkout.success'));
}
@@ -1078,70 +1081,73 @@ class AssetsController extends Controller
* @internal param array $assets
* @since [v2.0]
*/
public function postBulkSave()
public function postBulkSave(Request $request)
{
$this->authorize('update', Asset::class);
if (Input::has('ids')) {
$assets = Input::get('ids');
if ((Input::has('purchase_date'))
|| (Input::has('purchase_cost'))
|| (Input::has('supplier_id'))
|| (Input::has('order_number'))
|| (Input::has('warranty_months'))
|| (Input::has('rtd_location_id'))
|| (Input::has('requestable'))
|| (Input::has('company_id'))
|| (Input::has('status_id'))
|| (Input::has('model_id'))
\Log::debug($request->input('ids'));
if (($request->has('ids')) && (count($request->input('ids') > 0))) {
$assets = $request->input('ids');
if (($request->has('purchase_date'))
|| ($request->has('purchase_cost'))
|| ($request->has('supplier_id'))
|| ($request->has('order_number'))
|| ($request->has('warranty_months'))
|| ($request->has('rtd_location_id'))
|| ($request->has('requestable'))
|| ($request->has('company_id'))
|| ($request->has('status_id'))
|| ($request->has('model_id'))
) {
foreach ($assets as $key => $value) {
$update_array = array();
if (Input::has('purchase_date')) {
$update_array['purchase_date'] = e(Input::get('purchase_date'));
if ($request->has('purchase_date')) {
$update_array['purchase_date'] = $request->input('purchase_date');
}
if (Input::has('purchase_cost')) {
$update_array['purchase_cost'] = Helper::ParseFloat(e(Input::get('purchase_cost')));
if ($request->has('purchase_cost')) {
$update_array['purchase_cost'] = Helper::ParseFloat($request->input('purchase_cost'));
}
if (Input::has('supplier_id')) {
$update_array['supplier_id'] = e(Input::get('supplier_id'));
if ($request->has('supplier_id')) {
$update_array['supplier_id'] = $request->input('supplier_id');
}
if (Input::has('model_id')) {
$update_array['model_id'] = e(Input::get('model_id'));
if ($request->has('model_id')) {
$update_array['model_id'] = $request->input('model_id');
}
if (Input::has('company_id')) {
if (Input::get('company_id')=="clear") {
if ($request->has('company_id')) {
if ($request->input('company_id')=="clear") {
$update_array['company_id'] = null;
} else {
$update_array['company_id'] = e(Input::get('company_id'));
$update_array['company_id'] = $request->input('company_id');
}
}
if (Input::has('order_number')) {
$update_array['order_number'] = e(Input::get('order_number'));
if ($request->has('order_number')) {
$update_array['order_number'] = $request->input('order_number');
}
if (Input::has('warranty_months')) {
$update_array['warranty_months'] = e(Input::get('warranty_months'));
if ($request->has('warranty_months')) {
$update_array['warranty_months'] = $request->input('warranty_months');
}
if (Input::has('rtd_location_id')) {
$update_array['rtd_location_id'] = e(Input::get('rtd_location_id'));
if ($request->has('rtd_location_id')) {
$update_array['rtd_location_id'] = $request->input('rtd_location_id');
}
if (Input::has('status_id')) {
$update_array['status_id'] = e(Input::get('status_id'));
if ($request->has('status_id')) {
$update_array['status_id'] = $request->input('status_id');
}
if (Input::has('requestable')) {
$update_array['requestable'] = e(Input::get('requestable'));
if ($request->has('requestable')) {
$update_array['requestable'] = $request->input('requestable');
}
DB::table('assets')
->where('id', $key)
->update($update_array);
} // endforeach
return redirect()->to("hardware")->with('success', trans('admin/hardware/message.update.success'));
return redirect()->route("hardware.index")->with('success', trans('admin/hardware/message.update.success'));
// no values given, nothing to update
}
return redirect()->to("hardware")->with('info', trans('admin/hardware/message.update.nothing_updated'));
return redirect()->route("hardware.index")->with('warning', trans('admin/hardware/message.update.nothing_updated'));
} // endif
return redirect()->to("hardware");
return redirect()->route("hardware.index")->with('warning', trans('No assets selected, so nothing was updated.'));
}
/**
@@ -1242,8 +1248,9 @@ class AssetsController extends Controller
public function audit($id)
{
$settings = Setting::getSettings();
$this->authorize('audit', Asset::class);
$dt = Carbon::now()->addMonths(12)->toDateString();
$dt = Carbon::now()->addMonths($settings->audit_interval)->toDateString();
$asset = Asset::findOrFail($id);
return view('hardware/audit')->with('asset', $asset)->with('next_audit_date', $dt)->with('locations_list');
}
+27 -39
View File
@@ -275,12 +275,18 @@ class LicensesController extends Controller
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 (!$licenseSeat = LicenseSeat::where('id', '=', $next->id)->first()) {
return redirect()->route('licenses.index')->with('error', 'There are no available seats for this license');
}
$licenseSeat = LicenseSeat::where('license_id',$license->id)->find($next)->first();
$assigned_to = $request->input('assigned_to');
$asset_id = $request->input('asset_id');
$this->authorize('checkout', $licenseSeat);
@@ -299,52 +305,34 @@ class LicensesController extends Controller
return redirect()->back()->withInput()->withErrors($validator);
}
$target = null;
if ($assigned_to!='') {
// Check if the user exists
if (is_null($target = User::find($assigned_to))) {
// Redirect to the asset management page with error
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.user_does_not_exist'));
}
}
if ($asset_id!='') {
if (is_null($target = Asset::find($asset_id))) {
// Redirect to the asset management page with error
// This item is checked out to a an asset
if (request('checkout_to_type')=='asset') {
if (is_null($target = Asset::find(request('asset_id')))) {
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.asset_does_not_exist'));
}
if (($request->has('assigned_to')) && ($request->has('asset_id'))) {
return redirect()->back()->withInput()->with('error', trans('admin/licenses/message.select_asset_or_person'));
}
}
// Check if the asset exists
if (is_null($licenseSeat)) {
// Redirect to the asset management page with error
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found'));
}
if ($request->input('asset_id') == '') {
$licenseSeat->asset_id = null;
} else {
$licenseSeat->asset_id = $request->input('asset_id');
}
// Update the asset data
if ($request->input('assigned_to') == '') {
$licenseSeat->assigned_to = null;
// Override asset's assigned user if available
if ($target->assigned_to!='') {
$licenseSeat->assigned_to = $target->assigned_to;
}
} else {
$licenseSeat->assigned_to = $request->input('assigned_to');
// Fetch the target and set the license user
if (is_null($target = User::find(request('assigned_to')))) {
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.user_does_not_exist'));
}
$licenseSeat->assigned_to = request('assigned_to');
}
// Was the asset updated?
$licenseSeat->user_id = Auth::user()->id;
if ($licenseSeat->save()) {
$licenseSeat->logCheckout($request->input('note'), $target);
$data['license_id'] = $licenseSeat->license_id;
$data['note'] = $request->input('note');
// Redirect to the new asset page
return redirect()->route("licenses.index")->with('success', trans('admin/licenses/message.checkout.success'));
}
+6 -2
View File
@@ -156,6 +156,7 @@ class ReportsController extends Controller
trans('admin/hardware/form.order'),
trans('general.supplier'),
trans('admin/hardware/table.checkoutto'),
trans('general.type'),
trans('admin/hardware/table.checkout_date'),
trans('admin/hardware/table.location'),
trans('general.notes'),
@@ -166,6 +167,8 @@ class ReportsController extends Controller
fputcsv($handle, $headers);
foreach ($assets as $asset) {
// Add a new row with data
$values=[
($asset->company) ? $asset->company->name : '',
@@ -175,12 +178,13 @@ class ReportsController extends Controller
($asset->model->model_number) ? $asset->model->model_number : '',
($asset->name) ? $asset->name : '',
($asset->serial) ? $asset->serial : '',
($asset->assetstatus) ? e($asset->assetstatus->name) : '',
($asset->assetstatus) ? e($asset->present()->statusText) : '',
($asset->purchase_date) ? e($asset->purchase_date) : '',
($asset->purchase_cost > 0) ? Helper::formatCurrencyOutput($asset->purchase_cost) : '',
($asset->order_number) ? e($asset->order_number) : '',
($asset->supplier) ? e($asset->supplier->name) : '',
($asset->assignedTo) ? e($asset->assignedTo->present()->name()) : '',
($asset->checkedOutToUser() && $asset->assigned) ? e($asset->assigned->getFullNameAttribute()) : ($asset->assigned ? e($asset->assigned->display_name) : ''),
($asset->checkedOutToUser() && $asset->assigned) ? 'user' : e($asset->assignedType()),
($asset->last_checkout!='') ? e($asset->last_checkout) : '',
($asset->location) ? e($asset->location->name) : '',
($asset->notes) ? e($asset->notes) : '',
+4 -3
View File
@@ -24,9 +24,10 @@ class AssetCheckoutRequest extends Request
public function rules()
{
$rules = [
"assigned_user" => 'required_without_all:assigned_asset,assigned_location',
"assigned_asset" => 'required_without_all:assigned_user,assigned_location|different:'.$this->id,
"assigned_location" => 'required_without_all:assigned_user,assigned_asset',
"assigned_user" => 'required_without_all:assigned_asset,assigned_location',
"assigned_asset" => 'required_without_all:assigned_user,assigned_location|different:'.$this->id,
"assigned_location" => 'required_without_all:assigned_user,assigned_asset',
"checkout_to_type" => 'required|in:asset,location,user'
];
+17 -7
View File
@@ -86,24 +86,21 @@ class AssetsTransformer
$decrypted = \App\Helpers\Helper::gracefulDecrypt($field,$asset->{$field->convertUnicodeDbSlug()});
$value = (Gate::allows('superadmin')) ? $decrypted : strtoupper(trans('admin/custom_fields/general.encrypted'));
// $fields_array = [$field->convertUnicodeDbSlug() => $value];
$fields_array[$field->name] = [
'field' => $field->convertUnicodeDbSlug(),
'value' => $value
'value' => $value,
'field_format' => $field->format,
];
} else {
$fields_array[$field->name] = [
'field' => $field->convertUnicodeDbSlug(),
'value' => $asset->{$field->convertUnicodeDbSlug()}
'value' => $asset->{$field->convertUnicodeDbSlug()},
'field_format' => $field->format,
];
//$fields_array = [$field->convertUnicodeDbSlug() => $asset->{$field->convertUnicodeDbSlug()}];
}
//array += $fields_array;
$array['custom_fields'] = $fields_array;
}
} else {
@@ -114,10 +111,23 @@ class AssetsTransformer
'checkout' => (bool) Gate::allows('checkout', Asset::class),
'checkin' => (bool) Gate::allows('checkin', Asset::class),
'clone' => Gate::allows('create', Asset::class) ? true : false,
'restore' => false,
'update' => (bool) Gate::allows('update', Asset::class),
'delete' => (bool) Gate::allows('delete', Asset::class),
];
if ($asset->deleted_at!='') {
$permissions_array['available_actions'] = [
'checkout' => true,
'checkin' => false,
'clone' => Gate::allows('create', Asset::class) ? true : false,
'restore' => Gate::allows('create', Asset::class) ? true : false,
'update' => false,
'delete' => false,
];
}
$array += $permissions_array;
return $array;
}
@@ -26,7 +26,7 @@ class CategoriesTransformer
'id' => (int) $category->id,
'name' => e($category->name),
'image' => ($category->image) ? app('categories_upload_url').e($category->image) : null,
'type' => e($category->category_type),
'category_type' => e($category->category_type),
'eula' => ($category->getEula()) ? true : false,
'checkin_email' => ($category->checkin_email =='1') ? true : false,
'require_acceptance' => ($category->require_acceptance =='1') ? true : false,
+7 -2
View File
@@ -31,7 +31,9 @@ class AssetImporter extends ItemImporter
$this->item['custom_fields'][$customField->db_column_name()] = $customFieldValue;
$this->log('Custom Field '. $customField->name.': '.$customFieldValue);
} else {
$this->item['custom_fields'][$customField->db_column_name()] = '';
// This removes custom fields when updating if the column doesn't exist in file.
// Commented out becausee not sure if it's needed anywhere.
// $this->item['custom_fields'][$customField->db_column_name()] = '';
}
}
}
@@ -77,17 +79,20 @@ class AssetImporter extends ItemImporter
}
$this->item['asset_tag'] = $asset_tag;
// By default we're set this to location_id in the item.
$item = $this->sanitizeItemForStoring($asset, $editingAsset);
// By default we're set this to location_id in the item.
if (isset($this->item["location_id"])) {
$item['rtd_location_id'] = $this->item['location_id'];
unset($item['location_id']);
}
if ($editingAsset) {
$asset->update($item);
} else {
$asset->fill($item);
}
// If we're updating, we don't want to overwrite old fields.
if (array_key_exists('custom_fields', $this->item)) {
foreach ($this->item['custom_fields'] as $custom_field => $val) {
$asset->{$custom_field} = $val;
+1
View File
@@ -40,6 +40,7 @@ class ConsumableImporter extends ItemImporter
$this->log("No matching consumable, creating one");
$consumable = new Consumable();
$consumable->fill($this->sanitizeItemForStoring($consumable));
if ($consumable->save()) {
$consumable->logCreate('Imported using CSV Importer');
$this->log("Consumable " . $this->item["name"] . ' was created');
+2 -1
View File
@@ -63,7 +63,7 @@ class ItemImporter extends Importer
$this->item["qty"] = $this->findCsvMatch($row, "quantity");
$this->item["requestable"] = $this->findCsvMatch($row, "requestable");
$this->item["user_id"] = $this->user_id;
$this->item['serial'] = $this->findCsvMatch($row, "serial_number");
$this->item['serial'] = $this->findCsvMatch($row, "serial");
// NO need to call this method if we're running the user import.
// TODO: Merge these methods.
if(get_class($this) !== UserImporter::class) {
@@ -92,6 +92,7 @@ class ItemImporter extends Importer
$item = collect($this->item);
// First Filter the item down to the model's fillable fields
$item = $item->only($model->getFillable());
// Then iterate through the item and, if we are updating, remove any blank values.
if ($updating) {
$item = $item->reject(function ($value) {
+67 -11
View File
@@ -765,11 +765,11 @@ class Asset extends Depreciable
{
$search = explode(' OR ', $search);
return $query->leftJoin('users',function ($leftJoin) {
$leftJoin->on("users.id", "=", "assets.assigned_to")
return $query->leftJoin('users as assets_users',function ($leftJoin) {
$leftJoin->on("assets_users.id", "=", "assets.assigned_to")
->where("assets.assigned_type", "=", User::class);
})->leftJoin('locations',function ($leftJoin) {
$leftJoin->on("locations.id","=","assets.assigned_to")
})->leftJoin('locations as assets_locations',function ($leftJoin) {
$leftJoin->on("assets_locations.id","=","assets.assigned_to")
->where("assets.assigned_type","=",Location::class);
})->leftJoin('assets as assigned_assets',function ($leftJoin) {
$leftJoin->on('assigned_assets.id', '=', 'assets.assigned_to')
@@ -808,10 +808,10 @@ class Asset extends Depreciable
$query->where('locations.name', 'LIKE', '%'.$search.'%');
});
})->orWhere(function ($query) use ($search) {
$query->where('users.first_name', 'LIKE', '%'.$search.'%')
->orWhere('users.last_name', 'LIKE', '%'.$search.'%')
->orWhere('users.username', 'LIKE', '%'.$search.'%')
->orWhere('locations.name', 'LIKE', '%'.$search.'%')
$query->where('assets_users.first_name', 'LIKE', '%'.$search.'%')
->orWhere('assets_users.last_name', 'LIKE', '%'.$search.'%')
->orWhere('assets_users.username', 'LIKE', '%'.$search.'%')
->orWhere('assets_locations.name', 'LIKE', '%'.$search.'%')
->orWhere('assigned_assets.name', 'LIKE', '%'.$search.'%');
})->orWhere('assets.name', 'LIKE', '%'.$search.'%')
->orWhere('assets.asset_tag', 'LIKE', '%'.$search.'%')
@@ -826,6 +826,62 @@ class Asset extends Depreciable
}
/**
* Query builder scope to search on text for complex Bootstrap Tables API.
*
* @param \Illuminate\Database\Query\Builder $query Query builder instance
* @param text $search Search term
*
* @return \Illuminate\Database\Query\Builder Modified query builder
*/
public function scopeAssignedSearch($query, $search)
{
$search = explode(' OR ', $search);
return $query->leftJoin('users as assets_users',function ($leftJoin) {
$leftJoin->on("assets_users.id", "=", "assets.assigned_to")
->where("assets.assigned_type", "=", User::class);
})->leftJoin('locations as assets_locations',function ($leftJoin) {
$leftJoin->on("assets_locations.id","=","assets.assigned_to")
->where("assets.assigned_type","=",Location::class);
})->leftJoin('assets as assigned_assets',function ($leftJoin) {
$leftJoin->on('assigned_assets.id', '=', 'assets.assigned_to')
->where('assets.assigned_type', '=', Asset::class);
})->where(function ($query) use ($search) {
foreach ($search as $search) {
$query->whereHas('model', function ($query) use ($search) {
$query->whereHas('category', function ($query) use ($search) {
$query->where(function ($query) use ($search) {
$query->where('categories.name', 'LIKE', '%'.$search.'%')
->orWhere('models.name', 'LIKE', '%'.$search.'%')
->orWhere('models.model_number', 'LIKE', '%'.$search.'%');
});
});
})->orWhereHas('model', function ($query) use ($search) {
$query->whereHas('manufacturer', function ($query) use ($search) {
$query->where(function ($query) use ($search) {
$query->where('manufacturers.name', 'LIKE', '%'.$search.'%');
});
});
})->orWhere(function ($query) use ($search) {
$query->where('assets_users.first_name', 'LIKE', '%'.$search.'%')
->orWhere('assets_users.last_name', 'LIKE', '%'.$search.'%')
->orWhere('assets_users.username', 'LIKE', '%'.$search.'%')
->orWhere('assets_locations.name', 'LIKE', '%'.$search.'%')
->orWhere('assigned_assets.name', 'LIKE', '%'.$search.'%');
})->orWhere('assets.name', 'LIKE', '%'.$search.'%')
->orWhere('assets.asset_tag', 'LIKE', '%'.$search.'%')
->orWhere('assets.serial', 'LIKE', '%'.$search.'%')
->orWhere('assets.order_number', 'LIKE', '%'.$search.'%')
->orWhere('assets.notes', 'LIKE', '%'.$search.'%');
}
foreach (CustomField::all() as $field) {
$query->orWhere('assets.'.$field->db_column_name(), 'LIKE', "%$search%");
}
})->withTrashed()->whereNull("assets.deleted_at"); //workaround for laravel bug
}
/**
* Query builder scope to search on text filters for complex Bootstrap Tables API
@@ -963,7 +1019,7 @@ class Asset extends Depreciable
*/
public function scopeOrderModels($query, $order)
{
return $query->join('models as asset_models', 'assets.model_id', '=', 'models.id')->orderBy('models.name', $order);
return $query->join('models as asset_models', 'assets.model_id', '=', 'asset_models.id')->orderBy('asset_models.name', $order);
}
/**
@@ -1091,7 +1147,7 @@ class Asset extends Depreciable
*/
public function scopeOrderLocation($query, $order)
{
return $query->leftJoin('locations as asset_locations', 'asset_locations.id', '=', 'assets.rtd_location_id')->orderBy('asset_locations.name', $order);
return $query->leftJoin('locations as asset_locations', 'asset_locations.id', '=', 'assets.location_id')->orderBy('asset_locations.name', $order);
}
@@ -1119,7 +1175,7 @@ class Asset extends Depreciable
public function scopeByLocationId($query, $search)
{
return $query->where(function ($query) use ($search) {
$query->whereHas('defaultLoc', function ($query) use ($search) {
$query->whereHas('location', function ($query) use ($search) {
$query->where('locations.id', '=', $search);
});
});
+65 -7
View File
@@ -16,12 +16,17 @@ class CustomField extends Model
public static $PredefinedFormats=[
"ANY" => "",
"ALPHA" => "alpha",
"ALPHA-DASH" => "alpha_dash",
"NUMERIC" => "numeric",
"ALPHA-NUMERIC" => "alpha_num",
"EMAIL" => "email",
"DATE" => "date",
"URL" => "url",
"NUMERIC" => "numeric",
"MAC" => "regex:/^[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}$/",
"IP" => "ip",
"IPV4" => "ipv4",
"IPV6" => "ipv6",
"MAC" => "regex:/^[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}$/",
"BOOLEAN" => "boolean",
];
public $rules = [
@@ -30,27 +35,54 @@ class CustomField extends Model
// This is confusing, since it's actually the custom fields table that
// we're usually modifying, but since we alter the assets table, we have to
// say that here
// say that here, otherwise the new fields get added onto the custom fields
// table instead of the assets table.
public static $table_name = "assets";
/**
* Convert the custom field's name property to a db-safe string.
*
* We could probably have used str_slug() here but not sure what it would
* do with previously existing values. - @snipe
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.4]
* @return String
*/
public static function name_to_db_name($name)
{
return "_snipeit_" . preg_replace("/[^a-zA-Z0-9]/", "_", strtolower($name));
}
/**
* Set some boot methods for creating and updating.
*
* There is never ever a time when we wouldn't want to be updating those asset
* column names and the values of the db column name in the custom fields table
* if they have changed, so we handle that here so that we don't have to remember
* to do it in the controllers.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.4]
* @return Boolean
*/
public static function boot()
{
self::created(function ($custom_field) {
// column exists - nothing to do here
// Column already exists on the assets table - nothing to do here.
// This *shouldn't* happen in the wild.
if (Schema::hasColumn(CustomField::$table_name, $custom_field->convertUnicodeDbSlug())) {
return false;
}
// Update the column name in the assets table
Schema::table(CustomField::$table_name, function ($table) use ($custom_field) {
$table->text($custom_field->convertUnicodeDbSlug())->nullable();
});
// Update the db_column property in the custom fields table
$custom_field->db_column = $custom_field->convertUnicodeDbSlug();
$custom_field->save();
});
@@ -58,8 +90,9 @@ class CustomField extends Model
self::updating(function ($custom_field) {
// Column already exists. Nothing to update.
// Column already exists on the assets table - nothing to do here.
if ($custom_field->isDirty("name")) {
if (Schema::hasColumn(CustomField::$table_name, $custom_field->convertUnicodeDbSlug())) {
return true;
}
@@ -113,11 +146,21 @@ class CustomField extends Model
return $this->db_column;
}
// mutators for 'format' attribute
/**
* Mutator for the 'format' attribute.
*
* This is used by the dropdown to store the laravel-specific
* validator strings in the database but still return the
* user-friendly text in the dropdowns, and in the custom fields display.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.4]
* @return Array
*/
public function getFormatAttribute($value)
{
foreach (self::$PredefinedFormats as $name => $pattern) {
if ($pattern===$value) {
if ($pattern === $value) {
return $name;
}
}
@@ -168,6 +211,13 @@ class CustomField extends Model
return $result;
}
/**
* Check whether the field is encrypted
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.4]
* @return Boolean
*/
public function isFieldDecryptable($string)
{
if (($this->field_encrypted=='1') && ($string!='')) {
@@ -177,6 +227,14 @@ class CustomField extends Model
}
/**
* Convert non-UTF-8 or weirdly encoded text into something that
* won't break the database.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.4]
* @return Boolean
*/
public function convertUnicodeDbSlug($original = null)
{
$name = $original ? $original : $this->name;
+6 -3
View File
@@ -347,10 +347,13 @@ class License extends Depreciable
*/
public function freeSeat()
{
return $this->licenseseats()
return $this->licenseseats()
->whereNull('deleted_at')
->whereNull('assigned_to')
->whereNull('asset_id')
->where(function ($query) {
$query->whereNull('assigned_to')
->whereNull('asset_id');
})
->orderBy('id', 'asc')
->first();
}
+12
View File
@@ -89,6 +89,18 @@ class Setting extends Model
}
/**
* Escapes the custom CSS, and then un-escapes the greater-than symbol
* so it can work with direct descendant characters for bootstrap
* menu overrides like:
*
* .skin-blue .sidebar-menu>li.active>a, .skin-blue .sidebar-menu>li:hover>a
*
* Important: Do not remove the e() escaping here, as we output raw in the blade.
*
* @return string escaped CSS
* @author A. Gianotto <snipe@snipe.net>
*/
public function show_custom_css()
{
$custom_css = Setting::getSettings()->custom_css;
+1
View File
@@ -24,6 +24,7 @@ class SnipeModel extends Model
public function setPurchaseCostAttribute($value)
{
$value = Helper::ParseFloat($value);
if ($value == '0.0') {
$value = null;
}
-2
View File
@@ -289,10 +289,8 @@ class AssetPresenter extends Presenter
$imagePath = '';
if ($this->image && !empty($this->image)) {
$imagePath = $this->image;
return 'poop';
} elseif ($this->model && !empty($this->model->image)) {
$imagePath = $this->model->image;
return 'fart';
}
if (!empty($imagePath)) {
return config('app.url').'/uploads/assets/'.$imagePath;
+1 -1
View File
@@ -40,7 +40,7 @@ class CategoryPresenter extends Presenter
"visible" => true,
"formatter" => 'imageFormatter',
],[
"field" => "type",
"field" => "category_type",
"searchable" => true,
"sortable" => true,
"title" => trans('general.type'),
+1 -1
View File
@@ -40,7 +40,7 @@ class LocationPresenter extends Presenter
public function glyph()
{
return '<i class="fa fa-globe"></i>';
return '<i class="fa fa-map-marker"></i>';
}
public function fullName() {
+1 -1
View File
@@ -352,6 +352,6 @@ class UserPresenter extends Presenter
public function glyph()
{
return '<i class="fa fa-users"></i>';
return '<i class="fa fa-user"></i>';
}
}
+7 -4
View File
@@ -1,7 +1,10 @@
<?php
return array (
'app_version' => 'v4.1.4',
'build_version' => '173',
'hash_version' => 'gba38b84',
'full_hash' => 'v4.1.4-173-gba38b84',
'app_version' => 'v4.1.6',
'full_app_version' => 'v4.1.6 - build 2963-g83c8449',
'build_version' => '2963',
'prerelease_version' => '',
'hash_version' => 'g83c8449',
'full_hash' => 'v4.1.5-76-gb934d2e',
'branch' => 'master',
);
+3
View File
@@ -1,6 +1,7 @@
<?php
use Illuminate\Database\Seeder;
use App\Models\CustomField;
use App\Models\CustomFieldset;
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
@@ -21,6 +22,8 @@ class CustomFieldSeeder extends Seeder
}
}
CustomField::truncate();
CustomFieldset::truncate();
DB::table('custom_field_custom_fieldset')->truncate();
factory(CustomField::class, 4)->create();
}
+4
View File
@@ -33,6 +33,10 @@ class DatabaseSeeder extends Seeder
$this->call(ActionlogSeeder::class);
$this->call(CustomFieldSeeder::class);
Artisan::call('snipeit:sync-asset-locations', ['--output' => 'all']);
$output = Artisan::output();
\Log::info($output);
Model::reguard();
}
}
+2
View File
@@ -32,6 +32,8 @@ MAIL_PASSWORD=${MAIL_ENV_PASSWORD}
MAIL_ENCRYPTION=${MAIL_ENV_ENCRYPTION}
MAIL_FROM_ADDR=${MAIL_ENV_FROM_ADDR}
MAIL_FROM_NAME=${MAIL_ENV_FROM_NAME}
MAIL_REPLYTO_ADDR=${MAIL_ENV_FROM_ADDR}
MAIL_REPLYTO_NAME=${MAIL_ENV_FROM_NAME}
# --------------------------------------------
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -8,7 +8,7 @@
"/css/app.css.map": "/css/app.css.map?id=bdbe05e6ecd70ccfac72",
"/css/overrides.css.map": "/css/overrides.css.map?id=898c91d4a425b01b589b",
"/css/dist/all.css": "/css/dist/all.css?id=7c3842d2639193ac7e88",
"/js/dist/all.js": "/js/dist/all.js?id=0d558c3ed637f4c81a77",
"/js/dist/all.js": "/js/dist/all.js?id=7b52ead3a55086ea1f8d",
"/css/build/all.css": "/css/build/all.css?id=7c3842d2639193ac7e88",
"/js/build/all.js": "/js/build/all.js?id=0d558c3ed637f4c81a77"
"/js/build/all.js": "/js/build/all.js?id=7b52ead3a55086ea1f8d"
}
+32
View File
@@ -255,8 +255,40 @@ $(document).ready(function () {
return datalist.text;
}
// This handles the radio button selectors for the checkout-to-foo options
// on asset checkout and also on asset edit
$(function() {
$('input[name=checkout_to_type]').on("change",function () {
var assignto_type = $('input[name=checkout_to_type]:checked').val();
var userid = $('#assigned_user option:selected').val();
if (assignto_type == 'asset') {
$('#current_assets_box').fadeOut();
$('#assigned_asset').show();
$('#assigned_user').hide();
$('#assigned_location').hide();
$('.notification-callout').fadeOut();
} else if (assignto_type == 'location') {
$('#current_assets_box').fadeOut();
$('#assigned_asset').hide();
$('#assigned_user').hide();
$('#assigned_location').show();
$('.notification-callout').fadeOut();
} else {
$('#assigned_asset').hide();
$('#assigned_user').show();
$('#assigned_location').hide();
if (userid) {
$('#current_assets_box').fadeIn();
}
$('.notification-callout').fadeIn();
}
});
});
});
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'element',
'field_format' => 'formaat',
'field_custom_format' => 'Gepasmaakte formaat',
'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>.',
'required' => 'vereis',
'req' => 'Req.',
'used_by_models' => 'Gebruik deur modelle',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'Die gekose: attribuut is ongeldig.',
'numeric' => 'Die: Attribuut moet \'n nommer wees.',
'present' => 'Die: attribuut veld moet teenwoordig wees.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Die: Attribuutformaat is ongeldig.',
'required' => 'Die: attribuut veld is nodig.',
'required_if' => 'Die: attribuut veld is nodig wanneer: ander is: waarde.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'عنصر',
'field_format' => 'صيغة',
'field_custom_format' => 'صيغة مخصصة',
'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>.',
'required' => 'مطلوب',
'req' => 'مطلوب',
'used_by_models' => 'مستخدم في الموديلات',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'السمة المحددة: غير صالحة.',
'numeric' => 'يجب أن تكون السمة رقم.',
'present' => 'يجب أن يكون حقل السمة موجود.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'تنسيق السمة: غير صالح.',
'required' => 'حقل السمة: مطلوب.',
'required_if' => 'حقل السمة: مطلوب عند: أوثر إس: فالو.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Елемент',
'field_format' => 'Формат',
'field_custom_format' => 'Персонализиран формат',
'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>.',
'required' => 'Задължителен',
'req' => 'Req.',
'used_by_models' => 'Използвани от модели ',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'Избраният :attribute е невалиден.',
'numeric' => ':attribute трябва да бъде число.',
'present' => 'Полето на атрибута трябва да е налице.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Форматът на :attribute е невалиден.',
'required' => 'Полето :attribute е задължително.',
'required_if' => 'Полето :attribute е задължително, когато :other е :value.',
@@ -20,6 +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>.',
'required' => 'Povinné',
'req' => 'Pov.',
'used_by_models' => 'Užito u modelů',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'Zvolený :attribute je neplatný.',
'numeric' => ':attribute musí být číslo.',
'present' => 'Pole atributu musí být přítomno.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Formát :attribute je neplatný.',
'required' => 'Pole :attribute je požadováno.',
'required_if' => 'Položka :attribute je vyžadována, když :other je :value.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Element',
'field_format' => 'Format',
'field_custom_format' => 'Brugerdefineret Format',
'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>.',
'required' => 'Påkrævet',
'req' => 'Req.',
'used_by_models' => 'Bruges af modeller',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'Den valgte :attribute er ugyldig.',
'numeric' => ':attribute skal være et tal.',
'present' => 'Attributfeltet skal være til stede.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => ':attribute formatet er ugyldigt.',
'required' => ':attribute feltet er krævet.',
'required_if' => ':attribute feltet er krævet når :other er :value.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Element',
'field_format' => 'Format',
'field_custom_format' => 'Benutzerdefiniertes Format',
'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>.',
'required' => 'Erforderlich',
'req' => 'Erf.',
'used_by_models' => 'Von Modellen benutzt',
+1 -1
View File
@@ -63,7 +63,7 @@ return array(
'success' => 'Asset wurde erfolgreich herausgegeben.',
'user_does_not_exist' => 'Dieser Benutzer existiert nicht. Bitte versuchen Sie es erneut.',
'not_available' => 'Dieses Asset kann nicht herausgegeben werden!',
'no_assets_selected' => 'You must select at least one asset from the list'
'no_assets_selected' => 'Mind. 1 Eintrag muss ausgewählt werden'
),
'checkin' => array(
+4 -4
View File
@@ -23,8 +23,8 @@ return array(
'confirm_purge_help' => 'Geben Sie das Wort "DELETE" in das untere Feld ein um die gelöschten Einträge zu bereinigen. Dies kann nicht rückgängig gemacht werden.',
'custom_css' => 'Eigenes CSS',
'custom_css_help' => 'Füge eigenes CSS hinzu. Benutze keine &lt;style&gt;&lt;/style&gt; tags.',
'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' => 'Benutzerdefinierte Passwort Reset URL',
'custom_forgot_pass_url_help' => 'Dadurch wird die integrierte URL für vergessene Passwörter auf dem Anmeldebildschirm ersetzt. Dies ist nützlich, um Benutzer zur internen oder gehosteten Funktion zum Zurücksetzen von LDAP-Passwörtern zu leiten. Es wird effektiv die Funktionalität des lokalen, vergessenen Passworts deaktiviert.',
'default_currency' => 'Standardwährung',
'default_eula_text' => 'Standard EULA',
'default_language' => 'Standardsprache',
@@ -46,8 +46,8 @@ return array(
'ldap_enabled' => 'LDAP aktiviert',
'ldap_integration' => 'LDAP Integration',
'ldap_settings' => 'LDAP Einstellungen',
'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' => 'Geben Sie einen gültigen LDAP-Benutzernamen und ein Passwort von der oben angegebenen Basis-DN ein, um zu testen, ob Ihre LDAP-Anmeldung korrekt konfiguriert ist. SIE MÜSSEN IHRE AKTUALISIERTEN LDAP-EINSTELLUNGEN ZUERST SPEICHERN.',
'ldap_login_sync_help' => 'Dies testet nur, ob LDAP korrekt synchronisiert werden kann. Wenn Ihre LDAP-Authentifizierungsabfrage nicht korrekt ist, können sich Benutzer möglicherweise nicht anmelden. SIE MÜSSEN IHRE AKTUALISIERTEN LDAP-EINSTELLUNGEN ZUERST SPEICHERN.',
'ldap_server' => 'LDAP Server',
'ldap_server_help' => 'Sollte mit ldap:// (für unencrypted oder TLS) oder ldaps:// (für SSL) starten',
'ldap_server_cert' => 'LDAP SSL Zertifikatsüberprüfung',
@@ -19,9 +19,9 @@ return array(
'confirm' => 'Sind Sie sicher, dass Sie diesen Lieferanten löschen möchten?',
'error' => 'Beim löschen des Lieferanten ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.',
'success' => 'Lieferant wurde erfolgreich gelöscht.',
'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' => 'Dieser Lieferant ist derzeit :asset_count Asset(s) zugeordnet und kann nicht gelöscht werden. Bitte aktualisieren Sie Ihre Assets so, dass sie nicht mehr auf diesen Lieferant verweisen und versuchen Sie es erneut. ',
'assoc_licenses' => 'Dieser Lieferant ist derzeit mit :licenses_count Lizenze(n) verknüpft und kann nicht gelöscht werden. Bitte aktualisieren Sie Ihre Lizenzen so, dass sie nicht mehr auf diesen Lieferant verweisen und versuchen Sie es erneut. ',
'assoc_maintenances' => 'Diese Lieferant ist derzeit mindestens einem Modell zugeordnet und kann nicht gelöscht werden. Bitte aktualisieren Sie Ihre Modelle, um nicht mehr auf diesen Lieferant zu verweisen und versuchen Sie es erneut. ',
)
);
+2 -2
View File
@@ -40,7 +40,7 @@
'checkout' => 'Checkout Asset to User',
'city' => 'Stadt',
'click_here' => 'Hier klicken',
'clear_selection' => 'Clear Selection',
'clear_selection' => 'Auswahl löschen',
'companies' => 'Firmen',
'company' => 'Firma',
'component' => 'Komponente',
@@ -90,7 +90,7 @@
'history' => 'Historie',
'history_for' => 'Verlauf für',
'id' => 'Id',
'image' => 'Image',
'image' => 'Abbildung',
'image_delete' => 'Bild löschen',
'image_upload' => 'Bild hinzufügen',
'import' => 'Import',
+2 -1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'Auswahl :attribute ist ungültig.',
'numeric' => ':attribute muss eine Zahl sein.',
'present' => 'Das Attributfeld muss vorhanden sein.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => ':attribute Format ungültig.',
'required' => ':attribute Feld muss ausgefüllt sein.',
'required_if' => ':attribute wird benötigt wenn :other :value entspricht.',
@@ -87,7 +88,7 @@ return array(
'unique' => ':attribute schon benutzt.',
'uploaded' => ':attribute konnte nicht hochgeladen werden.',
'url' => ':attribute Format ist ungültig.',
"unique_undeleted" => "The :attribute must be unique.",
"unique_undeleted" => "Die Variable :attribute muss eindeutig sein.",
/*
|--------------------------------------------------------------------------
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Στοιχείο',
'field_format' => 'Τύπος',
'field_custom_format' => 'Προσαρμοσμένος τύπος',
'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>.',
'required' => 'Απαιτείται',
'req' => 'Req.',
'used_by_models' => 'Χρησιμοποιήθηκε από τα μοντέλα',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'Το επιλεγμένο: χαρακτηριστικό δεν είναι έγκυρο.',
'numeric' => 'Το χαρακτηριστικό πρέπει να είναι ένας αριθμός.',
'present' => 'Πρέπει να υπάρχει το πεδίο ιδιοτήτων: attribute.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Η μορφή του χαρακτηριστικού είναι μη έγκυρη.',
'required' => 'Το πεδίο ιδιοτήτων: απαιτείται.',
'required_if' => 'Το πεδίο ιδιοτήτων: απαιτείται όταν: το άλλο είναι: τιμή.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Element',
'field_format' => 'Format',
'field_custom_format' => 'Custom Format',
'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>.',
'required' => 'Required',
'req' => 'Req.',
'used_by_models' => 'Used By Models',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'present' => 'The :attribute field must be present.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Element',
'field_format' => 'Format',
'field_custom_format' => 'Custom Format',
'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>.',
'required' => 'Required',
'req' => 'Req.',
'used_by_models' => 'Used By Models',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'present' => 'The :attribute field must be present.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Elemento',
'field_format' => 'Formato',
'field_custom_format' => 'Formato personalizado',
'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>.',
'required' => 'Obligatorio',
'req' => 'Obl.',
'used_by_models' => 'Usado Por Modelos',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'El :attribute seleccionado no es correcto.',
'numeric' => ':attribute debe ser un número.',
'present' => 'El campo: atributo debe estar presente.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => ':attribute formato incorrecto.',
'required' => ':attribute es obligatorio.',
'required_if' => ':attribute es obligatrio cuando :other es :value.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Elemento',
'field_format' => 'Formato',
'field_custom_format' => 'Formato personalizado',
'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>.',
'required' => 'Obligatorio',
'req' => 'Obl.',
'used_by_models' => 'Usado Por Modelos',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'El :attribute seleccionado no es correcto.',
'numeric' => ':attribute debe ser un número.',
'present' => 'El campo: atributo debe estar presente.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => ':attribute formato incorrecto.',
'required' => ':attribute es obligatorio.',
'required_if' => ':attribute es obligatrio cuando :other es :value.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Element',
'field_format' => 'Vorming',
'field_custom_format' => 'Kohandatud vorming',
'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>.',
'required' => 'Nõutud',
'req' => 'Req.',
'used_by_models' => 'Kasutatud mudelite järgi',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'Valitud atribuut on kehtetu.',
'numeric' => 'Atribuut peab olema number.',
'present' => 'Atribuudiväli peab olema kohal.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Atribuudivorming on vale.',
'required' => 'Atribuudiväljandus on kohustuslik.',
'required_if' => 'Atribuudiväljastus on vajalik, kui: muu on: väärtus.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'عنصر',
'field_format' => 'شکل دادن',
'field_custom_format' => 'شکل دادن سفارشی',
'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>.',
'required' => 'نیازمندی',
'req' => 'نیازمندی',
'used_by_models' => 'استفاده شده توسط مدل ها',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'ویژگی انتخاب شده نامعتبر است.',
'numeric' => 'ویژگی باید عدد باشد.',
'present' => 'فیلد attribute باید باشد.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'شکل ویژگی نامعتبر است.',
'required' => 'فیلد ویژگی ضروری است.',
'required_if' => 'فیلد ویژگی ضروری است، وقتی که دیگری ارزش است.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'elementti',
'field_format' => 'Muoto',
'field_custom_format' => 'Mukautettu muoto',
'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>.',
'required' => 'Edellytetään',
'req' => 'Req.',
'used_by_models' => 'Käytetään mallien mukaan',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'Valittu :attribute on virheellinen.',
'numeric' => ':attribute tulee olla numero.',
'present' => 'Attribuutti-kentän on oltava läsnä.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => ':attribute muotoilu on virheellinen.',
'required' => ':attribute on vaadittu.',
'required_if' => ':attribute on vaadittu kun :other on :value.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Elément',
'field_format' => 'Format',
'field_custom_format' => 'Format personnalisé',
'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>.',
'required' => 'Requis',
'req' => 'Req.',
'used_by_models' => 'Utilisé par les modèles',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'L\'attribut ":attribute" est invalide.',
'numeric' => 'L\'attribut ":attribute" doit être un nombre.',
'present' => 'Le champ d\'attribut: doit être présent.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Le format de l\'attribut ":attribute" est invalide.',
'required' => 'Le champs :attribute est nécessaire.',
'required_if' => 'Le champ :attribute est nécessaire quand :other vaut :value.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Eilimint',
'field_format' => 'Formáid',
'field_custom_format' => 'Formáid Chustaim',
'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>.',
'required' => 'Riachtanach',
'req' => 'Req.',
'used_by_models' => 'Úsáidte trí Mhúnlaí',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'An roghnaithe: tá tréith neamhbhailí.',
'numeric' => 'An: Ní mór tréith a bheith ina líon.',
'present' => 'Ní mór an réimse tréith a bheith i láthair.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Tá an fhormáid tréithbhail neamhbhailí.',
'required' => 'An: Tá réimse tréith ag teastáil.',
'required_if' => 'An: Tá réimse tréith ag teastáil nuair: eile é: luach.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'אֵלֵמֶנט',
'field_format' => 'פוּרמָט',
'field_custom_format' => 'פורמט מותאם אישית',
'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>.',
'required' => 'נדרש',
'req' => 'Req.',
'used_by_models' => 'דגמים משומשים',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'התכונה שנבחרה: אינה חוקית.',
'numeric' => 'התכונה: חייבת להיות מספר.',
'present' => 'שדה התכונה: חייב להיות נוכח.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'תבנית התכונה: אינה חוקית.',
'required' => 'שדה התכונה: נדרש.',
'required_if' => 'שדה התכונה: נדרש כאשר: other is: value.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Element',
'field_format' => 'Format',
'field_custom_format' => 'Prilagođeni format',
'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>.',
'required' => 'Potreban',
'req' => 'Req.',
'used_by_models' => 'Koristi se po modelu',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'Odabrani: atribut nije važeći.',
'numeric' => 'Atribut mora biti broj.',
'present' => 'Polje atributa mora biti prisutno.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Format atributa nije važeći.',
'required' => 'Potrebno je: polje atributa.',
'required_if' => 'Polje atributa je obavezno kada: druga vrijednost: vrijednost.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Elem',
'field_format' => 'Formátum',
'field_custom_format' => 'Egyéni formátum',
'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>.',
'required' => 'Kötelező',
'req' => 'Kötelező.',
'used_by_models' => 'Modellek szerint ',
+1 -1
View File
@@ -62,7 +62,7 @@ return array(
'success' => 'A készlet sikeresen ki lett állítva.',
'user_does_not_exist' => 'Ez a felhasználó érvénytelen. Kérlek próbáld újra.',
'not_available' => 'Ez az eszköz nem áll rendelkezésre pénztárnál!',
'no_assets_selected' => 'You must select at least one asset from the list'
'no_assets_selected' => 'Ki kell választania legalább egy elemet a listából'
),
'checkin' => array(
+4 -4
View File
@@ -23,8 +23,8 @@ return array(
'confirm_purge_help' => 'Az alábbi mezőbe írja be a "DELETE" szöveget a törölt rekordok törléséhez. Ez a művelet nem vonható vissza.',
'custom_css' => 'Egyéni CSS',
'custom_css_help' => 'Adjon meg olyan egyedi CSS felülírást, amelyet használni szeretne. Ne tüntesse fel a &lt;style&gt;&lt;/style&gt; címkéket.',
'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' => 'Egyéni jelszó visszaállítási URL',
'custom_forgot_pass_url_help' => 'Ez felváltja a beépített elfelejtett jelszó URL-jét a bejelentkezési képernyőn, amely hasznos lehet arra, hogy az embereket belső vagy hosztolt LDAP jelszó-visszaállítási funkciókra irányítsa. Hatékonyan kikapcsolja a helyi felhasználók elfelejtett jelszavát.',
'default_currency' => 'Alapértelmezett pénznem',
'default_eula_text' => 'Alapértelmezett EULA',
'default_language' => 'Alapértelmezett nyelv',
@@ -46,8 +46,8 @@ return array(
'ldap_enabled' => 'LDAP bekapcsolva',
'ldap_integration' => 'LDAP integráció',
'ldap_settings' => 'LDAP beállítások',
'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' => 'Adjon meg egy érvényes LDAP felhasználónevet és jelszót a fenti alapszintű DN-ből, hogy ellenőrizze, hogy az LDAP-bejelentkezés megfelelően van-e beállítva. EL KELL MENTENIE A MÓDOSÍTOTT LDAP BEÁLLÍTÁSOKAT ELŐBB.',
'ldap_login_sync_help' => 'Ez csak azt teszteli, hogy az LDAP helyesen szinkronizálható. Ha az LDAP hitelesítési lekérdezése nem megfelelő, a felhasználók még mindig nem tudnak bejelentkezni. EL KELL MENTENIE A MÓDOSÍTOTT LDAP BEÁLLÍTÁSOKAT ELŐBB.',
'ldap_server' => 'LDAP szerver',
'ldap_server_help' => 'Ezt az ldap: // (titkosítatlan vagy TLS) vagy az ldaps:',
'ldap_server_cert' => 'LDAP SSL tanúsítvány érvényesítés',
@@ -19,9 +19,9 @@ return array(
'confirm' => 'Biztosan törölni szeretné ezt a szállítót?',
'error' => 'A szállító törlését okozta. Kérlek próbáld újra.',
'success' => 'A szállító sikeresen törölve lett.',
'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' => 'Ez a beszállító jelenleg :asset_count eszközhöz van társítva és nem törölhető. Kérem frissítse az eszközeit hogy ne hivatkozzon erre a beszállítóra és próbálja újra. ',
'assoc_licenses' => 'Ez a beszállító jelenleg :asset_count licenszhez van társítva és nem törölhető. Kérem frissítse az licenszeit hogy ne hivatkozzonak erre a beszállítóra és próbálja újra. ',
'assoc_maintenances' => 'Ez a beszállító jelenleg :asset_maintenances_count eszköz karbantartáshoz van társítva és nem törölhető. Kérem frissítse az eszköz karbantartásait hogy ne hivatkozzon erre a beszállítóra és próbálja újra. ',
)
);
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'A kiválasztott :attribute étvénytelen.',
'numeric' => 'A :attribute csak szám lehet.',
'present' => 'A: attribútum mezőnek jelen kell lennie.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Az :attribute formátuma érvénytelen.',
'required' => 'A :attribute mező kötelező.',
'required_if' => 'A :attribute mező kötelező ha :other egy :value.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Elemen',
'field_format' => 'Format',
'field_custom_format' => 'Format Ubahan',
'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>.',
'required' => 'Harus diisi',
'req' => 'Req.',
'used_by_models' => 'Digunakan oleh Model',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => ':attribute yang di pilih tidak benar.',
'numeric' => ':attribute harus dalam angka.',
'present' => 'Bidang atribut: harus ada.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Format :attribute tidak benar.',
'required' => 'Kolom :attribute wajib di-isi.',
'required_if' => 'Kolom :attribute wajib di-isi ketika :other nya :value.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Elemento',
'field_format' => 'Formato',
'field_custom_format' => 'Formato personalizzato',
'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>.',
'required' => 'Obbligatorio',
'req' => 'Obbl.',
'used_by_models' => 'Usato dai Modelli',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'L\' :attribute selezionato è invalido.',
'numeric' => 'L\' :attribute deve essere un numero.',
'present' => 'Il campo attributo deve essere presente.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Il formato dell\' :attribute è invalido.',
'required' => 'Il campo :attribute è obblogatorio.',
'required_if' => 'L\' :attribute è richiesto quando :other è :value.',
@@ -21,6 +21,7 @@ return array(
'field_element_short' => 'エレメント',
'field_format' => 'フォーマット',
'field_custom_format' => 'カスタム形式:',
'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>.',
'required' => '必須',
'req' => '必須',
'used_by_models' => '型番で使用',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => '選択された :attribute は不正です。',
'numeric' => ':attribute は数字にして下さい。',
'present' => ':attribute フィールドは必須です。',
'valid_regex' => 'That is not a valid regex. ',
'regex' => ':attribute フォーマットが不正です。',
'required' => ':attribute フィールドは、必須です。',
'required_if' => ':other が :value の時、:attribute フィールドは必須です。',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => '성분',
'field_format' => '형식',
'field_custom_format' => '사용자 형식',
'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>.',
'required' => '필수사항',
'req' => '필수',
'used_by_models' => '적용 모델',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => '선택한 :attribute 가 부정확 합니다.',
'numeric' => ':attribute 는 숫자만 가능합니다.',
'present' => ':attribute 항목이 있어야 합니다.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => ':attribute 형식이 부정확 합니다.',
'required' => ':attribute 항목을 입력해 주세요.',
'required_if' => ':attribute 항목은 :other가 :value 일때 필요합니다.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Elementas',
'field_format' => 'Formatas',
'field_custom_format' => 'Pritaikomas formatas',
'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>.',
'required' => 'Privalomas',
'req' => 'Privaloma.',
'used_by_models' => 'Naudojama modelių',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'Pasirinktas :attribute neteisingas.',
'numeric' => ':attribute privalo būti skaičius.',
'present' => 'Atributo laukas turi būti.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => ':attribute formatas neteisingas.',
'required' => ':attribute laukelis privalomas.',
'required_if' => ':attribute laukelis yra privalomas kai :other yra :value.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Elements',
'field_format' => 'Formāts',
'field_custom_format' => 'Pielāgotais formāts',
'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>.',
'required' => 'Obligāts',
'req' => 'Req.',
'used_by_models' => 'Izmantoti modeļi',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'Atlasītais: atribūts nav derīgs.',
'numeric' => 'Atribūts ir jābūt skaitlim.',
'present' => 'Atribūta laukam jābūt klāt.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Atribūta formāts nav derīgs.',
'required' => 'Atribūta lauks ir nepieciešams.',
'required_if' => 'Atribūta lauks ir nepieciešams, ja: cits ir: vērtība.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Tuhinga',
'field_format' => 'Whakahōputu',
'field_custom_format' => 'Whakaritenga Ritenga',
'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>.',
'required' => 'E hiahiatia ana',
'req' => 'Req.',
'used_by_models' => 'Kua Whakamahia Ma Nga Tauira',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'Ko te mea i tīpakohia: he muhu te huanga.',
'numeric' => 'Ko te: me tohu he huanga.',
'present' => 'Ko te: ko te waahi tohu kia noho.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Ko te: ko te hōputu huanga he muhu.',
'required' => 'Ko te: e hiahiatia ana te waahi huanga.',
'required_if' => 'Ko te: ka hiahiatia te waahi huanga ina: ko etahi atu: te uara.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Бүрэлдэхүүн',
'field_format' => 'Формат',
'field_custom_format' => 'Гаалийн формат',
'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>.',
'required' => 'Шаардлагатай',
'req' => 'Req.',
'used_by_models' => 'Загвар ашиглана',
+1
View File
@@ -67,6 +67,7 @@ return array(
'not_in' => 'Сонгосон: шинж чанар буруу байна.',
'numeric' => 'Үүнд: атрибут нь тоо байх ёстой.',
'present' => 'Үүнд: атрибутын талбар байх ёстой.',
'valid_regex' => 'That is not a valid regex. ',
'regex' => 'Агуулга формат буруу байна.',
'required' => 'Үүнд: атрибутын талбар шаардлагатай.',
'required_if' => 'Үүнд: аттрибутын талбар шаардлагатай үед: бусад нь: утга.',
@@ -20,6 +20,7 @@ return array(
'field_element_short' => 'Elemen',
'field_format' => 'Format',
'field_custom_format' => 'Format Tersuai',
'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>.',
'required' => 'Diperlukan',
'req' => 'Req.',
'used_by_models' => 'Digunakan Oleh Model',
+1 -1
View File
@@ -62,7 +62,7 @@ return array(
'success' => 'Harta berjaya diagihkan.',
'user_does_not_exist' => 'Pengguna tak sah. Sila cuba lagi.',
'not_available' => 'Aset itu tidak tersedia untuk checkout!',
'no_assets_selected' => 'You must select at least one asset from the list'
'no_assets_selected' => 'Anda mesti memilih sekurang-kurangnya satu aset dari senarai'
),
'checkin' => array(
+4 -4
View File
@@ -23,8 +23,8 @@ return array(
'confirm_purge_help' => 'Masukkan teks "DELETE" dalam kotak di bawah untuk membersihkan rekod anda yang dihapuskan. Tindakan ini tidak dapat dibatalkan.',
'custom_css' => 'CSS tersuai',
'custom_css_help' => 'Masukkan mana-mana CSS ubah khas yang anda mahu gunakan. Jangan masukkan tag &lt;style&gt;&lt;/style&gt;.',
'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' => 'URL Khas untuk Penetapan Semula Kata Laluan',
'custom_forgot_pass_url_help' => 'Ini menggantikan URL terlupa kata laluan terbina pada skrin log masuk, berguna untuk mengarahkan pengguna ke fungsi semula kata laluan LDAP dalaman atau dihoskan. Ia secara langsung akan melumpuhkan fungsi kata laluan terlupa pengguna tempatan.',
'default_currency' => 'Mata Wang Default',
'default_eula_text' => 'EULA lalai',
'default_language' => 'Bahasa Lalai',
@@ -46,8 +46,8 @@ return array(
'ldap_enabled' => 'LDAP diaktifkan',
'ldap_integration' => 'Integrasi LDAP',
'ldap_settings' => 'Tetapan 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' => 'Masukkan nama pengguna dan kata laluan LDAP yang sah dari pangkalan DN yang anda tentukan di atas untuk menguji sama ada log masuk LDAP anda dikonfigurasi dengan betul. ANDA MESTI SIMPAN KONFIGURASI LDAP TERKINI DAHULU.',
'ldap_login_sync_help' => 'Ini hanya ujian bahawa LDAP boleh diselaraskan dengan betul. Jika pertanyaan Pengesahan LDAP anda tidak betul, pengguna mungkin masih tidak boleh log masuk. ANDA MESTI SIMPAN KONFIGURASI LDAP TERKINI DAHULU.',
'ldap_server' => 'Pelayan LDAP',
'ldap_server_help' => 'Ini harus bermula dengan ldap: // (untuk tidak disulitkan atau TLS) atau ldaps: // (untuk SSL)',
'ldap_server_cert' => 'Pengesahan sijil LDAP SSL',

Some files were not shown because too many files have changed in this diff Show More