Compare commits

...

162 Commits

Author SHA1 Message Date
snipe 7769a93a10 Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-03-05 19:07:40 +00:00
snipe 95a6c7058f Bumped version
Signed-off-by: snipe <snipe@snipe.net>
2024-03-05 19:06:55 +00:00
snipe 9a5c1b8126 Merge pull request #14362 from Godmartinz/labels-not-generating-properly
Fixes inconsistencies with generating labels
2024-03-04 18:49:44 +00:00
Godfrey M e926db76a0 fixes inconsistencies with generating labels 2024-03-04 10:26:38 -08:00
snipe 9419c7fdeb Fixed contributing link
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 12:42:26 +00:00
snipe 9dbb4abe7e Fixed tests
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 12:30:05 +00:00
snipe 19e0fb7955 Reverting CSP change
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 12:25:14 +00:00
snipe 5b9b21a7d1 Merge pull request #14357 from snipe/fixes/stricter_csp_rules
Removed unsafe-inline and unsafe-eval
2024-03-01 11:48:51 +00:00
snipe 93e69ab0c6 Removed unsafe-inline and unsafe-eval
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 11:44:49 +00:00
snipe bc5c559413 Merge pull request #14356 from snipe/fixes/set_csp_rule_to_true_by_default
Set CSP headers to true by default
2024-03-01 11:37:53 +00:00
snipe 9b2fcbff08 Set CSP headers to true by default
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 11:36:37 +00:00
snipe ad2674d20b Merge pull request #14355 from snipe/localization/new_strings
Updated language strings
2024-03-01 11:18:12 +00:00
snipe 10ac2c830f Updated language strings
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 11:17:02 +00:00
snipe df3053eafb Merge pull request #14354 from snipe/bug/sc-24911
Use SVG cleaner on favicons
2024-03-01 10:19:59 +00:00
snipe aaae952acb Use SVG cleaner on favicons
Signed-off-by: snipe <snipe@snipe.net>
2024-03-01 10:17:57 +00:00
snipe b1cd44341b Merge pull request #14347 from snipe/feature/sc-24856_requestable_page
Dynamically show models/assets on requestable page
2024-02-28 15:04:48 +00:00
snipe 3da47cdacd Removed header for consistency
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 15:03:34 +00:00
snipe 658dda916c Changed operator
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 15:01:00 +00:00
snipe 7c3d8b896b Updated asset transformers/presenters to display requestable status
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 14:59:55 +00:00
snipe 1ce9df7998 New translation
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 14:59:27 +00:00
snipe a0cbf66c81 Only show tabs if there are requestable assets/models
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 14:59:20 +00:00
snipe a4941031cb Merge pull request #14260 from marcusmoore/chore/sc-24808
Added tests around asset check in and added missing actions to the api controller action
2024-02-28 13:34:12 +00:00
snipe 9fd6aea325 Merge pull request #14281 from Godmartinz/preview-label-fields
Added better label previews with the new label engine
2024-02-28 11:48:05 +00:00
snipe a52181c995 Merge pull request #14283 from akemidx/bug/sc-24788
FIXED: Checked in Assets Did Not Show in Custom Report when Selecting a Valid Checked Out Date
2024-02-28 11:47:46 +00:00
snipe ee75df0f0a Merge pull request #14346 from snipe/feature/sc-18728
Added `min_amt` functionality to licenses
2024-02-28 11:26:25 +00:00
snipe 92eff653f1 Removed logging
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:26:03 +00:00
snipe 1e66985a78 Merge pull request #14344 from snipe/features/added_created_by_to_groups
Added created_by to groups table
2024-02-28 11:19:52 +00:00
snipe a059a42799 Added use Auth to API controller
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:14:48 +00:00
snipe b5603fbfe9 Added min amt to license blade
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:09:07 +00:00
snipe a0423a9cc3 Added translations
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:08:56 +00:00
snipe 4ab7112988 Added validation and fillable attributes for min_amt
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:08:47 +00:00
snipe 767cf96010 Added min_amt to form
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:08:33 +00:00
snipe 4ffb7790df Added min_amt to API transformer/presenter
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:07:18 +00:00
snipe 3ccc55a78f Added license min amt formatter for BS table
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:06:50 +00:00
snipe d0d29e03db Migration for min_amt on licenses
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:06:01 +00:00
snipe 92b7c4b5ec Allow sorting on min_amt
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:05:13 +00:00
snipe dff7c43aed Added minimum account check for licenses
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:05:02 +00:00
snipe 9efbcbbd5e Added min_amt to licenses
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:04:42 +00:00
snipe 31fa0a7044 Removed logging
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 11:04:32 +00:00
snipe fcb2bf7fea Merge pull request #14335 from mauro-miatello/develop
Copy encrypted custom fields
2024-02-28 09:04:11 +00:00
snipe 0bd27d61b0 Added created_by to groups table
Signed-off-by: snipe <snipe@snipe.net>
2024-02-28 08:15:59 +00:00
snipe 369ecfa490 Merge pull request #14341 from marcusmoore/chore/sc-24900
Generate unique department names in factory
2024-02-28 07:07:45 +00:00
Marcus Moore 87ba2cb407 Generate unique names for departments 2024-02-27 12:47:56 -08:00
Marcus Moore 5084e5d3ef Improve variable type 2024-02-27 12:23:26 -08:00
Marcus Moore a5516e3511 Improve trait name 2024-02-27 12:06:29 -08:00
Marcus Moore 0e460baf82 Improve readability 2024-02-27 12:03:36 -08:00
Marcus Moore 69022bb8b6 Implement test 2024-02-27 11:12:35 -08:00
Marcus Moore 29d729171c Align test with actual values passed from the web 2024-02-26 11:13:39 -08:00
MrM 9475871edb Fix multiple tooltip issue
If there are multiple tooltips, they all report the message "copied" because there is no element selection. This fix resolves the issue.
2024-02-25 14:48:05 +01:00
MrM b69364d5ff Add copy of encrypted custom fields
Encrypted custom fields may contain sensitive or important information, and it may be useful to have the ability to copy them.
2024-02-25 14:47:06 +01:00
snipe 10dad8e6e6 Merge pull request #14327 from snipe/fixes/better_ui_for_history_importer
Nicer UI for history importer
2024-02-23 11:43:15 +00:00
snipe a184b4e67c Nicer UI for history importer
Signed-off-by: snipe <snipe@snipe.net>
2024-02-23 11:40:10 +00:00
snipe 8cd0a90ecd Merge pull request #14325 from snipe/fixes/RB-17890
Check for valid supplier in license view
2024-02-23 10:49:56 +00:00
snipe 4a37632ef3 Check for valid supplier in license view
Signed-off-by: snipe <snipe@snipe.net>
2024-02-23 10:48:53 +00:00
snipe 3271d020e9 Merge pull request #14319 from snipe/fixes/RB-17889
Check for activeFile before trying to get header on import
2024-02-23 08:19:21 +00:00
snipe e494a2670f Merge pull request #14321 from akemidx/accessory_pdf_dl_link
Adding in PDF download to Accesories/Asset/License Histories
2024-02-23 08:18:55 +00:00
snipe d3a0a337b9 Merge pull request #14323 from ubc-cpsc/bugfix/CVE-2024-25117
Fixes CVE-2024-25117 php-svg-lib lacks path validation on font through SVG inline styles
2024-02-23 08:05:03 +00:00
Joël Pittet 3951ee746d Fixes CVE-2024-25117, no other dependencies 2024-02-22 16:49:02 -08:00
Joël Pittet 84e4257e75 Fixes CVE-2024-25117 2024-02-22 16:40:08 -08:00
Marcus Moore c401c88702 Scope event fake 2024-02-22 16:19:33 -08:00
Marcus Moore b55a19cebb Add assertion event is dispatched with correct timestamp 2024-02-22 13:50:46 -08:00
Marcus Moore 4caadcfa19 Clear pending checkout acceptances when checking in asset via api 2024-02-22 13:33:16 -08:00
Marcus Moore dba837b1d2 Move location migration logic to trait 2024-02-22 13:21:52 -08:00
Marcus Moore 714fc63050 Have legacy locations updated upon api asset checkin 2024-02-22 13:14:30 -08:00
Marcus Moore 2df026bcb5 Allow updating asset default location when checking in asset via api 2024-02-22 12:40:14 -08:00
snipe f04aeb9f2b Fixed spacing
Signed-off-by: snipe <snipe@snipe.net>
2024-02-22 18:31:02 +00:00
snipe dc902e7a5a Fixed return type
Signed-off-by: snipe <snipe@snipe.net>
2024-02-22 18:30:23 +00:00
snipe 4fc66e19bb Check for activeFile before trying to get header
Signed-off-by: snipe <snipe@snipe.net>
2024-02-22 18:28:01 +00:00
snipe e12d2b2a42 Merge pull request #14317 from snipe/fixes/make_website_searchable_on_users_list
Made website searchable on users table
2024-02-22 17:01:58 +00:00
snipe cb78451d6c Made website searchable on users table
Signed-off-by: snipe <snipe@snipe.net>
2024-02-22 16:13:54 +00:00
snipe 7979bc63ae Merge pull request #14316 from snipe/feature/sc-24871
Added email, phone icons
2024-02-22 14:50:46 +00:00
snipe e8ad8a7448 Added email, phone icons
Signed-off-by: snipe <snipe@snipe.net>
2024-02-22 14:48:01 +00:00
snipe eb61f5aa9e Merge pull request #14315 from snipe/fixes/rb-3565
Only send notification if the item is assigned to a person
2024-02-22 12:05:59 +00:00
snipe 3351998efd Only send notification if the item is assigned to a person
Signed-off-by: snipe <snipe@snipe.net>
2024-02-22 12:03:07 +00:00
akemidx 0f3be4fdf8 adding in eula pdf dl link. mimics activity log 2024-02-21 17:45:10 -05:00
Marcus Moore 3ae8adfbf9 Remove incomplete flag on test case 2024-02-21 12:33:32 -08:00
Marcus Moore aa2632fe46 Merge branch 'develop' into chore/sc-24808 2024-02-21 12:33:06 -08:00
Godfrey M 14c86d447b added filter to collectifunction 2024-02-21 11:38:03 -08:00
Godfrey M bee016e0be keeps example values in the example preview, fixes indent 2024-02-21 09:31:01 -08:00
snipe 54552fc95c Merge pull request #14192 from inietov/fixes/api_issue_checkin_licenses
Fixed #14183  API /hardware/:id/checkin doesn't return Licenses
2024-02-21 11:35:06 +00:00
snipe ffa7d25fc0 Merge pull request #14308 from snipe/fixes/eager_load_relations_on_locations
Eager load relations to determine deletability on locations
2024-02-20 22:28:39 +00:00
snipe a37d3b00d0 Merge pull request #14307 from marcusmoore/bug/sc-24867
Fixed title not appearing in new label engine
2024-02-20 22:25:45 +00:00
snipe 04891c7c61 Eager load relations to determine
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 22:25:00 +00:00
Marcus Moore ccec190985 Set label title properly 2024-02-20 13:59:50 -08:00
snipe 71610fb20f Merge pull request #14304 from snipe/feature/sc-24018
Added ability to bulk delete locations
2024-02-20 18:14:51 +00:00
snipe cb0f9024b1 Fixed gate
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 17:56:40 +00:00
snipe 1797480128 Few more translations
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 17:27:56 +00:00
snipe 972b198248 Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 17:27:16 +00:00
snipe 9010b7acd0 Use isDeletable instead of asset count
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 17:27:10 +00:00
snipe b57b68571e Added blade views
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:44:45 +00:00
snipe 1ca9420baa Fixed incorrect gate
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:44:29 +00:00
snipe 0383938536 API-ify the managed locations tab in user view
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:44:20 +00:00
snipe 50b841d54d Added table data-dash attributes to make the checkbox stuff work
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:43:57 +00:00
snipe 8f71460fa1 Formatting changes only
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:43:27 +00:00
snipe d5324bce6a Added more generic bulk translations for trans_choice
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:43:07 +00:00
snipe 660f3ccba1 Removed duplicate key
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:42:28 +00:00
snipe bc8db3deab Added bulk delete routes
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:42:14 +00:00
snipe b2c8fbf349 Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:42:04 +00:00
snipe c3f21d9292 Removed new checkbox selectability on users and assets - more complicated work to be done
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:41:58 +00:00
snipe 9b146ae1d2 Formatting for API response
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:40:51 +00:00
snipe a32c679519 Removed debugging
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:40:31 +00:00
snipe 1e602793b2 Added manager ID to filter
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:40:23 +00:00
snipe a6a65b7523 Fixed locations isDeletable check
Signed-off-by: snipe <snipe@snipe.net>
2024-02-20 16:40:09 +00:00
snipe 04c1d9cbff Merge pull request #14302 from uberbrady/fix_uploaded_file_extensions
Clean up the file extension on image file uploads
2024-02-19 16:53:47 +00:00
Brady Wetherington a6dfd67cd7 Clean up the file extension on image file uploads 2024-02-19 16:51:23 +00:00
snipe 7d178da61c Merge pull request #14301 from snipe/bug/sc-24375
Disallow branding uploads in demo mode
2024-02-19 16:27:20 +00:00
snipe 30f9acfcf3 Disallow uploads in demo mode
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 16:11:17 +00:00
snipe 1e351b4d63 Merge pull request #14299 from snipe/fixes/fix_crash_on_purged_models_in_activity_report
Check that the model exists before trying to access properties
2024-02-19 15:36:44 +00:00
snipe cb5b691ec1 Check that the model exists before trying to access properties
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 15:34:57 +00:00
snipe b47b401245 Merge pull request #14298 from uberbrady/docker_fix_alpine_exif
Add missing EXIF PHP library for Alpine Docker image
2024-02-19 15:09:02 +00:00
Brady Wetherington 119e79e248 Add missing EXIF PHP library for Alpine Docker image 2024-02-19 15:00:13 +00:00
snipe d7254053b6 Merge pull request #14297 from snipe/feature/sc-24855
Added `/backups/latest` to API endpoint
2024-02-19 14:40:13 +00:00
snipe 8f8edd4126 Added /backups/latest endpoint
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 14:35:09 +00:00
snipe 10bb844087 Added comment
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 14:34:51 +00:00
snipe ba3baabb50 Fixed @return
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 14:34:36 +00:00
snipe c76fbe4edb Return 404 if download file isn’t found
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 13:05:44 +00:00
snipe cae2de4fc9 Merge remote-tracking branch 'origin/develop' 2024-02-19 12:25:26 +00:00
snipe 7c346d977a Merge pull request #14296 from snipe/fixes/return_download_for_backup_api
Better handle large downloads on backup API
2024-02-19 12:22:49 +00:00
snipe 9847934de9 Better handle large downloads on backup API
Signed-off-by: snipe <snipe@snipe.net>
2024-02-19 12:20:37 +00:00
snipe db73f80058 Starting off
Signed-off-by: snipe <snipe@snipe.net>
2024-02-16 18:57:50 +00:00
akemidx 4dd479dad7 formatting 2024-02-15 19:59:26 -05:00
akemidx d01e1e8eeb query works, but still only shows the asset once even if it's been checked out multiple times 2024-02-15 19:56:08 -05:00
akemidx e3ef737ac4 query first go 2024-02-15 19:15:27 -05:00
Godfrey M 69317fb403 Marcus is a beast and condensed everything into 4 lines 2024-02-15 13:26:47 -08:00
Godfrey M 1b80c8938a removed unnecessary if statement 2024-02-15 13:04:00 -08:00
Godfrey M dc77c01fd3 removes spacing 2024-02-15 13:00:38 -08:00
Godfrey M 83474d6e59 moves the array manipulation up the page where it should be 2024-02-15 12:59:47 -08:00
Godfrey M 529310c93a fixed typo in comment 2024-02-15 12:41:31 -08:00
Godfrey M 70f26f33a5 does a collect and map instead of a for loop for the array solution 2024-02-15 12:34:09 -08:00
Godfrey M 414bc10c40 removes the double for loop with a better solution 2024-02-15 12:02:08 -08:00
Godfrey M 250b0a7afb gives a better example with custom fields in label preview 2024-02-15 11:50:41 -08:00
snipe e5355db672 Merge remote-tracking branch 'origin/develop' 2024-02-15 18:39:57 +00:00
snipe aef45a90b2 Merge pull request #14278 from uberbrady/allowlist_and_db_prefix_for_restore
Allowlist and db prefix for restore
2024-02-15 14:50:44 +00:00
Brady Wetherington 6a78706a3e New 'sanitize' version of backup-restore tool. Optional. 2024-02-15 13:27:18 +00:00
akemidx 232fad0145 query and progress notes 2024-02-14 20:00:23 -05:00
Godfrey M 5cbcac28b1 adds custom fields as an example in label settings 2024-02-14 16:53:38 -08:00
Marcus Moore aec59f2da6 Update assertion to be more correct 2024-02-14 12:27:42 -08:00
Marcus Moore 905df5ec25 Consolidate test cases 2024-02-14 12:14:27 -08:00
Marcus Moore bacfdc5049 Scaffold additional tests 2024-02-14 11:33:03 -08:00
Marcus Moore 3cc72021b6 Move notification test to notifications test suite 2024-02-14 11:16:31 -08:00
Marcus Moore 4354e126b1 Scaffold tests 2024-02-14 11:11:08 -08:00
Marcus Moore 02f39472f9 Remove duplicate test 2024-02-14 11:10:59 -08:00
Marcus Moore d7aed2edc9 Remove unneeded code 2024-02-14 11:10:45 -08:00
Marcus Moore af513946a2 Implement test 2024-02-14 10:48:49 -08:00
Marcus Moore 7bfd02054b Remove duplicate authorization check 2024-02-14 10:48:41 -08:00
Marcus Moore ad1846fed6 Implement tests 2024-02-13 17:50:26 -08:00
Marcus Moore 9ab56fe9ca Implement tests 2024-02-13 17:04:53 -08:00
Marcus Moore f708b8b299 Implement test 2024-02-13 14:30:26 -08:00
Marcus Moore 391b832613 Implement test 2024-02-13 13:34:55 -08:00
Marcus Moore b653d19579 Implement test 2024-02-13 13:29:54 -08:00
akemidx 4a57cfaf3e commenting out the nulling of last checkout date on checkin page and API 2024-02-13 16:21:18 -05:00
Marcus Moore 31a75bd252 Add some assertions 2024-02-13 13:17:02 -08:00
Marcus Moore 0506f3bef9 Scaffold additional tests 2024-02-13 12:35:31 -08:00
Marcus Moore 852b0b3f11 Scaffold additional tests 2024-02-13 12:15:59 -08:00
Marcus Moore 307b39bd38 Implement tests around asset check in 2024-02-13 12:03:27 -08:00
Brady Wetherington 955f75f733 Fixes for the prefix-guessing and sanitizing. 2024-02-13 16:45:24 +00:00
Brady Wetherington 70ef904951 Actually got this pretty close to being able to do a restore 2024-02-13 12:16:15 +00:00
Brady Wetherington fcf023e3d2 WIP: trying to get prefixing and sanitization working 2024-02-13 12:16:15 +00:00
Brady Wetherington 8c882ddead Starting to abstract out the SQL Streaming logic into its own class 2024-02-13 12:16:15 +00:00
Brady Wetherington 7d136f9970 Initial rough stabs at prefix removal and SQL sanitization 2024-02-13 12:16:15 +00:00
Marcus Moore c81bc1d2ee Scaffold tests around asset check in 2024-02-12 17:54:22 -08:00
Ivan Nieto Vivanco 51ae485f20 When asset is checked-in the assigned licenses also are taken from the user 2024-01-30 19:44:38 -06:00
564 changed files with 9800 additions and 4096 deletions
+1
View File
@@ -29,6 +29,7 @@ RUN apk add --no-cache \
php81-sodium \
php81-redis \
php81-pecl-memcached \
php81-exif \
curl \
wget \
vim \
+1 -1
View File
@@ -1,7 +1,7 @@
![snipe-it-by-grok](https://github.com/snipe/snipe-it/assets/197404/b515673b-c7c8-4d9a-80f5-9fa58829a602)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.svg)](https://crowdin.com/project/snipe-it) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeitapp.svg?style=social)](https://twitter.com/snipeitapp) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=snipe/snipe-it&amp;utm_campaign=Badge_Grade) [![Tests](https://github.com/snipe/snipe-it/actions/workflows/tests.yml/badge.svg)](https://github.com/snipe/snipe-it/actions/workflows/tests.yml)
[![All Contributors](https://img.shields.io/badge/all_contributors-331-orange.svg?style=flat-square)](#contributors) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/yZFtShAcKk)
[![All Contributors](https://img.shields.io/badge/all_contributors-331-orange.svg?style=flat-square)](#contributing) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/yZFtShAcKk)
## Snipe-IT - Open Source Asset Management System
+184 -21
View File
@@ -5,6 +5,151 @@ namespace App\Console\Commands;
use Illuminate\Console\Command;
use ZipArchive;
class SQLStreamer {
private $input;
private $output;
// embed the prefix here?
public ?string $prefix;
private bool $reading_beginning_of_line = true;
public static $buffer_size = 1024 * 1024; // use a 1MB buffer, ought to work fine for most cases?
public array $tablenames = [];
private bool $should_guess = false;
private bool $statement_is_permitted = false;
public function __construct($input, $output, string $prefix = null)
{
$this->input = $input;
$this->output = $output;
$this->prefix = $prefix;
}
public function parse_sql(string $line): string {
// take into account the 'start of line or not' setting as an instance variable?
// 'continuation' lines for a permitted statement are PERMITTED.
if($this->statement_is_permitted && $line[0] === ' ') {
return $line;
}
$table_regex = '`?([a-zA-Z0-9_]+)`?';
$allowed_statements = [
"/^(DROP TABLE (?:IF EXISTS )?)`$table_regex(.*)$/" => false,
"/^(CREATE TABLE )$table_regex(.*)$/" => true, //sets up 'continuation'
"/^(LOCK TABLES )$table_regex(.*)$/" => false,
"/^(INSERT INTO )$table_regex(.*)$/" => false,
"/^UNLOCK TABLES/" => false,
// "/^\\) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;/" => false, // FIXME not sure what to do here?
"/^\\)[a-zA-Z0-9_= ]*;$/" => false
// ^^^^^^ that bit should *exit* the 'perimitted' black
];
foreach($allowed_statements as $statement => $statechange) {
// $this->info("Checking regex: $statement...\n");
$matches = [];
if (preg_match($statement,$line,$matches)) {
$this->statement_is_permitted = $statechange;
// matches are: 1 => first part of the statement, 2 => tablename, 3 => rest of statement
// (with of course 0 being "the whole match")
if (@$matches[2]) {
// print "Found a tablename! It's: ".$matches[2]."\n";
if ($this->should_guess) {
@$this->tablenames[$matches[2]] += 1;
continue; //oh? FIXME
} else {
$cleaned_tablename = \DB::getTablePrefix().preg_replace('/^'.$this->prefix.'/','',$matches[2]);
$line = preg_replace($statement,'$1`'.$cleaned_tablename.'`$3' , $line);
}
} else {
// no explicit tablename in this one, leave the line alone
}
//how do we *replace* the tablename?
// print "RETURNING LINE: $line";
return $line;
}
}
// all that is not allowed is denied.
return "";
}
//this is used in exactly *TWO* places, and in both cases should return a prefix I think?
// first - if you do the --sanitize-only one (which is mostly for testing/development)
// next - when you run *without* a guessed prefix, this is run first to figure out the prefix
// I think we have to *duplicate* the call to be able to run it again?
public static function guess_prefix($input):string
{
$parser = new self($input, null);
$parser->should_guess = true;
$parser->line_aware_piping(); // <----- THIS is doing the heavy lifting!
$check_tables = ['settings' => null, 'migrations' => null /* 'assets' => null */]; //TODO - move to statics?
//can't use 'users' because the 'accessories_users' table?
// can't use 'assets' because 'ver1_components_assets'
foreach($check_tables as $check_table => $_ignore) {
foreach ($parser->tablenames as $tablename => $_count) {
// print "Comparing $tablename to $check_table\n";
if (str_ends_with($tablename,$check_table)) {
// print "Found one!\n";
$check_tables[$check_table] = substr($tablename,0,-strlen($check_table));
}
}
}
$guessed_prefix = null;
foreach ($check_tables as $clean_table => $prefix_guess) {
if(is_null($prefix_guess)) {
print("Couldn't find table $clean_table\n");
die();
}
if(is_null($guessed_prefix)) {
$guessed_prefix = $prefix_guess;
} else {
if ($guessed_prefix != $prefix_guess) {
print("Prefix mismatch! Had guessed $guessed_prefix but got $prefix_guess\n");
die();
}
}
}
return $guessed_prefix;
}
public function line_aware_piping(): int
{
$bytes_read = 0;
if (! $this->input) {
throw new \Exception("No Input available for line_aware_piping");
}
while (($buffer = fgets($this->input, SQLStreamer::$buffer_size)) !== false) {
$bytes_read += strlen($buffer);
if ($this->reading_beginning_of_line) {
// \Log::debug("Buffer is: '$buffer'");
$cleaned_buffer = $this->parse_sql($buffer);
if ($this->output) {
$bytes_written = fwrite($this->output, $cleaned_buffer);
if ($bytes_written === false) {
throw new \Exception("Unable to write to pipe");
}
}
}
// if we got a newline at the end of this, then the _next_ read is the beginning of a line
if($buffer[strlen($buffer)-1] === "\n") {
$this->reading_beginning_of_line = true;
} else {
$this->reading_beginning_of_line = false;
}
}
return $bytes_read;
}
}
class RestoreFromBackup extends Command
{
/**
@@ -12,10 +157,13 @@ class RestoreFromBackup extends Command
*
* @var string
*/
// FIXME - , stripping prefixes and nonstandard SQL statements. Without --prefix, guess and return the correct prefix to strip
protected $signature = 'snipeit:restore
{--force : Skip the danger prompt; assuming you enter "y"}
{filename : The zip file to be migrated}
{--no-progress : Don\'t show a progress bar}';
{--no-progress : Don\'t show a progress bar}
{--sanitize-guess-prefix : Guess and output the table-prefix needed to "sanitize" the SQL}
{--sanitize-with-prefix= : "Sanitize" the SQL, using the passed-in table prefix (can be learned from --sanitize-guess-prefix). Pass as just \'--sanitize-with-prefix=\' to use no prefix}';
/**
* The console command description.
@@ -34,8 +182,6 @@ class RestoreFromBackup extends Command
parent::__construct();
}
public static $buffer_size = 1024 * 1024; // use a 1MB buffer, ought to work fine for most cases?
/**
* Execute the console command.
*
@@ -55,7 +201,7 @@ class RestoreFromBackup extends Command
return $this->error('Missing required filename');
}
if (! $this->option('force') && ! $this->confirm('Are you sure you wish to restore from the given backup file? This can lead to MASSIVE DATA LOSS!')) {
if (! $this->option('force') && ! $this->option('sanitize-guess-prefix') && ! $this->confirm('Are you sure you wish to restore from the given backup file? This can lead to MASSIVE DATA LOSS!')) {
return $this->error('Data loss not confirmed');
}
@@ -158,11 +304,11 @@ class RestoreFromBackup extends Command
}
foreach (array_merge($private_dirs, $public_dirs) as $dir) {
$last_pos = strrpos($raw_path, $dir.'/');
$last_pos = strrpos($raw_path, $dir . '/');
if ($last_pos !== false) {
//print("INTERESTING - last_pos is $last_pos when searching $raw_path for $dir - last_pos+strlen(\$dir) is: ".($last_pos+strlen($dir))." and strlen(\$rawpath) is: ".strlen($raw_path)."\n");
//print("We would copy $raw_path to $dir.\n"); //FIXME append to a path?
$interesting_files[$raw_path] = ['dest' =>$dir, 'index' => $i];
$interesting_files[$raw_path] = ['dest' => $dir, 'index' => $i];
continue 2;
if ($last_pos + strlen($dir) + 1 == strlen($raw_path)) {
// we don't care about that; we just want files with the appropriate prefix
@@ -171,7 +317,7 @@ class RestoreFromBackup extends Command
}
}
$good_extensions = ['png', 'gif', 'jpg', 'svg', 'jpeg', 'doc', 'docx', 'pdf', 'txt',
'zip', 'rar', 'xls', 'xlsx', 'lic', 'xml', 'rtf', 'webp', 'key', 'ico', ];
'zip', 'rar', 'xls', 'xlsx', 'lic', 'xml', 'rtf', 'webp', 'key', 'ico',];
foreach (array_merge($private_files, $public_files) as $file) {
$has_wildcard = (strpos($file, '*') !== false);
if ($has_wildcard) {
@@ -180,8 +326,8 @@ class RestoreFromBackup extends Command
$last_pos = strrpos($raw_path, $file); // no trailing slash!
if ($last_pos !== false) {
$extension = strtolower(pathinfo($raw_path, PATHINFO_EXTENSION));
if (! in_array($extension, $good_extensions)) {
$this->warn('Potentially unsafe file '.$raw_path.' is being skipped');
if (!in_array($extension, $good_extensions)) {
$this->warn('Potentially unsafe file ' . $raw_path . ' is being skipped');
$boring_files[] = $raw_path;
continue 2;
}
@@ -196,7 +342,6 @@ class RestoreFromBackup extends Command
}
$boring_files[] = $raw_path; //if we've gotten to here and haven't continue'ed our way into the next iteration, we don't want this file
} // end of pre-processing the ZIP file for-loop
// print_r($interesting_files);exit(-1);
if (count($sqlfiles) != 1) {
@@ -208,6 +353,17 @@ class RestoreFromBackup extends Command
//older Snipe-IT installs don't have the db-dumps subdirectory component
}
$sql_stat = $za->statIndex($sqlfile_indices[0]);
//$this->info("SQL Stat is: ".print_r($sql_stat,true));
$sql_contents = $za->getStream($sql_stat['name']); // maybe copy *THIS* thing?
// OKAY, now that we *found* the sql file if we're doing just the guess-prefix thing, we can do that *HERE* I think?
if ($this->option('sanitize-guess-prefix')) {
$prefix = SQLStreamer::guess_prefix($sql_contents);
$this->line($prefix);
return $this->info("Re-run this command with '--sanitize-with-prefix=".$prefix."' to see an attempt to sanitze your SQL.");
}
//how to invoke the restore?
$pipes = [];
@@ -228,6 +384,7 @@ class RestoreFromBackup extends Command
return $this->error('Unable to invoke mysql via CLI');
}
// I'm not sure about these?
stream_set_blocking($pipes[1], false); // use non-blocking reads for stdout
stream_set_blocking($pipes[2], false); // use non-blocking reads for stderr
@@ -238,9 +395,9 @@ class RestoreFromBackup extends Command
//$sql_contents = fopen($sqlfiles[0], "r"); //NOPE! This isn't a real file yet, silly-billy!
$sql_stat = $za->statIndex($sqlfile_indices[0]);
//$this->info("SQL Stat is: ".print_r($sql_stat,true));
$sql_contents = $za->getStream($sql_stat['name']);
// FIXME - this feels like it wants to go somewhere else?
// and it doesn't seem 'right' - if you can't get a stream to the .sql file,
// why do we care what's happening with pipes and stdout and stderr?!
if ($sql_contents === false) {
$stdout = fgets($pipes[1]);
$this->info($stdout);
@@ -249,20 +406,27 @@ class RestoreFromBackup extends Command
return false;
}
$bytes_read = 0;
try {
while (($buffer = fgets($sql_contents, self::$buffer_size)) !== false) {
$bytes_read += strlen($buffer);
// \Log::debug("Buffer is: '$buffer'");
if ( $this->option('sanitize-with-prefix') === null) {
// "Legacy" direct-piping
$bytes_read = 0;
while (($buffer = fgets($sql_contents, SQLStreamer::$buffer_size)) !== false) {
$bytes_read += strlen($buffer);
// \Log::debug("Buffer is: '$buffer'");
$bytes_written = fwrite($pipes[0], $buffer);
if ($bytes_written === false) {
throw new Exception("Unable to write to pipe");
if ($bytes_written === false) {
throw new Exception("Unable to write to pipe");
}
}
} else {
$sql_importer = new SQLStreamer($sql_contents, $pipes[0], $this->option('sanitize-with-prefix'));
$bytes_read = $sql_importer->line_aware_piping();
}
} catch (\Exception $e) {
\Log::error("Error during restore!!!! ".$e->getMessage());
// FIXME - put these back and/or put them in the right places?!
$err_out = fgets($pipes[1]);
$err_err = fgets($pipes[2]);
\Log::error("Error OUTPUT: ".$err_out);
@@ -271,7 +435,6 @@ class RestoreFromBackup extends Command
$this->error($err_err);
throw $e;
}
if (!feof($sql_contents) || $bytes_read == 0) {
return $this->error("Not at end of file for sql file, or zero bytes read. aborting!");
}
@@ -303,7 +466,7 @@ class RestoreFromBackup extends Command
$fp = $za->getStream($ugly_file_name);
//$this->info("Weird problem, here are file details? ".print_r($file_details,true));
$migrated_file = fopen($file_details['dest'].'/'.basename($pretty_file_name), 'w');
while (($buffer = fgets($fp, self::$buffer_size)) !== false) {
while (($buffer = fgets($fp, SQLStreamer::$buffer_size)) !== false) {
fwrite($migrated_file, $buffer);
}
fclose($migrated_file);
+27 -5
View File
@@ -11,6 +11,7 @@ use App\Models\CustomFieldset;
use App\Models\Depreciation;
use App\Models\Setting;
use App\Models\Statuslabel;
use App\Models\License;
use Crypt;
use Illuminate\Contracts\Encryption\DecryptException;
use Image;
@@ -715,18 +716,19 @@ class Helper
*/
public static function checkLowInventory()
{
$alert_threshold = \App\Models\Setting::getSettings()->alert_threshold;
$consumables = Consumable::withCount('consumableAssignments as consumable_assignments_count')->whereNotNull('min_amt')->get();
$accessories = Accessory::withCount('users as users_count')->whereNotNull('min_amt')->get();
$components = Component::whereNotNull('min_amt')->get();
$asset_models = AssetModel::where('min_amt', '>', 0)->get();
$licenses = License::where('min_amt', '>', 0)->get();
$avail_consumables = 0;
$items_array = [];
$all_count = 0;
foreach ($consumables as $consumable) {
$avail = $consumable->numRemaining();
if ($avail < ($consumable->min_amt) + \App\Models\Setting::getSettings()->alert_threshold) {
if ($avail < ($consumable->min_amt) + $alert_threshold) {
if ($consumable->qty > 0) {
$percent = number_format((($avail / $consumable->qty) * 100), 0);
} else {
@@ -745,7 +747,7 @@ class Helper
foreach ($accessories as $accessory) {
$avail = $accessory->qty - $accessory->users_count;
if ($avail < ($accessory->min_amt) + \App\Models\Setting::getSettings()->alert_threshold) {
if ($avail < ($accessory->min_amt) + $alert_threshold) {
if ($accessory->qty > 0) {
$percent = number_format((($avail / $accessory->qty) * 100), 0);
} else {
@@ -764,7 +766,7 @@ class Helper
foreach ($components as $component) {
$avail = $component->numRemaining();
if ($avail < ($component->min_amt) + \App\Models\Setting::getSettings()->alert_threshold) {
if ($avail < ($component->min_amt) + $alert_threshold) {
if ($component->qty > 0) {
$percent = number_format((($avail / $component->qty) * 100), 0);
} else {
@@ -787,7 +789,7 @@ class Helper
$total_owned = $asset->where('model_id', '=', $asset_model->id)->count();
$avail = $asset->where('model_id', '=', $asset_model->id)->whereNull('assigned_to')->count();
if ($avail < ($asset_model->min_amt)+ \App\Models\Setting::getSettings()->alert_threshold) {
if ($avail < ($asset_model->min_amt) + $alert_threshold) {
if ($avail > 0) {
$percent = number_format((($avail / $total_owned) * 100), 0);
} else {
@@ -803,6 +805,26 @@ class Helper
}
}
foreach ($licenses as $license){
$avail = $license->remaincount();
if ($avail < ($license->min_amt) + $alert_threshold) {
if ($avail > 0) {
$percent = number_format((($avail / $license->min_amt) * 100), 0);
} else {
$percent = 100;
}
$items_array[$all_count]['id'] = $license->id;
$items_array[$all_count]['name'] = $license->name;
$items_array[$all_count]['type'] = 'licenses';
$items_array[$all_count]['percent'] = $percent;
$items_array[$all_count]['remaining'] = $avail;
$items_array[$all_count]['min_amt'] = $license->min_amt;
$all_count++;
}
}
return $items_array;
}
+31 -4
View File
@@ -4,6 +4,10 @@ namespace App\Http\Controllers\Api;
use App\Events\CheckoutableCheckedIn;
use App\Http\Requests\StoreAssetRequest;
use App\Http\Traits\MigratesLegacyAssetLocations;
use App\Models\CheckoutAcceptance;
use App\Models\LicenseSeat;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Gate;
@@ -45,6 +49,8 @@ use Route;
*/
class AssetsController extends Controller
{
use MigratesLegacyAssetLocations;
/**
* Returns JSON listing of all assets
*
@@ -105,6 +111,7 @@ class AssetsController extends Controller
'requests_counter',
'byod',
'asset_eol_date',
'requestable',
];
$filter = [];
@@ -864,11 +871,9 @@ class AssetsController extends Controller
*/
public function checkin(Request $request, $asset_id)
{
$this->authorize('checkin', Asset::class);
$asset = Asset::with('model')->findOrFail($asset_id);
$this->authorize('checkin', $asset);
$target = $asset->assignedTo;
if (is_null($target)) {
return response()->json(Helper::formatStandardApiResponse('error', [
@@ -879,9 +884,8 @@ class AssetsController extends Controller
}
$asset->expected_checkin = null;
$asset->last_checkout = null;
//$asset->last_checkout = null;
$asset->last_checkin = now();
$asset->assigned_to = null;
$asset->assignedTo()->disassociate($asset);
$asset->accepted = null;
@@ -889,10 +893,16 @@ class AssetsController extends Controller
$asset->name = $request->input('name');
}
$this->migrateLegacyLocations($asset);
$asset->location_id = $asset->rtd_location_id;
if ($request->filled('location_id')) {
$asset->location_id = $request->input('location_id');
if ($request->input('update_default_location')){
$asset->rtd_location_id = $request->input('location_id');
}
}
if ($request->has('status_id')) {
@@ -906,6 +916,23 @@ class AssetsController extends Controller
$originalValues['action_date'] = $checkin_at;
}
$asset->licenseseats->each(function (LicenseSeat $seat) {
$seat->update(['assigned_to' => null]);
});
// Get all pending Acceptances for this asset and delete them
CheckoutAcceptance::pending()
->whereHasMorph(
'checkoutable',
[Asset::class],
function (Builder $query) use ($asset) {
$query->where('id', $asset->id);
})
->get()
->map(function ($acceptance) {
$acceptance->delete();
});
if ($asset->save()) {
event(new CheckoutableCheckedIn($asset, $target, Auth::user(), $request->input('note'), $checkin_at, $originalValues));
@@ -7,6 +7,7 @@ use App\Http\Controllers\Controller;
use App\Http\Transformers\GroupsTransformer;
use App\Models\Group;
use Illuminate\Http\Request;
use Auth;
class GroupsController extends Controller
@@ -25,7 +26,7 @@ class GroupsController extends Controller
$this->authorize('view', Group::class);
$allowed_columns = ['id', 'name', 'created_at', 'users_count'];
$groups = Group::select('id', 'name', 'permissions', 'created_at', 'updated_at')->withCount('users as users_count');
$groups = Group::select('id', 'name', 'permissions', 'created_at', 'updated_at', 'created_by')->with('admin')->withCount('users as users_count');
if ($request->filled('search')) {
$groups = $groups->TextSearch($request->input('search'));
@@ -63,6 +64,7 @@ class GroupsController extends Controller
$group = new Group;
$group->name = $request->input('name');
$group->created_by = Auth::user()->id;
$group->permissions = json_encode($request->input('permissions')); // Todo - some JSON validation stuff here
if ($group->save()) {
@@ -136,6 +136,7 @@ class LicensesController extends Controller
'seats',
'termination_date',
'depreciation_id',
'min_amt',
];
$sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at';
$licenses = $licenses->orderBy($sort, $order);
@@ -25,9 +25,27 @@ class LocationsController extends Controller
{
$this->authorize('view', Location::class);
$allowed_columns = [
'id', 'name', 'address', 'address2', 'city', 'state', 'country', 'zip', 'created_at',
'updated_at', 'manager_id', 'image',
'assigned_assets_count', 'users_count', 'assets_count','assigned_assets_count', 'assets_count', 'rtd_assets_count', 'currency', 'ldap_ou', ];
'id',
'name',
'address',
'address2',
'city',
'state',
'country',
'zip',
'created_at',
'updated_at',
'manager_id',
'image',
'assigned_assets_count',
'users_count',
'assets_count',
'assigned_assets_count',
'assets_count',
'rtd_assets_count',
'currency',
'ldap_ou',
];
$locations = Location::with('parent', 'manager', 'children')->select([
'locations.id',
@@ -50,6 +68,7 @@ class LocationsController extends Controller
])->withCount('assignedAssets as assigned_assets_count')
->withCount('assets as assets_count')
->withCount('rtd_assets as rtd_assets_count')
->withCount('children as children_count')
->withCount('users as users_count');
if ($request->filled('search')) {
@@ -80,6 +99,10 @@ class LocationsController extends Controller
$locations->where('locations.country', '=', $request->input('country'));
}
if ($request->filled('manager_id')) {
$locations->where('locations.manager_id', '=', $request->input('manager_id'));
}
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $locations->count()) ? $locations->count() : app('api_offset_value');
$limit = app('api_limit_value');
@@ -148,7 +148,7 @@ class SettingsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.0]
* @return Redirect
* @return JsonResponse
*/
public function ajaxTestEmail()
{
@@ -170,7 +170,7 @@ class SettingsController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v5.0.0]
* @return Response
* @return JsonResponse
*/
public function purgeBarcodes()
{
@@ -211,7 +211,7 @@ class SettingsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v5.0.0]
* @param \Illuminate\Http\Request $request
* @return array
* @return array | JsonResponse
*/
public function showLoginAttempts(Request $request)
{
@@ -229,6 +229,12 @@ class SettingsController extends Controller
}
/**
* Lists backup files
*
* @author [A. Gianotto]
* @return array | JsonResponse
*/
public function listBackups() {
$settings = Setting::getSettings();
$path = 'app/backups';
@@ -249,12 +255,12 @@ class SettingsController extends Controller
'filesize' => Setting::fileSizeConvert(Storage::size($backup_files[$f])),
'modified_value' => $file_timestamp,
'modified_display' => date($settings->date_display_format.' '.$settings->time_display_format, $file_timestamp),
'backup_url' => config('app.url').'/settings/backups/download/'.basename($backup_files[$f]),
];
$count++;
}
}
}
@@ -264,15 +270,56 @@ class SettingsController extends Controller
}
/**
* Downloads a backup file.
* We use response()->download() here instead of Storage::download() because Storage::download()
* exhausts memory on larger files.
*
* @author [A. Gianotto]
* @return JsonResponse|\Symfony\Component\HttpFoundation\BinaryFileResponse
*/
public function downloadBackup($file) {
$path = 'app/backups';
if (Storage::exists($path.'/'.$file)) {
$path = storage_path('app/backups');
if (Storage::exists('app/backups/'.$file)) {
$headers = ['ContentType' => 'application/zip'];
return Storage::download($path.'/'.$file, $file, $headers);
return response()->download($path.'/'.$file, $file, $headers);
} else {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.file_not_found')));
return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.file_not_found')), 404);
}
}
/**
* Determines and downloads the latest backup
*
* @author [A. Gianotto]
* @since [v6.3.1]
* @return JsonResponse|\Symfony\Component\HttpFoundation\BinaryFileResponse
*/
public function downloadLatestBackup() {
$fileData = collect();
foreach (Storage::files('app/backups') as $file) {
if (pathinfo($file, PATHINFO_EXTENSION) == 'zip') {
$fileData->push([
'file' => $file,
'date' => Storage::lastModified($file)
]);
}
}
$newest = $fileData->sortByDesc('date')->first();
if (Storage::exists($newest['file'])) {
$headers = ['ContentType' => 'application/zip'];
return response()->download(storage_path($newest['file']), basename($newest['file']), $headers);
} else {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.file_not_found')), 404);
}
}
}
+6 -5
View File
@@ -73,6 +73,7 @@ class UsersController extends Controller
'users.end_date',
'users.vip',
'users.autoassign_licenses',
'users.website',
])->with('manager', 'groups', 'userloc', 'company', 'department', 'assets', 'licenses', 'accessories', 'consumables', 'createdBy',)
->withCount('assets as assets_count', 'licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count');
@@ -122,6 +123,10 @@ class UsersController extends Controller
$users = $users->where('users.country', '=', $request->input('country'));
}
if ($request->filled('website')) {
$users = $users->where('users.website', '=', $request->input('website'));
}
if ($request->filled('zip')) {
$users = $users->where('users.zip', '=', $request->input('zip'));
}
@@ -254,6 +259,7 @@ class UsersController extends Controller
'start_date',
'end_date',
'autoassign_licenses',
'website',
];
$sort = in_array($request->get('sort'), $allowed_columns) ? $request->get('sort') : 'first_name';
@@ -274,11 +280,6 @@ class UsersController extends Controller
$offset = ($request->input('offset') > $users->count()) ? $users->count() : app('api_offset_value');
$limit = app('api_limit_value');
\Log::debug('Requested offset: '. $request->input('offset'));
\Log::debug('App offset: '. app('api_offset_value'));
\Log::debug('Actual offset: '. $offset);
\Log::debug('Limit: '. $limit);
$total = $users->count();
$users = $users->skip($offset)->take($limit)->get();
@@ -442,7 +442,6 @@ class AssetModelsController extends Controller
$del_count = 0;
foreach ($models as $model) {
\Log::debug($model->id);
if ($model->assets_count > 0) {
$del_error_count++;
@@ -452,8 +451,6 @@ class AssetModelsController extends Controller
}
}
\Log::debug($del_count);
\Log::debug($del_error_count);
if ($del_error_count == 0) {
return redirect()->route('models.index')
@@ -6,8 +6,10 @@ use App\Events\CheckoutableCheckedIn;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Requests\AssetCheckinRequest;
use App\Http\Traits\MigratesLegacyAssetLocations;
use App\Models\Asset;
use App\Models\CheckoutAcceptance;
use App\Models\LicenseSeat;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
@@ -15,6 +17,8 @@ use Illuminate\Support\Facades\View;
class AssetCheckinController extends Controller
{
use MigratesLegacyAssetLocations;
/**
* Returns a view that presents a form to check an asset back into inventory.
*
@@ -67,11 +71,9 @@ class AssetCheckinController extends Controller
}
$asset->expected_checkin = null;
$asset->last_checkout = null;
//$asset->last_checkout = null;
$asset->last_checkin = now();
$asset->assigned_to = null;
$asset->assignedTo()->disassociate($asset);
$asset->assigned_type = null;
$asset->accepted = null;
$asset->name = $request->get('name');
@@ -79,24 +81,7 @@ class AssetCheckinController extends Controller
$asset->status_id = e($request->get('status_id'));
}
// This is just meant to correct legacy issues where some user data would have 0
// as a location ID, which isn't valid. Later versions of Snipe-IT have stricter validation
// rules, so it's necessary to fix this for long-time users. It's kinda gross, but will help
// people (and their data) in the long run
if ($asset->rtd_location_id == '0') {
\Log::debug('Manually override the RTD location IDs');
\Log::debug('Original RTD Location ID: '.$asset->rtd_location_id);
$asset->rtd_location_id = '';
\Log::debug('New RTD Location ID: '.$asset->rtd_location_id);
}
if ($asset->location_id == '0') {
\Log::debug('Manually override the location IDs');
\Log::debug('Original Location ID: '.$asset->location_id);
$asset->location_id = '';
\Log::debug('New Location ID: '.$asset->location_id);
}
$this->migrateLegacyLocations($asset);
$asset->location_id = $asset->rtd_location_id;
@@ -117,12 +102,9 @@ class AssetCheckinController extends Controller
$checkin_at = $request->get('checkin_at');
}
if(!empty($asset->licenseseats->all())){
foreach ($asset->licenseseats as $seat){
$seat->assigned_to = null;
$seat->save();
}
}
$asset->licenseseats->each(function (LicenseSeat $seat) {
$seat->update(['assigned_to' => null]);
});
// Get all pending Acceptances for this asset and delete them
$acceptances = CheckoutAcceptance::pending()->whereHasMorph('checkoutable',
@@ -737,11 +737,11 @@ class AssetsController extends Controller
if ($isCheckinHeaderExplicit) {
//if checkin date header exists, assume that empty or future date is still checked out
//if checkin is before todays date, assume it's checked in and do not assign user ID, if checkin date is in the future or blank, this is the expected checkin date, items is checked out
// if checkin date header exists, assume that empty or future date is still checked out
// if checkin is before today's date, assume it's checked in and do not assign user ID, if checkin date is in the future or blank, this is the expected checkin date, items are checked out
if ((strtotime($checkin_date) > strtotime(Carbon::now())) || (empty($checkin_date))
) {
if ((strtotime($checkin_date) > strtotime(Carbon::now())) || (empty($checkin_date)))
{
//only do this if item is checked out
$asset->assigned_to = $user->id;
$asset->assigned_type = User::class;
@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
use App\Helpers\Helper;
use App\Models\Group;
use Illuminate\Http\Request;
use Auth;
/**
* This controller handles all actions related to User Groups for
@@ -63,6 +64,7 @@ class GroupsController extends Controller
$group = new Group();
$group->name = $request->input('name');
$group->permissions = json_encode($request->input('permission'));
$group->created_by = Auth::user()->id;
if ($group->save()) {
return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.create'));
+13
View File
@@ -6,6 +6,7 @@ use App\Models\Asset;
use App\Models\AssetModel;
use App\Models\Category;
use App\Models\Company;
use App\Models\CustomField;
use App\Models\Labels\Label;
use App\Models\Location;
use App\Models\Manufacturer;
@@ -65,6 +66,18 @@ class LabelsController extends Controller
$exampleAsset->model->category->id = 999999;
$exampleAsset->model->category->name = trans('admin/labels/table.example_category');
$customFieldColumns = CustomField::all()->pluck('db_column');
collect(explode(';', Setting::getSettings()->label2_fields))
->filter()
->each(function ($item) use ($customFieldColumns, $exampleAsset) {
$pair = explode('=', $item);
if ($customFieldColumns->contains($pair[1])) {
$exampleAsset->{$pair[1]} = "{{$pair[0]}}";
}
});
$settings = Setting::getSettings();
if (request()->has('settings')) {
$overrides = request()->get('settings');
@@ -99,6 +99,7 @@ class LicensesController extends Controller
$license->category_id = $request->input('category_id');
$license->termination_date = $request->input('termination_date');
$license->user_id = Auth::id();
$license->min_amt = $request->input('min_amt');
if ($license->save()) {
return redirect()->route('licenses.index')->with('success', trans('admin/licenses/message.create.success'));
@@ -176,6 +177,7 @@ class LicensesController extends Controller
$license->manufacturer_id = $request->input('manufacturer_id');
$license->supplier_id = $request->input('supplier_id');
$license->category_id = $request->input('category_id');
$license->min_amt = $request->input('min_amt');
if ($license->save()) {
return redirect()->route('licenses.show', ['license' => $licenseId])->with('success', trans('admin/licenses/message.update.success'));
@@ -245,12 +247,6 @@ class LicensesController extends Controller
$available_seats_count = $license->availCount()->count();
$checkedout_seats_count = ($total_seats_count - $available_seats_count);
\Log::debug('Total: '.$total_seats_count);
\Log::debug('Users: '.$users_count);
\Log::debug('Available: '.$available_seats_count);
\Log::debug('Checkedout: '.$checkedout_seats_count);
$this->authorize('view', $license);
return view('licenses.view', compact('license'))
->with('users_count', $users_count)
+91 -1
View File
@@ -8,6 +8,7 @@ use App\Models\Location;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\Request;
/**
* This controller handles all actions related to Locations for
@@ -238,7 +239,7 @@ class LocationsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $locationId
* @since [v6.0.14]
* @return View
* @return \Illuminate\Contracts\View\View
*/
public function getClone($locationId = null)
{
@@ -272,8 +273,97 @@ class LocationsController extends Controller
}
return redirect()->route('locations.index')->with('error', trans('admin/locations/message.does_not_exist'));
}
/**
* Returns a view that allows the user to bulk delete locations
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v6.3.1]
* @return \Illuminate\Contracts\View\View
*/
public function postBulkDelete(Request $request)
{
$locations_raw_array = $request->input('ids');
// Make sure some IDs have been selected
if ((is_array($locations_raw_array)) && (count($locations_raw_array) > 0)) {
$locations = Location::whereIn('id', $locations_raw_array)
->withCount('assignedAssets as assigned_assets_count')
->withCount('assets as assets_count')
->withCount('rtd_assets as rtd_assets_count')
->withCount('children as children_count')
->withCount('users as users_count')->get();
$valid_count = 0;
foreach ($locations as $location) {
if ($location->isDeletable()) {
$valid_count++;
}
}
return view('locations/bulk-delete', compact('locations'))->with('valid_count', $valid_count);
}
return redirect()->route('models.index')
->with('error', 'You must select at least one model to edit.');
}
/**
* Checks that locations can be deleted and deletes them if they can
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v6.3.1]
* @return \Illuminate\Http\RedirectResponse
*/
public function postBulkDeleteStore(Request $request) {
$locations_raw_array = $request->input('ids');
if ((is_array($locations_raw_array)) && (count($locations_raw_array) > 0)) {
$locations = Location::whereIn('id', $locations_raw_array)->get();
$success_count = 0;
$error_count = 0;
foreach ($locations as $location) {
// Can we delete this location?
if ($location->isDeletable()) {
$location->delete();
$success_count++;
} else {
$error_count++;
}
}
\Log::debug('Success count: '.$success_count);
\Log::debug('Error count: '.$error_count);
// Complete success
if ($success_count == count($locations_raw_array)) {
return redirect()
->route('locations.index')
->with('success', trans_choice('general.bulk.delete.success', $success_count,
['object_type' => trans_choice('general.location_plural', $success_count), 'count' => $success_count]
));
}
// Partial success
if ($error_count > 0) {
return redirect()
->route('locations.index')
->with('warning', trans('general.bulk.partial_success',
['success' => $success_count, 'error' => $error_count, 'object_type' => trans('general.locations')]
));
}
}
// Nothing was selected - return to the index
return redirect()
->route('locations.index')
->with('error', trans('general.bulk.nothing_selected',
['object_type' => trans('general.locations')]
));
}
}
+25 -15
View File
@@ -296,8 +296,8 @@ class ReportsController extends Controller
e($actionlog->itemType()),
($actionlog->itemType() == 'user') ? $actionlog->filename : $item_name,
($actionlog->item) ? $actionlog->item->serial : null,
($actionlog->item->model) ? htmlspecialchars($actionlog->item->model->name, ENT_NOQUOTES) : null,
($actionlog->item->model) ? $actionlog->item->model->model_number : null,
(($actionlog->item) && ($actionlog->item->model)) ? htmlspecialchars($actionlog->item->model->name, ENT_NOQUOTES) : null,
(($actionlog->item) && ($actionlog->item->model)) ? $actionlog->item->model->model_number : null,
$target_name,
($actionlog->note) ? e($actionlog->note) : '',
$actionlog->log_meta,
@@ -686,17 +686,23 @@ class ReportsController extends Controller
$assets->whereBetween('assets.created_at', [$created_start, $created_end]);
}
if (($request->filled('checkout_date_start')) && ($request->filled('checkout_date_end'))) {
$checkout_start = \Carbon::parse($request->input('checkout_date_start'))->startOfDay();
$checkout_end = \Carbon::parse($request->input('checkout_date_end'))->endOfDay();
$checkout_end = \Carbon::parse($request->input('checkout_date_end',now()))->endOfDay();
$assets->whereBetween('assets.last_checkout', [$checkout_start, $checkout_end]);
$actionlogassets = Actionlog::where('action_type','=', 'checkout')
->where('item_type', 'LIKE', '%Asset%',)
->whereBetween('action_date',[$checkout_start, $checkout_end])
->pluck('item_id');
$assets->whereIn('id',$actionlogassets);
}
if (($request->filled('checkin_date_start'))) {
$assets->whereBetween('last_checkin', [
Carbon::parse($request->input('checkin_date_start'))->startOfDay(),
// use today's date is `checkin_date_end` is not provided
// use today's date if `checkin_date_end` is not provided
Carbon::parse($request->input('checkin_date_end', now()))->endOfDay(),
]);
}
@@ -1156,16 +1162,20 @@ class ReportsController extends Controller
$logItem = $logItem_res[0];
}
if (!$assetItem->assignedTo->locale){
Notification::locale(Setting::getSettings()->locale)->send(
$assetItem->assignedTo,
new CheckoutAssetNotification($assetItem, $assetItem->assignedTo, $logItem->user, $acceptance, $logItem->note)
);
} else {
Notification::send(
$assetItem->assignedTo,
new CheckoutAssetNotification($assetItem, $assetItem->assignedTo, $logItem->user, $acceptance, $logItem->note)
);
// Only send notification if assigned
if ($assetItem->assignedTo) {
if (!$assetItem->assignedTo->locale) {
Notification::locale(Setting::getSettings()->locale)->send(
$assetItem->assignedTo,
new CheckoutAssetNotification($assetItem, $assetItem->assignedTo, $logItem->user, $acceptance, $logItem->note)
);
} else {
Notification::send(
$assetItem->assignedTo,
new CheckoutAssetNotification($assetItem, $assetItem->assignedTo, $logItem->user, $acceptance, $logItem->note)
);
}
}
return redirect()->route('reports/unaccepted_assets')->with('success', trans('admin/reports/general.reminder_sent'));
+30 -52
View File
@@ -422,68 +422,46 @@ class SettingsController extends Controller
// Only allow the site name and CSS to be changed if lock_passwords is false
// Because public demos make people act like dicks
if (! config('app.lock_passwords')) {
$setting->site_name = $request->input('site_name');
$setting->custom_css = $request->input('custom_css');
}
$setting = $request->handleImages($setting, 600, 'logo', '', 'logo');
$setting = $request->handleImages($setting, 600, 'logo', '', 'logo');
if ('1' == $request->input('clear_logo')) {
if ('1' == $request->input('clear_logo')) {
Storage::disk('public')->delete($setting->logo);
$setting->logo = null;
$setting->logo = null;
$setting->brand = 1;
}
$setting = $request->handleImages($setting, 600, 'email_logo', '', 'email_logo');
if ('1' == $request->input('clear_email_logo')) {
Storage::disk('public')->delete($setting->email_logo);
$setting->email_logo = null;
// If they are uploading an image, validate it and upload it
}
$setting = $request->handleImages($setting, 600, 'label_logo', '', 'label_logo');
if ('1' == $request->input('clear_label_logo')) {
Storage::disk('public')->delete($setting->label_logo);
$setting->label_logo = null;
}
// If the user wants to clear the favicon...
if ($request->hasFile('favicon')) {
$favicon_image = $favicon_upload = $request->file('favicon');
$favicon_ext = $favicon_image->getClientOriginalExtension();
$setting->favicon = $favicon_file_name = 'favicon-uploaded.'.$favicon_ext;
if (($favicon_image->getClientOriginalExtension() != 'ico') && ($favicon_image->getClientOriginalExtension() != 'svg')) {
$favicon_upload = Image::make($favicon_image->getRealPath())->resize(null, 36, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
});
// This requires a string instead of an object, so we use ($string)
Storage::disk('public')->put($favicon_file_name, (string) $favicon_upload->encode());
} else {
Storage::disk('public')->put($favicon_file_name, file_get_contents($request->file('favicon')));
}
// Remove Current image if exists
if (($setting->favicon) && (file_exists($favicon_file_name))) {
Storage::disk('public')->delete($favicon_file_name);
}
} elseif ('1' == $request->input('clear_favicon')) {
Storage::disk('public')->delete($setting->clear_favicon);
$setting->favicon = null;
$setting = $request->handleImages($setting, 600, 'email_logo', '', 'email_logo');
// If they are uploading an image, validate it and upload it
}
if ('1' == $request->input('clear_email_logo')) {
Storage::disk('public')->delete($setting->email_logo);
$setting->email_logo = null;
// If they are uploading an image, validate it and upload it
}
$setting = $request->handleImages($setting, 600, 'label_logo', '', 'label_logo');
if ('1' == $request->input('clear_label_logo')) {
Storage::disk('public')->delete($setting->label_logo);
$setting->label_logo = null;
}
$setting = $request->handleImages($setting, 600, 'favicon', '', 'favicon');
// If the user wants to clear the favicon...
if ('1' == $request->input('clear_favicon')) {
Storage::disk('public')->delete($setting->favicon);
$setting->favicon = null;
}
}
if ($setting->save()) {
return redirect()->route('settings.index')
+13 -4
View File
@@ -59,12 +59,21 @@ class Importer extends Component
'field_map' => 'array'
];
/**
* This is used in resources/views/livewire/importer.blade.php, and we kinda shouldn't need to check for
* activeFile here, but there's some UI goofiness that allows this to crash out on some imports.
*
* @return string
*/
public function generate_field_map()
{
\Log::debug("header row is: ".print_r($this->activeFile->header_row,true));
\Log::debug("Field map is: ".print_r($this->field_map,true));
$tmp = array_combine($this->activeFile->header_row, $this->field_map);
return json_encode(array_filter($tmp));
$tmp = array();
if ($this->activeFile) {
$tmp = array_combine($this->activeFile->header_row, $this->field_map);
$tmp = array_filter($tmp);
}
return json_encode($tmp);
}
+1 -1
View File
@@ -97,7 +97,7 @@ class ImageUploadRequest extends Request
if (!config('app.lock_passwords')) {
$ext = $image->getClientOriginalExtension();
$ext = $image->guessExtension();
$file_name = $type.'-'.$form_fieldname.'-'.$item->id.'-'.str_random(10).'.'.$ext;
\Log::info('File name will be: '.$file_name);
@@ -0,0 +1,33 @@
<?php
namespace App\Http\Traits;
use App\Models\Asset;
trait MigratesLegacyAssetLocations
{
/**
* This is just meant to correct legacy issues where some user data would have 0
* as a location ID, which isn't valid. Later versions of Snipe-IT have stricter validation
* rules, so it's necessary to fix this for long-time users. It's kinda gross, but will help
* people (and their data) in the long run
* @param Asset $asset
* @return void
*/
private function migrateLegacyLocations(Asset $asset): void
{
if ($asset->rtd_location_id == '0') {
\Log::debug('Manually override the RTD location IDs');
\Log::debug('Original RTD Location ID: ' . $asset->rtd_location_id);
$asset->rtd_location_id = '';
\Log::debug('New RTD Location ID: ' . $asset->rtd_location_id);
}
if ($asset->location_id == '0') {
\Log::debug('Manually override the location IDs');
\Log::debug('Original Location ID: ' . $asset->location_id);
$asset->location_id = '';
\Log::debug('New Location ID: ' . $asset->location_id);
}
}
}
@@ -37,6 +37,7 @@ class AssetsTransformer
'name'=> e($asset->model->name),
] : null,
'byod' => ($asset->byod ? true : false),
'requestable' => ($asset->requestable ? true : false),
'model_number' => (($asset->model) && ($asset->model->model_number)) ? e($asset->model->model_number) : null,
'eol' => (($asset->asset_eol_date != '') && ($asset->purchase_date != '')) ? Carbon::parse($asset->asset_eol_date)->diffInMonths($asset->purchase_date).' months' : null,
@@ -26,6 +26,7 @@ class GroupsTransformer
'name' => e($group->name),
'permissions' => json_decode($group->permissions),
'users_count' => (int) $group->users_count,
'created_by' => ($group->admin) ? e($group->admin->present()->fullName) : null,
'created_at' => Helper::getFormattedDateObject($group->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($group->updated_at, 'datetime'),
];
@@ -27,8 +27,8 @@ class LicensesTransformer
'company' => ($license->company) ? ['id' => (int) $license->company->id, 'name'=> e($license->company->name)] : null,
'manufacturer' => ($license->manufacturer) ? ['id' => (int) $license->manufacturer->id, 'name'=> e($license->manufacturer->name)] : null,
'product_key' => (Gate::allows('viewKeys', License::class)) ? e($license->serial) : '------------',
'order_number' => e($license->order_number),
'purchase_order' => e($license->purchase_order),
'order_number' => ($license->order_number) ? e($license->order_number) : null,
'purchase_order' => ($license->purchase_order) ? e($license->purchase_order) : null,
'purchase_date' => Helper::getFormattedDateObject($license->purchase_date, 'date'),
'termination_date' => Helper::getFormattedDateObject($license->termination_date, 'date'),
'depreciation' => ($license->depreciation) ? ['id' => (int) $license->depreciation->id,'name'=> e($license->depreciation->name)] : null,
@@ -38,8 +38,9 @@ class LicensesTransformer
'expiration_date' => Helper::getFormattedDateObject($license->expiration_date, 'date'),
'seats' => (int) $license->seats,
'free_seats_count' => (int) $license->free_seats_count,
'license_name' => e($license->license_name),
'license_email' => e($license->license_email),
'min_amt' => ($license->min_amt) ? (int) ($license->min_amt) : null,
'license_name' => ($license->license_name) ? e($license->license_name) : null,
'license_email' => ($license->license_email) ? e($license->license_email) : null,
'reassignable' => ($license->reassignable == 1) ? true : false,
'maintained' => ($license->maintained == 1) ? true : false,
'supplier' => ($license->supplier) ? ['id' => (int) $license->supplier->id, 'name'=> e($license->supplier->name)] : null,
@@ -65,6 +65,9 @@ class LocationsTransformer
$permissions_array['available_actions'] = [
'update' => Gate::allows('update', Location::class) ? true : false,
'delete' => $location->isDeletable(),
'bulk_selectable' => [
'delete' => $location->isDeletable()
],
'clone' => (Gate::allows('create', Location::class) && ($location->deleted_at == '')),
];
+12
View File
@@ -58,6 +58,18 @@ class Group extends SnipeModel
return $this->belongsToMany(\App\Models\User::class, 'users_groups');
}
/**
* Get the user that created the group
*
* @author A. Gianotto <snipe@snipe.net>
* @since [v6.3.0]
* @return \Illuminate\Database\Eloquent\Relations\Relation
*/
public function admin()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
}
/**
* Decode JSON permissions into array
*
+2
View File
@@ -53,6 +53,7 @@ class License extends Depreciable
'purchase_date' => 'date_format:Y-m-d|nullable|max:10',
'expiration_date' => 'date_format:Y-m-d|nullable|max:10',
'termination_date' => 'date_format:Y-m-d|nullable|max:10',
'min_amt' => 'numeric|nullable|gte:0',
];
/**
@@ -81,6 +82,7 @@ class License extends Depreciable
'supplier_id',
'termination_date',
'user_id',
'min_amt',
];
use Searchable;
+8 -4
View File
@@ -95,7 +95,10 @@ class Location extends SnipeModel
/**
* Determine whether or not this location can be deleted
* Determine whether or not this location can be deleted.
*
* This method requires the eager loading of the relationships in order to determine whether
* it can be deleted. It's tempting to load those here, but that increases the query load considerably.
*
* @author A. Gianotto <snipe@snipe.net>
* @since [v3.0]
@@ -104,9 +107,10 @@ class Location extends SnipeModel
public function isDeletable()
{
return Gate::allows('delete', $this)
&& ($this->assignedAssets()->count() === 0)
&& ($this->assets()->count() === 0)
&& ($this->users()->count() === 0);
&& ($this->assets_count === 0)
&& ($this->assigned_assets_count === 0)
&& ($this->children_count === 0)
&& ($this->users_count === 0);
}
/**
+2
View File
@@ -67,6 +67,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo
'gravatar',
'vip',
'autoassign_licenses',
'website',
];
protected $casts = [
@@ -120,6 +121,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo
'phone',
'jobtitle',
'employee_num',
'website',
];
/**
+8
View File
@@ -195,6 +195,14 @@ class AssetPresenter extends Presenter
'visible' => false,
'title' => trans('admin/hardware/form.warranty_expires'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'requestable',
'searchable' => false,
'sortable' => true,
'visible' => false,
'title' => trans('admin/hardware/general.requestable'),
'formatter' => 'trueFalseFormatter',
], [
'field' => 'notes',
'searchable' => true,
+8 -1
View File
@@ -89,7 +89,14 @@ class LicensePresenter extends Presenter
'searchable' => false,
'sortable' => true,
'title' => trans('admin/accessories/general.remaining'),
], [
],
[
'field' => 'min_amt',
'searchable' => false,
'sortable' => true,
'title' => trans('mail.min_QTY'),
'formatter' => 'minAmtFormatter',
],[
'field' => 'purchase_date',
'searchable' => true,
'sortable' => true,
+5 -1
View File
@@ -14,7 +14,11 @@ class LocationPresenter extends Presenter
public static function dataTableLayout()
{
$layout = [
[
'field' => 'bulk_selectable',
'checkbox' => true,
'formatter' => 'checkboxEnabledFormatter',
],
[
'field' => 'id',
'searchable' => false,
+9
View File
@@ -122,6 +122,15 @@ class UserPresenter extends Presenter
'visible' => true,
'formatter' => 'phoneFormatter',
],
[
'field' => 'website',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.website'),
'visible' => false,
'formatter' => 'externalLinkFormatter',
],
[
'field' => 'address',
'searchable' => true,
-12
View File
@@ -39,24 +39,12 @@ class SettingsServiceProvider extends ServiceProvider
$limit = abs($int_limit);
}
// \Log::debug('Max in env: '.config('app.max_results'));
// \Log::debug('Original requested limit: '.request('limit'));
// \Log::debug('Int limit: '.$int_limit);
// \Log::debug('Modified limit: '.$limit);
// \Log::debug('------------------------------');
return $limit;
});
// Make sure the offset is actually set and is an integer
\App::singleton('api_offset_value', function () {
$offset = intval(request('offset'));
// \Log::debug('Original requested offset: '.request('offset'));
// \Log::debug('Modified offset: '.$offset);
// \Log::debug('------------------------------');
return $offset;
});
+5 -16
View File
@@ -38,7 +38,7 @@ class Label implements View
$settings = $this->data->get('settings');
$assets = $this->data->get('assets');
$offset = $this->data->get('offset');
$template = $this->data->get('template');
$template = LabelModel::find($settings->label2_template);
// If disabled, pass to legacy view
if ((!$settings->label2_enable) && (!$template)) {
@@ -49,13 +49,6 @@ class Label implements View
->with('count', $this->data->get('count'));
}
// If a specific template was set, use it, otherwise fall back to default
if (empty($template)) {
$template = LabelModel::find($settings->label2_template);
} elseif (is_string($template)) {
$template = LabelModel::find($template);
}
$template->validate();
$pdf = new TCPDF(
@@ -90,13 +83,9 @@ class Label implements View
$assetData->put('id', $asset->id);
$assetData->put('tag', $asset->asset_tag);
if ($template->getSupportTitle()) {
if ($asset->company && !empty($settings->label2_title)) {
$title = str_replace('{COMPANY}', $asset->company->name, $settings->label2_title);
$settings->qr_text;
$assetData->put('title', $title);
}
if ($template->getSupportTitle() && !empty($settings->label2_title)) {
$title = str_replace('{COMPANY}', data_get($asset, 'company.name'), $settings->label2_title);
$assetData->put('title', $title);
}
if ($template->getSupportLogo()) {
@@ -216,4 +205,4 @@ class Label implements View
return self::NAME;
}
}
}
+2 -1
View File
@@ -77,7 +77,8 @@
"watson/validating": "^6.1"
},
"suggest": {
"ext-ldap": "*"
"ext-ldap": "*",
"ext-zip": "*"
},
"require-dev": {
"brianium/paratest": "^6.6",
Generated
+6 -6
View File
@@ -6701,16 +6701,16 @@
},
{
"name": "phenx/php-svg-lib",
"version": "0.5.1",
"version": "0.5.2",
"source": {
"type": "git",
"url": "https://github.com/dompdf/php-svg-lib.git",
"reference": "8a8a1ebcf6aea861ef30197999f096f7bd4b4456"
"reference": "732faa9fb4309221e2bd9b2fda5de44f947133aa"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/8a8a1ebcf6aea861ef30197999f096f7bd4b4456",
"reference": "8a8a1ebcf6aea861ef30197999f096f7bd4b4456",
"url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/732faa9fb4309221e2bd9b2fda5de44f947133aa",
"reference": "732faa9fb4309221e2bd9b2fda5de44f947133aa",
"shasum": ""
},
"require": {
@@ -6741,9 +6741,9 @@
"homepage": "https://github.com/PhenX/php-svg-lib",
"support": {
"issues": "https://github.com/dompdf/php-svg-lib/issues",
"source": "https://github.com/dompdf/php-svg-lib/tree/0.5.1"
"source": "https://github.com/dompdf/php-svg-lib/tree/0.5.2"
},
"time": "2023-12-11T20:56:08+00:00"
"time": "2024-02-07T12:49:40+00:00"
},
{
"name": "php-http/message-factory",
+1 -1
View File
@@ -199,7 +199,7 @@ return [
|
*/
'enable_csp' => env('ENABLE_CSP', false),
'enable_csp' => env('ENABLE_CSP', true),
/*
+5 -5
View File
@@ -1,10 +1,10 @@
<?php
return array (
'app_version' => 'v6.3.1',
'full_app_version' => 'v6.3.1 - build 12672-g00cea3eb3',
'build_version' => '12672',
'app_version' => 'v6.3.2',
'full_app_version' => 'v6.3.2 - build 12834-g9a5c1b812',
'build_version' => '12834',
'prerelease_version' => '',
'hash_version' => 'g00cea3eb3',
'full_hash' => 'v6.3.1-180-g00cea3eb3',
'hash_version' => 'g9a5c1b812',
'full_hash' => 'v6.3.2-160-g9a5c1b812',
'branch' => 'master',
);
+19 -4
View File
@@ -8,7 +8,6 @@ use App\Models\Location;
use App\Models\Statuslabel;
use App\Models\Supplier;
use App\Models\User;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Factories\Factory;
@@ -289,12 +288,13 @@ class AssetFactory extends Factory
});
}
public function assignedToUser()
public function assignedToUser(User $user = null)
{
return $this->state(function () {
return $this->state(function () use ($user) {
return [
'assigned_to' => User::factory(),
'assigned_to' => $user->id ?? User::factory(),
'assigned_type' => User::class,
'last_checkout' => now()->subDay(),
];
});
}
@@ -352,4 +352,19 @@ class AssetFactory extends Factory
{
return $this->state(['requestable' => false]);
}
/**
* This allows bypassing model level validation if you want to purposefully
* create an asset in an invalid state. Validation is turned back on
* after the model is created via the factory.
* @return AssetFactory
*/
public function canBeInvalidUponCreation()
{
return $this->afterMaking(function (Asset $asset) {
$asset->setValidating(false);
})->afterCreating(function (Asset $asset) {
$asset->setValidating(true);
});
}
}
+1 -1
View File
@@ -24,7 +24,7 @@ class DepartmentFactory extends Factory
public function definition()
{
return [
'name' => $this->faker->word() . ' Department',
'name' => $this->faker->unique()->word() . ' Department',
'user_id' => User::factory()->superuser(),
'location_id' => Location::factory(),
];
+10
View File
@@ -3,6 +3,7 @@
namespace Database\Factories;
use App\Models\License;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
class LicenseSeatFactory extends Factory
@@ -13,4 +14,13 @@ class LicenseSeatFactory extends Factory
'license_id' => License::factory(),
];
}
public function assignedToUser(User $user = null)
{
return $this->state(function () use ($user) {
return [
'assigned_to' => $user->id ?? User::factory(),
];
});
}
}
@@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddCreatedByToPermissionGroups extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('permission_groups', function (Blueprint $table) {
$table->integer('created_by')->nullable()->default(null);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('permission_groups', function (Blueprint $table) {
if (Schema::hasColumn('permission_groups', 'created_by')) {
$table->dropColumn('created_by');
}
});
}
}
@@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddMinQtyToLicenses extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('licenses', function (Blueprint $table) {
$table->integer('min_amt')->nullable()->default(null);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('licenses', function (Blueprint $table) {
if (Schema::hasColumn('licenses', 'min_amt')) {
$table->dropColumn('min_amt');
}
});
}
}
+10
View File
@@ -0,0 +1,10 @@
<?php
return array(
'personal_api_keys' => 'crwdns6798:0crwdne6798:0',
'api_key_warning' => 'crwdns6800:0crwdne6800:0',
'api_base_url' => 'crwdns6802:0crwdne6802:0',
'api_base_url_endpoint' => 'crwdns6804:0crwdne6804:0',
'api_token_expiration_time' => 'crwdns6806:0crwdne6806:0',
'api_reference' => 'crwdns6808:0crwdne6808:0',
);
@@ -0,0 +1,22 @@
<?php
return array(
'accessory_category' => 'crwdns1207:0crwdne1207:0',
'accessory_name' => 'crwdns1208:0crwdne1208:0',
'checkout' => 'crwdns1604:0crwdne1604:0',
'checkin' => 'crwdns1605:0crwdne1605:0',
'create' => 'crwdns1385:0crwdne1385:0',
'edit' => 'crwdns1606:0crwdne1606:0',
'eula_text' => 'crwdns1210:0crwdne1210:0',
'eula_text_help' => 'crwdns1211:0crwdne1211:0',
'require_acceptance' => 'crwdns1212:0crwdne1212:0',
'no_default_eula' => 'crwdns1213:0crwdne1213:0',
'total' => 'crwdns1215:0crwdne1215:0',
'remaining' => 'crwdns1216:0crwdne1216:0',
'update' => 'crwdns1386:0crwdne1386:0',
'use_default_eula' => 'crwdns1218:0crwdne1218:0',
'use_default_eula_disabled' => 'crwdns1219:0crwdne1219:0',
'clone' => 'crwdns11443:0crwdne11443:0',
'delete_disabled' => 'crwdns11597:0crwdne11597:0',
);
@@ -0,0 +1,39 @@
<?php
return array(
'does_not_exist' => 'crwdns5810:0crwdne5810:0',
'not_found' => 'crwdns11848:0crwdne11848:0',
'assoc_users' => 'crwdns1221:0crwdne1221:0',
'create' => array(
'error' => 'crwdns1468:0crwdne1468:0',
'success' => 'crwdns1469:0crwdne1469:0'
),
'update' => array(
'error' => 'crwdns1470:0crwdne1470:0',
'success' => 'crwdns1471:0crwdne1471:0'
),
'delete' => array(
'confirm' => 'crwdns1607:0crwdne1607:0',
'error' => 'crwdns1608:0crwdne1608:0',
'success' => 'crwdns1609:0crwdne1609:0'
),
'checkout' => array(
'error' => 'crwdns1229:0crwdne1229:0',
'success' => 'crwdns1230:0crwdne1230:0',
'unavailable' => 'crwdns11523:0crwdne11523:0',
'user_does_not_exist' => 'crwdns1231:0crwdne1231:0'
),
'checkin' => array(
'error' => 'crwdns1232:0crwdne1232:0',
'success' => 'crwdns1233:0crwdne1233:0',
'user_does_not_exist' => 'crwdns1234:0crwdne1234:0'
)
);
@@ -0,0 +1,11 @@
<?php
return array(
'dl_csv' => 'crwdns1421:0crwdne1421:0',
'eula_text' => 'crwdns1235:0crwdne1235:0',
'id' => 'crwdns1236:0crwdne1236:0',
'require_acceptance' => 'crwdns1237:0crwdne1237:0',
'title' => 'crwdns1238:0crwdne1238:0',
);
@@ -0,0 +1,14 @@
<?php
return [
'asset_maintenance_type' => 'crwdns11333:0crwdne11333:0',
'title' => 'crwdns1354:0crwdne1354:0',
'start_date' => 'crwdns11335:0crwdne11335:0',
'completion_date' => 'crwdns11337:0crwdne11337:0',
'cost' => 'crwdns1357:0crwdne1357:0',
'is_warranty' => 'crwdns1358:0crwdne1358:0',
'asset_maintenance_time' => 'crwdns11339:0crwdne11339:0',
'notes' => 'crwdns1360:0crwdne1360:0',
'update' => 'crwdns11341:0crwdne11341:0',
'create' => 'crwdns11343:0crwdne11343:0'
];
@@ -0,0 +1,16 @@
<?php
return [
'asset_maintenances' => 'crwdns1363:0crwdne1363:0',
'edit' => 'crwdns1364:0crwdne1364:0',
'delete' => 'crwdns1365:0crwdne1365:0',
'view' => 'crwdns1366:0crwdne1366:0',
'repair' => 'crwdns1367:0crwdne1367:0',
'maintenance' => 'crwdns1368:0crwdne1368:0',
'upgrade' => 'crwdns1369:0crwdne1369:0',
'calibration' => 'crwdns5812:0crwdne5812:0',
'software_support' => 'crwdns5814:0crwdne5814:0',
'hardware_support' => 'crwdns5816:0crwdne5816:0',
'configuration_change' => 'crwdns10530:0crwdne10530:0',
'pat_test' => 'crwdns10532:0crwdne10532:0',
];
@@ -0,0 +1,21 @@
<?php
return [
'not_found' => 'crwdns1370:0crwdne1370:0',
'delete' => [
'confirm' => 'crwdns1371:0crwdne1371:0',
'error' => 'crwdns1372:0crwdne1372:0',
'success' => 'crwdns1373:0crwdne1373:0',
],
'create' => [
'error' => 'crwdns1374:0crwdne1374:0',
'success' => 'crwdns1375:0crwdne1375:0',
],
'edit' => [
'error' => 'crwdns1903:0crwdne1903:0',
'success' => 'crwdns1904:0crwdne1904:0',
],
'asset_maintenance_incomplete' => 'crwdns1376:0crwdne1376:0',
'warranty' => 'crwdns1377:0crwdne1377:0',
'not_warranty' => 'crwdns1378:0crwdne1378:0',
];
@@ -0,0 +1,8 @@
<?php
return [
'title' => 'crwdns1379:0crwdne1379:0',
'asset_name' => 'crwdns1794:0crwdne1794:0',
'is_warranty' => 'crwdns1382:0crwdne1382:0',
'dl_csv' => 'crwdns1383:0crwdne1383:0',
];
@@ -0,0 +1,25 @@
<?php
return array(
'asset_categories' => 'crwdns636:0crwdne636:0',
'category_name' => 'crwdns637:0crwdne637:0',
'checkin_email' => 'crwdns2034:0crwdne2034:0',
'checkin_email_notification' => 'crwdns2035:0crwdne2035:0',
'clone' => 'crwdns1239:0crwdne1239:0',
'create' => 'crwdns638:0crwdne638:0',
'edit' => 'crwdns1240:0crwdne1240:0',
'email_will_be_sent_due_to_global_eula' => 'crwdns11697:0crwdne11697:0',
'email_will_be_sent_due_to_category_eula' => 'crwdns11699:0crwdne11699:0',
'eula_text' => 'crwdns1241:0crwdne1241:0',
'eula_text_help' => 'crwdns1242:0crwdne1242:0',
'name' => 'crwdns1835:0crwdne1835:0',
'require_acceptance' => 'crwdns1243:0crwdne1243:0',
'required_acceptance' => 'crwdns1244:0crwdne1244:0',
'required_eula' => 'crwdns1245:0crwdne1245:0',
'no_default_eula' => 'crwdns1246:0crwdne1246:0',
'update' => 'crwdns639:0crwdne639:0',
'use_default_eula' => 'crwdns1247:0crwdne1247:0',
'use_default_eula_disabled' => 'crwdns1248:0crwdne1248:0',
'use_default_eula_column' => 'crwdns6083:0crwdne6083:0',
);
@@ -0,0 +1,26 @@
<?php
return array(
'does_not_exist' => 'crwdns625:0crwdne625:0',
'assoc_models' => 'crwdns1621:0crwdne1621:0',
'assoc_items' => 'crwdns1622:0crwdne1622:0',
'create' => array(
'error' => 'crwdns627:0crwdne627:0',
'success' => 'crwdns628:0crwdne628:0'
),
'update' => array(
'error' => 'crwdns629:0crwdne629:0',
'success' => 'crwdns630:0crwdne630:0',
'cannot_change_category_type' => 'crwdns11215:0crwdne11215:0',
),
'delete' => array(
'confirm' => 'crwdns631:0crwdne631:0',
'error' => 'crwdns632:0crwdne632:0',
'success' => 'crwdns633:0crwdne633:0'
)
);
@@ -0,0 +1,10 @@
<?php
return array(
'eula_text' => 'crwdns1249:0crwdne1249:0',
'id' => 'crwdns622:0crwdne622:0',
'parent' => 'crwdns623:0crwdne623:0',
'require_acceptance' => 'crwdns1250:0crwdne1250:0',
'title' => 'crwdns624:0crwdne624:0',
);
@@ -0,0 +1,7 @@
<?php
return [
'select_company' => 'crwdns1524:0crwdne1524:0',
'about_companies' => 'crwdns6497:0crwdne6497:0',
'about_companies_description' => 'crwdns6499:0crwdne6499:0',
];
@@ -0,0 +1,20 @@
<?php
return [
'does_not_exist' => 'crwdns1525:0crwdne1525:0',
'deleted' => 'crwdns11791:0crwdne11791:0',
'assoc_users' => 'crwdns1526:0crwdne1526:0',
'create' => [
'error' => 'crwdns1527:0crwdne1527:0',
'success' => 'crwdns1528:0crwdne1528:0',
],
'update' => [
'error' => 'crwdns1529:0crwdne1529:0',
'success' => 'crwdns1530:0crwdne1530:0',
],
'delete' => [
'confirm' => 'crwdns1531:0crwdne1531:0',
'error' => 'crwdns1532:0crwdne1532:0',
'success' => 'crwdns1533:0crwdne1533:0',
],
];
@@ -0,0 +1,11 @@
<?php
return array(
'companies' => 'crwdns1534:0crwdne1534:0',
'create' => 'crwdns1535:0crwdne1535:0',
'email' => 'crwdns12044:0crwdne12044:0',
'title' => 'crwdns1536:0crwdne1536:0',
'phone' => 'crwdns12046:0crwdne12046:0',
'update' => 'crwdns1537:0crwdne1537:0',
'name' => 'crwdns1538:0crwdne1538:0',
'id' => 'crwdns1539:0crwdne1539:0',
);
@@ -0,0 +1,16 @@
<?php
return array(
'component_name' => 'crwdns1544:0crwdne1544:0',
'checkin' => 'crwdns1545:0crwdne1545:0',
'checkout' => 'crwdns1546:0crwdne1546:0',
'cost' => 'crwdns1547:0crwdne1547:0',
'create' => 'crwdns1548:0crwdne1548:0',
'edit' => 'crwdns1549:0crwdne1549:0',
'date' => 'crwdns1550:0crwdne1550:0',
'order' => 'crwdns1551:0crwdne1551:0',
'remaining' => 'crwdns1552:0crwdne1552:0',
'total' => 'crwdns1553:0crwdne1553:0',
'update' => 'crwdns1554:0crwdne1554:0',
'checkin_limit' => 'crwdns11217:0crwdne11217:0'
);
@@ -0,0 +1,37 @@
<?php
return array(
'does_not_exist' => 'crwdns1555:0crwdne1555:0',
'create' => array(
'error' => 'crwdns1556:0crwdne1556:0',
'success' => 'crwdns1557:0crwdne1557:0'
),
'update' => array(
'error' => 'crwdns1558:0crwdne1558:0',
'success' => 'crwdns1559:0crwdne1559:0'
),
'delete' => array(
'confirm' => 'crwdns1560:0crwdne1560:0',
'error' => 'crwdns1561:0crwdne1561:0',
'success' => 'crwdns1562:0crwdne1562:0'
),
'checkout' => array(
'error' => 'crwdns1563:0crwdne1563:0',
'success' => 'crwdns1564:0crwdne1564:0',
'user_does_not_exist' => 'crwdns1565:0crwdne1565:0',
'unavailable' => 'crwdns11529:0crwdne11529:0',
),
'checkin' => array(
'error' => 'crwdns1566:0crwdne1566:0',
'success' => 'crwdns1567:0crwdne1567:0',
'user_does_not_exist' => 'crwdns1568:0crwdne1568:0'
)
);
@@ -0,0 +1,5 @@
<?php
return array(
'title' => 'crwdns1569:0crwdne1569:0',
);
@@ -0,0 +1,11 @@
<?php
return array(
'checkout' => 'crwdns1770:0crwdne1770:0',
'consumable_name' => 'crwdns1396:0crwdne1396:0',
'create' => 'crwdns1397:0crwdne1397:0',
'item_no' => 'crwdns1618:0crwdne1618:0',
'remaining' => 'crwdns1307:0crwdne1307:0',
'total' => 'crwdns1308:0crwdne1308:0',
'update' => 'crwdns1398:0crwdne1398:0',
);
@@ -0,0 +1,37 @@
<?php
return array(
'does_not_exist' => 'crwdns1309:0crwdne1309:0',
'create' => array(
'error' => 'crwdns1310:0crwdne1310:0',
'success' => 'crwdns1311:0crwdne1311:0'
),
'update' => array(
'error' => 'crwdns1312:0crwdne1312:0',
'success' => 'crwdns1313:0crwdne1313:0'
),
'delete' => array(
'confirm' => 'crwdns1428:0crwdne1428:0',
'error' => 'crwdns1315:0crwdne1315:0',
'success' => 'crwdns1429:0crwdne1429:0'
),
'checkout' => array(
'error' => 'crwdns1317:0crwdne1317:0',
'success' => 'crwdns1318:0crwdne1318:0',
'user_does_not_exist' => 'crwdns1319:0crwdne1319:0',
'unavailable' => 'crwdns11527:0crwdne11527:0',
),
'checkin' => array(
'error' => 'crwdns1320:0crwdne1320:0',
'success' => 'crwdns1321:0crwdne1321:0',
'user_does_not_exist' => 'crwdns1322:0crwdne1322:0'
)
);
@@ -0,0 +1,5 @@
<?php
return array(
'title' => 'crwdns1323:0crwdne1323:0',
);
@@ -0,0 +1,61 @@
<?php
return [
'custom_fields' => 'crwdns1486:0crwdne1486:0',
'manage' => 'crwdns6501:0crwdne6501:0',
'field' => 'crwdns1487:0crwdne1487:0',
'about_fieldsets_title' => 'crwdns1488:0crwdne1488:0',
'about_fieldsets_text' => 'crwdns6503:0crwdne6503:0',
'custom_format' => 'crwdns6505:0crwdne6505:0',
'encrypt_field' => 'crwdns1792:0crwdne1792:0',
'encrypt_field_help' => 'crwdns1683:0crwdne1683:0',
'encrypted' => 'crwdns1695:0crwdne1695:0',
'fieldset' => 'crwdns1490:0crwdne1490:0',
'qty_fields' => 'crwdns1491:0crwdne1491:0',
'fieldsets' => 'crwdns1492:0crwdne1492:0',
'fieldset_name' => 'crwdns1493:0crwdne1493:0',
'field_name' => 'crwdns1494:0crwdne1494:0',
'field_values' => 'crwdns1684:0crwdne1684:0',
'field_values_help' => 'crwdns1793:0crwdne1793:0',
'field_element' => 'crwdns1495:0crwdne1495:0',
'field_element_short' => 'crwdns1496:0crwdne1496:0',
'field_format' => 'crwdns1497:0crwdne1497:0',
'field_custom_format' => 'crwdns1498:0crwdne1498:0',
'field_custom_format_help' => 'crwdns1971:0{15}crwdne1971:0',
'required' => 'crwdns1499:0crwdne1499:0',
'req' => 'crwdns1500:0crwdne1500:0',
'used_by_models' => 'crwdns1501:0crwdne1501:0',
'order' => 'crwdns1502:0crwdne1502:0',
'create_fieldset' => 'crwdns1503:0crwdne1503:0',
'update_fieldset' => 'crwdns11219:0crwdne11219:0',
'fieldset_does_not_exist' => 'crwdns11221:0crwdne11221:0',
'fieldset_updated' => 'crwdns11223:0crwdne11223:0',
'create_fieldset_title' => 'crwdns6507:0crwdne6507:0',
'create_field' => 'crwdns1504:0crwdne1504:0',
'create_field_title' => 'crwdns6509:0crwdne6509:0',
'value_encrypted' => 'crwdns1696:0crwdne1696:0',
'show_in_email' => 'crwdns11854:0crwdne11854:0',
'show_in_email_short' => 'crwdns11856:0crwdne11856:0',
'help_text' => 'crwdns6511:0crwdne6511:0',
'help_text_description' => 'crwdns6513:0crwdne6513:0',
'about_custom_fields_title' => 'crwdns6515:0crwdne6515:0',
'about_custom_fields_text' => 'crwdns6517:0crwdne6517:0',
'add_field_to_fieldset' => 'crwdns6519:0crwdne6519:0',
'make_optional' => 'crwdns6521:0crwdne6521:0',
'make_required' => 'crwdns6523:0crwdne6523:0',
'reorder' => 'crwdns6525:0crwdne6525:0',
'db_field' => 'crwdns6527:0crwdne6527:0',
'db_convert_warning' => 'crwdns10494:0crwdne10494:0',
'is_unique' => 'crwdns6766:0crwdne6766:0',
'unique' => 'crwdns6768:0crwdne6768:0',
'display_in_user_view' => 'crwdns11207:0crwdne11207:0',
'display_in_user_view_table' => 'crwdns11209:0crwdne11209:0',
'auto_add_to_fieldsets' => 'crwdns11593:0crwdne11593:0',
'add_to_preexisting_fieldsets' => 'crwdns11595:0crwdne11595:0',
'show_in_listview' => 'crwdns11858:0crwdne11858:0',
'show_in_listview_short' => 'crwdns11689:0crwdne11689:0',
'show_in_requestable_list_short' => 'crwdns11860:0crwdne11860:0',
'show_in_requestable_list' => 'crwdns11862:0crwdne11862:0',
'encrypted_options' => 'crwdns11864:0crwdne11864:0',
];
@@ -0,0 +1,63 @@
<?php
return array(
'field' => array(
'invalid' => 'crwdns1505:0crwdne1505:0',
'already_added' => 'crwdns1506:0crwdne1506:0',
'create' => array(
'error' => 'crwdns1507:0crwdne1507:0',
'success' => 'crwdns1508:0crwdne1508:0',
'assoc_success' => 'crwdns1509:0crwdne1509:0'
),
'update' => array(
'error' => 'crwdns1510:0crwdne1510:0',
'success' => 'crwdns1511:0crwdne1511:0'
),
'delete' => array(
'confirm' => 'crwdns1512:0crwdne1512:0',
'error' => 'crwdns1513:0crwdne1513:0',
'success' => 'crwdns1514:0crwdne1514:0',
'in_use' => 'crwdns1515:0crwdne1515:0',
)
),
'fieldset' => array(
'does_not_exist' => 'crwdns1900:0crwdne1900:0',
'create' => array(
'error' => 'crwdns1516:0crwdne1516:0',
'success' => 'crwdns1517:0crwdne1517:0'
),
'update' => array(
'error' => 'crwdns1518:0crwdne1518:0',
'success' => 'crwdns1519:0crwdne1519:0'
),
'delete' => array(
'confirm' => 'crwdns1520:0crwdne1520:0',
'error' => 'crwdns1521:0crwdne1521:0',
'success' => 'crwdns1522:0crwdne1522:0',
'in_use' => 'crwdns1523:0crwdne1523:0',
)
),
'fieldset_default_value' => array(
'error' => 'crwdns10496:0crwdne10496:0',
),
);
@@ -0,0 +1,22 @@
<?php
return array(
'does_not_exist' => 'crwdns1861:0crwdne1861:0',
'department_already_exists' => 'crwdns11211:0crwdne11211:0',
'assoc_users' => 'crwdns1862:0crwdne1862:0',
'create' => array(
'error' => 'crwdns1863:0crwdne1863:0',
'success' => 'crwdns1864:0crwdne1864:0'
),
'update' => array(
'error' => 'crwdns1865:0crwdne1865:0',
'success' => 'crwdns1866:0crwdne1866:0'
),
'delete' => array(
'confirm' => 'crwdns1867:0crwdne1867:0',
'error' => 'crwdns1868:0crwdne1868:0',
'success' => 'crwdns1869:0crwdne1869:0'
)
);
@@ -0,0 +1,11 @@
<?php
return array(
'id' => 'crwdns1870:0crwdne1870:0',
'name' => 'crwdns1871:0crwdne1871:0',
'manager' => 'crwdns1872:0crwdne1872:0',
'location' => 'crwdns1873:0crwdne1873:0',
'create' => 'crwdns1874:0crwdne1874:0',
'update' => 'crwdns1875:0crwdne1875:0',
);
@@ -0,0 +1,14 @@
<?php
return [
'about_asset_depreciations' => 'crwdns819:0crwdne819:0',
'about_depreciations' => 'crwdns820:0crwdne820:0',
'asset_depreciations' => 'crwdns821:0crwdne821:0',
'create' => 'crwdns1799:0crwdne1799:0',
'depreciation_name' => 'crwdns823:0crwdne823:0',
'depreciation_min' => 'crwdns6531:0crwdne6531:0',
'number_of_months' => 'crwdns824:0crwdne824:0',
'update' => 'crwdns1800:0crwdne1800:0',
'depreciation_min' => 'crwdns6071:0crwdne6071:0',
'no_depreciations_warning' => 'crwdns6533:0crwdne6533:0',
];
@@ -0,0 +1,25 @@
<?php
return array(
'does_not_exist' => 'crwdns810:0crwdne810:0',
'assoc_users' => 'crwdns811:0crwdne811:0',
'create' => array(
'error' => 'crwdns812:0crwdne812:0',
'success' => 'crwdns813:0crwdne813:0'
),
'update' => array(
'error' => 'crwdns814:0crwdne814:0',
'success' => 'crwdns815:0crwdne815:0'
),
'delete' => array(
'confirm' => 'crwdns816:0crwdne816:0',
'error' => 'crwdns817:0crwdne817:0',
'success' => 'crwdns818:0crwdne818:0'
)
);
@@ -0,0 +1,11 @@
<?php
return [
'id' => 'crwdns806:0crwdne806:0',
'months' => 'crwdns807:0crwdne807:0',
'term' => 'crwdns808:0crwdne808:0',
'title' => 'crwdns809:0crwdne809:0',
'depreciation_min' => 'crwdns6535:0crwdne6535:0',
];
@@ -0,0 +1,22 @@
<?php
return array(
'group_exists' => 'crwdns880:0crwdne880:0',
'group_not_found' => 'crwdns11491:0crwdne11491:0',
'group_name_required' => 'crwdns882:0crwdne882:0',
'success' => array(
'create' => 'crwdns883:0crwdne883:0',
'update' => 'crwdns884:0crwdne884:0',
'delete' => 'crwdns885:0crwdne885:0',
),
'delete' => array(
'confirm' => 'crwdns886:0crwdne886:0',
'create' => 'crwdns887:0crwdne887:0',
'update' => 'crwdns888:0crwdne888:0',
'delete' => 'crwdns889:0crwdne889:0',
),
);
@@ -0,0 +1,9 @@
<?php
return array(
'id' => 'crwdns877:0crwdne877:0',
'name' => 'crwdns878:0crwdne878:0',
'users' => 'crwdns879:0crwdne879:0',
);
@@ -0,0 +1,16 @@
<?php
return [
'about_groups_title' => 'crwdns1801:0crwdne1801:0',
'about_groups' => 'crwdns1802:0crwdne1802:0',
'group_management' => 'crwdns870:0crwdne870:0',
'create' => 'crwdns1803:0crwdne1803:0',
'update' => 'crwdns1804:0crwdne1804:0',
'group_name' => 'crwdns873:0crwdne873:0',
'group_admin' => 'crwdns874:0crwdne874:0',
'allow' => 'crwdns875:0crwdne875:0',
'deny' => 'crwdns876:0crwdne876:0',
'permission' => 'crwdns6537:0crwdne6537:0',
'grant' => 'crwdns6539:0crwdne6539:0',
'no_permissions' => 'crwdns6541:0crwdne6541:0'
];
@@ -0,0 +1,59 @@
<?php
return [
'bulk_delete' => 'crwdns1805:0crwdne1805:0',
'bulk_restore' => 'crwdns11501:0crwdne11501:0',
'bulk_delete_help' => 'crwdns1481:0crwdne1481:0',
'bulk_restore_help' => 'crwdns11503:0crwdne11503:0',
'bulk_delete_warn' => 'crwdns1482:0crwdne1482:0',
'bulk_restore_warn' => 'crwdns11505:0crwdne11505:0',
'bulk_update' => 'crwdns1183:0crwdne1183:0',
'bulk_update_help' => 'crwdns1184:0crwdne1184:0',
'bulk_update_warn' => 'crwdns10558:0crwdne10558:0',
'bulk_update_with_custom_field' => 'crwdns11773:0crwdne11773:0',
'bulk_update_model_prefix' => 'crwdns11775:0crwdne11775:0',
'bulk_update_custom_field_unique' => 'crwdns11777:0crwdne11777:0',
'checkedout_to' => 'crwdns695:0crwdne695:0',
'checkout_date' => 'crwdns1263:0crwdne1263:0',
'checkin_date' => 'crwdns1264:0crwdne1264:0',
'checkout_to' => 'crwdns696:0crwdne696:0',
'cost' => 'crwdns697:0crwdne697:0',
'create' => 'crwdns698:0crwdne698:0',
'date' => 'crwdns699:0crwdne699:0',
'depreciation' => 'crwdns1951:0crwdne1951:0',
'depreciates_on' => 'crwdns700:0crwdne700:0',
'default_location' => 'crwdns702:0crwdne702:0',
'default_location_phone' => 'crwdns12050:0crwdne12050:0',
'eol_date' => 'crwdns703:0crwdne703:0',
'eol_rate' => 'crwdns704:0crwdne704:0',
'expected_checkin' => 'crwdns1393:0crwdne1393:0',
'expires' => 'crwdns705:0crwdne705:0',
'fully_depreciated' => 'crwdns706:0crwdne706:0',
'help_checkout' => 'crwdns1394:0crwdne1394:0',
'mac_address' => 'crwdns1179:0crwdne1179:0',
'manufacturer' => 'crwdns708:0crwdne708:0',
'model' => 'crwdns709:0crwdne709:0',
'months' => 'crwdns710:0crwdne710:0',
'name' => 'crwdns711:0crwdne711:0',
'notes' => 'crwdns712:0crwdne712:0',
'order' => 'crwdns713:0crwdne713:0',
'qr' => 'crwdns714:0crwdne714:0',
'requestable' => 'crwdns715:0crwdne715:0',
'select_statustype' => 'crwdns1167:0crwdne1167:0',
'serial' => 'crwdns716:0crwdne716:0',
'status' => 'crwdns717:0crwdne717:0',
'tag' => 'crwdns719:0crwdne719:0',
'update' => 'crwdns720:0crwdne720:0',
'warranty' => 'crwdns721:0crwdne721:0',
'warranty_expires' => 'crwdns1986:0crwdne1986:0',
'years' => 'crwdns722:0crwdne722:0',
'asset_location' => 'crwdns6543:0crwdne6543:0',
'asset_location_update_default_current' => 'crwdns6545:0crwdne6545:0',
'asset_location_update_default' => 'crwdns6547:0crwdne6547:0',
'asset_location_update_actual' => 'crwdns11852:0crwdne11852:0',
'asset_not_deployable' => 'crwdns6549:0crwdne6549:0',
'asset_deployable' => 'crwdns6551:0crwdne6551:0',
'processing_spinner' => 'crwdns11515:0crwdne11515:0',
'optional_infos' => 'crwdns10490:0crwdne10490:0',
'order_details' => 'crwdns10492:0crwdne10492:0'
];
@@ -0,0 +1,42 @@
<?php
return [
'about_assets_title' => 'crwdns1806:0crwdne1806:0',
'about_assets_text' => 'crwdns1807:0crwdne1807:0',
'archived' => 'crwdns1168:0crwdne1168:0',
'asset' => 'crwdns755:0crwdne755:0',
'bulk_checkout' => 'crwdns2023:0crwdne2023:0',
'bulk_checkin' => 'crwdns6770:0crwdne6770:0',
'checkin' => 'crwdns756:0crwdne756:0',
'checkout' => 'crwdns1905:0crwdne1905:0',
'clone' => 'crwdns758:0crwdne758:0',
'deployable' => 'crwdns1169:0crwdne1169:0',
'deleted' => 'crwdns6079:0crwdne6079:0',
'delete_confirm' => 'crwdns11695:0crwdne11695:0',
'edit' => 'crwdns759:0crwdne759:0',
'model_deleted' => 'crwdns6081:0crwdne6081:0',
'model_invalid' => 'crwdns11225:0crwdne11225:0',
'model_invalid_fix' => 'crwdns11227:0crwdne11227:0',
'requestable' => 'crwdns1177:0crwdne1177:0',
'requested' => 'crwdns1697:0crwdne1697:0',
'not_requestable' => 'crwdns6555:0crwdne6555:0',
'requestable_status_warning' => 'crwdns11681:0crwdne11681:0',
'restore' => 'crwdns1178:0crwdne1178:0',
'pending' => 'crwdns1170:0crwdne1170:0',
'undeployable' => 'crwdns1171:0crwdne1171:0',
'undeployable_tooltip' => 'crwdns11579:0crwdne11579:0',
'view' => 'crwdns761:0crwdne761:0',
'csv_error' => 'crwdns6559:0crwdne6559:0',
'import_text' => 'crwdns12112:0crwdne12112:0',
'csv_import_match_f-l' => 'crwdns12114:0crwdne12114:0',
'csv_import_match_initial_last' => 'crwdns12116:0crwdne12116:0',
'csv_import_match_first' => 'crwdns12118:0crwdne12118:0',
'csv_import_match_email' => 'crwdns12120:0crwdne12120:0',
'csv_import_match_username' => 'crwdns12122:0crwdne12122:0',
'error_messages' => 'crwdns6573:0crwdne6573:0',
'success_messages' => 'crwdns6575:0crwdne6575:0',
'alert_details' => 'crwdns6577:0crwdne6577:0',
'custom_export' => 'crwdns6579:0crwdne6579:0',
'mfg_warranty_lookup' => 'crwdns11481:0crwdne11481:0',
'user_department' => 'crwdns11685:0crwdne11685:0',
];
@@ -0,0 +1,89 @@
<?php
return [
'undeployable' => 'crwdns1173:0crwdne1173:0',
'does_not_exist' => 'crwdns740:0crwdne740:0',
'does_not_exist_or_not_requestable' => 'crwdns6581:0crwdne6581:0',
'assoc_users' => 'crwdns741:0crwdne741:0',
'create' => [
'error' => 'crwdns742:0crwdne742:0',
'success' => 'crwdns743:0crwdne743:0',
'success_linked' => 'crwdns11882:0crwdne11882:0',
],
'update' => [
'error' => 'crwdns744:0crwdne744:0',
'success' => 'crwdns745:0crwdne745:0',
'nothing_updated' => 'crwdns1186:0crwdne1186:0',
'no_assets_selected' => 'crwdns6810:0crwdne6810:0',
],
'restore' => [
'error' => 'crwdns1174:0crwdne1174:0',
'success' => 'crwdns1175:0crwdne1175:0',
'bulk_success' => 'crwdns11497:0crwdne11497:0',
'nothing_updated' => 'crwdns11499:0crwdne11499:0',
],
'audit' => [
'error' => 'crwdns1906:0crwdne1906:0',
'success' => 'crwdns1907:0crwdne1907:0',
],
'deletefile' => [
'error' => 'crwdns1187:0crwdne1187:0',
'success' => 'crwdns1188:0crwdne1188:0',
],
'upload' => [
'error' => 'crwdns1189:0crwdne1189:0',
'success' => 'crwdns1190:0crwdne1190:0',
'nofiles' => 'crwdns1401:0crwdne1401:0',
'invalidfiles' => 'crwdns1192:0crwdne1192:0',
],
'import' => [
'error' => 'crwdns1688:0crwdne1688:0',
'errorDetail' => 'crwdns1689:0crwdne1689:0',
'success' => 'crwdns1690:0crwdne1690:0',
'file_delete_success' => 'crwdns1698:0crwdne1698:0',
'file_delete_error' => 'crwdns1699:0crwdne1699:0',
'file_missing' => 'crwdns11835:0crwdne11835:0',
'header_row_has_malformed_characters' => 'crwdns11229:0crwdne11229:0',
'content_row_has_malformed_characters' => 'crwdns11231:0crwdne11231:0',
],
'delete' => [
'confirm' => 'crwdns746:0crwdne746:0',
'error' => 'crwdns747:0crwdne747:0',
'nothing_updated' => 'crwdns1876:0crwdne1876:0',
'success' => 'crwdns748:0crwdne748:0',
],
'checkout' => [
'error' => 'crwdns749:0crwdne749:0',
'success' => 'crwdns750:0crwdne750:0',
'user_does_not_exist' => 'crwdns751:0crwdne751:0',
'not_available' => 'crwdns1691:0crwdne1691:0',
'no_assets_selected' => 'crwdns1965:0crwdne1965:0',
],
'checkin' => [
'error' => 'crwdns752:0crwdne752:0',
'success' => 'crwdns753:0crwdne753:0',
'user_does_not_exist' => 'crwdns754:0crwdne754:0',
'already_checked_in' => 'crwdns1603:0crwdne1603:0',
],
'requests' => [
'error' => 'crwdns1484:0crwdne1484:0',
'success' => 'crwdns1485:0crwdne1485:0',
'canceled' => 'crwdns1700:0crwdne1700:0',
],
];
@@ -0,0 +1,33 @@
<?php
return [
'asset_tag' => 'crwdns723:0crwdne723:0',
'asset_model' => 'crwdns724:0crwdne724:0',
'assigned_to' => 'crwdns6587:0crwdne6587:0',
'book_value' => 'crwdns6583:0crwdne6583:0',
'change' => 'crwdns726:0crwdne726:0',
'checkout_date' => 'crwdns727:0crwdne727:0',
'checkoutto' => 'crwdns728:0crwdne728:0',
'components_cost' => 'crwdns11591:0crwdne11591:0',
'current_value' => 'crwdns6585:0crwdne6585:0',
'diff' => 'crwdns729:0crwdne729:0',
'dl_csv' => 'crwdns730:0crwdne730:0',
'eol' => 'crwdns731:0crwdne731:0',
'id' => 'crwdns732:0crwdne732:0',
'last_checkin_date' => 'crwdns11795:0crwdne11795:0',
'location' => 'crwdns733:0crwdne733:0',
'purchase_cost' => 'crwdns734:0crwdne734:0',
'purchase_date' => 'crwdns735:0crwdne735:0',
'serial' => 'crwdns736:0crwdne736:0',
'status' => 'crwdns737:0crwdne737:0',
'title' => 'crwdns738:0crwdne738:0',
'image' => 'crwdns1466:0crwdne1466:0',
'days_without_acceptance' => 'crwdns1402:0crwdne1402:0',
'monthly_depreciation' => 'crwdns5842:0crwdne5842:0',
'assigned_to' => 'crwdns12052:0crwdne12052:0',
'requesting_user' => 'crwdns6589:0crwdne6589:0',
'requested_date' => 'crwdns6591:0crwdne6591:0',
'changed' => 'crwdns6593:0crwdne6593:0',
'icon' => 'crwdns6595:0crwdne6595:0',
];
@@ -0,0 +1,50 @@
<?php
return [
'about_kits_title' => 'crwdns5818:0crwdne5818:0',
'about_kits_text' => 'crwdns5820:0crwdne5820:0',
'checkout' => 'crwdns5822:0crwdne5822:0',
'create_success' => 'crwdns5824:0crwdne5824:0',
'create' => 'crwdns5826:0crwdne5826:0',
'update' => 'crwdns5828:0crwdne5828:0',
'delete_success' => 'crwdns5830:0crwdne5830:0',
'update_success' => 'crwdns5832:0crwdne5832:0',
'none_models' => 'crwdns5834:0crwdne5834:0',
'none_licenses' => 'crwdns5836:0crwdne5836:0',
'none_consumables' => 'crwdns5838:0crwdne5838:0',
'none_accessory' => 'crwdns5840:0crwdne5840:0',
'append_accessory' => 'crwdns6597:0crwdne6597:0',
'update_appended_accessory' => 'crwdns6599:0crwdne6599:0',
'append_consumable' => 'crwdns6601:0crwdne6601:0',
'update_appended_consumable' => 'crwdns6603:0crwdne6603:0',
'append_license' => 'crwdns6605:0crwdne6605:0',
'update_appended_license' => 'crwdns6607:0crwdne6607:0',
'append_model' => 'crwdns6609:0crwdne6609:0',
'update_appended_model' => 'crwdns6611:0crwdne6611:0',
'license_error' => 'crwdns6613:0crwdne6613:0',
'license_added_success' => 'crwdns6615:0crwdne6615:0',
'license_updated' => 'crwdns6617:0crwdne6617:0',
'license_none' => 'crwdns6619:0crwdne6619:0',
'license_detached' => 'crwdns6621:0crwdne6621:0',
'consumable_added_success' => 'crwdns6623:0crwdne6623:0',
'consumable_updated' => 'crwdns6625:0crwdne6625:0',
'consumable_error' => 'crwdns6627:0crwdne6627:0',
'consumable_deleted' => 'crwdns6629:0crwdne6629:0',
'consumable_none' => 'crwdns6631:0crwdne6631:0',
'consumable_detached' => 'crwdns6633:0crwdne6633:0',
'accessory_added_success' => 'crwdns6635:0crwdne6635:0',
'accessory_updated' => 'crwdns6637:0crwdne6637:0',
'accessory_detached' => 'crwdns6639:0crwdne6639:0',
'accessory_error' => 'crwdns6641:0crwdne6641:0',
'accessory_deleted' => 'crwdns6643:0crwdne6643:0',
'accessory_none' => 'crwdns11930:0crwdne11930:0',
'checkout_success' => 'crwdns6647:0crwdne6647:0',
'checkout_error' => 'crwdns6649:0crwdne6649:0',
'kit_none' => 'crwdns6651:0crwdne6651:0',
'kit_created' => 'crwdns6653:0crwdne6653:0',
'kit_updated' => 'crwdns6655:0crwdne6655:0',
'kit_not_found' => 'crwdns6657:0crwdne6657:0',
'kit_deleted' => 'crwdns6659:0crwdne6659:0',
'kit_model_updated' => 'crwdns6661:0crwdne6661:0',
'kit_model_detached' => 'crwdns6663:0crwdne6663:0',
];
@@ -0,0 +1,11 @@
<?php
return [
'invalid_return_count' => 'crwdns11715:0crwdne11715:0',
'invalid_return_type' => 'crwdns11717:0crwdne11717:0',
'invalid_return_value' => 'crwdns11719:0crwdne11719:0',
'does_not_exist' => 'crwdns11721:0crwdne11721:0',
];
@@ -0,0 +1,19 @@
<?php
return [
'example_company' => 'crwdns12030:0crwdne12030:0',
'example_defaultloc' => 'crwdns12032:0crwdne12032:0',
'example_category' => 'crwdns12034:0crwdne12034:0',
'example_location' => 'crwdns12036:0crwdne12036:0',
'example_manufacturer' => 'crwdns12038:0crwdne12038:0',
'example_model' => 'crwdns12040:0crwdne12040:0',
'example_supplier' => 'crwdns12042:0crwdne12042:0',
'labels_per_page' => 'crwdns11701:0crwdne11701:0',
'support_fields' => 'crwdns11703:0crwdne11703:0',
'support_asset_tag' => 'crwdns11705:0crwdne11705:0',
'support_1d_barcode' => 'crwdns11707:0crwdne11707:0',
'support_2d_barcode' => 'crwdns11709:0crwdne11709:0',
'support_logo' => 'crwdns11711:0crwdne11711:0',
'support_title' => 'crwdns11713:0crwdne11713:0',
];
@@ -0,0 +1,22 @@
<?php
return array(
'asset' => 'crwdns904:0crwdne904:0',
'checkin' => 'crwdns905:0crwdne905:0',
'create' => 'crwdns909:0crwdne909:0',
'expiration' => 'crwdns1122:0crwdne1122:0',
'license_key' => 'crwdns1662:0crwdne1662:0',
'maintained' => 'crwdns1145:0crwdne1145:0',
'name' => 'crwdns913:0crwdne913:0',
'no_depreciation' => 'crwdns914:0crwdne914:0',
'purchase_order' => 'crwdns1123:0crwdne1123:0',
'reassignable' => 'crwdns1332:0crwdne1332:0',
'remaining_seats' => 'crwdns1142:0crwdne1142:0',
'seats' => 'crwdns917:0crwdne917:0',
'termination_date' => 'crwdns1146:0crwdne1146:0',
'to_email' => 'crwdns919:0crwdne919:0',
'to_name' => 'crwdns920:0crwdne920:0',
'update' => 'crwdns921:0crwdne921:0',
'checkout_help' => 'crwdns922:0crwdne922:0'
);
@@ -0,0 +1,51 @@
<?php
return array(
'about_licenses_title' => 'crwdns1808:0crwdne1808:0',
'about_licenses' => 'crwdns1809:0crwdne1809:0',
'checkin' => 'crwdns950:0crwdne950:0',
'checkout_history' => 'crwdns951:0crwdne951:0',
'checkout' => 'crwdns952:0crwdne952:0',
'edit' => 'crwdns953:0crwdne953:0',
'filetype_info' => 'crwdns1399:0crwdne1399:0',
'clone' => 'crwdns954:0crwdne954:0',
'history_for' => 'crwdns955:0crwdne955:0',
'in_out' => 'crwdns956:0crwdne956:0',
'info' => 'crwdns957:0crwdne957:0',
'license_seats' => 'crwdns958:0crwdne958:0',
'seat' => 'crwdns959:0crwdne959:0',
'seats' => 'crwdns960:0crwdne960:0',
'software_licenses' => 'crwdns961:0crwdne961:0',
'user' => 'crwdns962:0crwdne962:0',
'view' => 'crwdns963:0crwdne963:0',
'delete_disabled' => 'crwdns11547:0crwdne11547:0',
'bulk' =>
[
'checkin_all' => [
'button' => 'crwdns11549:0crwdne11549:0',
'modal' => 'crwdns11551:0crwdne11551:0',
'enabled_tooltip' => 'crwdns11553:0crwdne11553:0',
'disabled_tooltip' => 'crwdns11555:0crwdne11555:0',
'disabled_tooltip_reassignable' => 'crwdns11803:0crwdne11803:0',
'success' => 'crwdns11557:0crwdne11557:0',
'log_msg' => 'crwdns11559:0crwdne11559:0',
],
'checkout_all' => [
'button' => 'crwdns11561:0crwdne11561:0',
'modal' => 'crwdns11563:0crwdne11563:0',
'enabled_tooltip' => 'crwdns11565:0crwdne11565:0',
'disabled_tooltip' => 'crwdns11567:0crwdne11567:0',
'success' => 'crwdns11569:0crwdne11569:0',
'error_no_seats' => 'crwdns11571:0crwdne11571:0',
'warn_not_enough_seats' => 'crwdns11573:0crwdne11573:0',
'warn_no_avail_users' => 'crwdns11575:0crwdne11575:0',
'log_msg' => 'crwdns11577:0crwdne11577:0',
],
],
'below_threshold' => 'crwdns12124:0crwdne12124:0',
'below_threshold_short' => 'crwdns12126:0crwdne12126:0',
);
@@ -0,0 +1,54 @@
<?php
return array(
'does_not_exist' => 'crwdns10556:0crwdne10556:0',
'user_does_not_exist' => 'crwdns935:0crwdne935:0',
'asset_does_not_exist' => 'crwdns936:0crwdne936:0',
'owner_doesnt_match_asset' => 'crwdns937:0crwdne937:0',
'assoc_users' => 'crwdns938:0crwdne938:0',
'select_asset_or_person' => 'crwdns1952:0crwdne1952:0',
'not_found' => 'crwdns5844:0crwdne5844:0',
'seats_available' => 'crwdns11900:0crwdne11900:0',
'create' => array(
'error' => 'crwdns939:0crwdne939:0',
'success' => 'crwdns940:0crwdne940:0'
),
'deletefile' => array(
'error' => 'crwdns1155:0crwdne1155:0',
'success' => 'crwdns1156:0crwdne1156:0',
),
'upload' => array(
'error' => 'crwdns1157:0crwdne1157:0',
'success' => 'crwdns1158:0crwdne1158:0',
'nofiles' => 'crwdns1403:0crwdne1403:0',
'invalidfiles' => 'crwdns1810:0crwdne1810:0',
),
'update' => array(
'error' => 'crwdns941:0crwdne941:0',
'success' => 'crwdns942:0crwdne942:0'
),
'delete' => array(
'confirm' => 'crwdns943:0crwdne943:0',
'error' => 'crwdns944:0crwdne944:0',
'success' => 'crwdns945:0crwdne945:0'
),
'checkout' => array(
'error' => 'crwdns946:0crwdne946:0',
'success' => 'crwdns947:0crwdne947:0',
'not_enough_seats' => 'crwdns11902:0crwdne11902:0',
),
'checkin' => array(
'error' => 'crwdns948:0crwdne948:0',
'success' => 'crwdns949:0crwdne949:0'
),
);
@@ -0,0 +1,17 @@
<?php
return array(
'assigned_to' => 'crwdns923:0crwdne923:0',
'checkout' => 'crwdns924:0crwdne924:0',
'id' => 'crwdns925:0crwdne925:0',
'license_email' => 'crwdns926:0crwdne926:0',
'license_name' => 'crwdns927:0crwdne927:0',
'purchase_date' => 'crwdns928:0crwdne928:0',
'purchased' => 'crwdns929:0crwdne929:0',
'seats' => 'crwdns930:0crwdne930:0',
'hardware' => 'crwdns931:0crwdne931:0',
'serial' => 'crwdns932:0crwdne932:0',
'title' => 'crwdns933:0crwdne933:0',
);
@@ -0,0 +1,29 @@
<?php
return array(
'does_not_exist' => 'crwdns650:0crwdne650:0',
'assoc_users' => 'crwdns651:0crwdne651:0',
'assoc_assets' => 'crwdns1404:0crwdne1404:0',
'assoc_child_loc' => 'crwdns1405:0crwdne1405:0',
'assigned_assets' => 'crwdns11179:0crwdne11179:0',
'current_location' => 'crwdns11181:0crwdne11181:0',
'create' => array(
'error' => 'crwdns652:0crwdne652:0',
'success' => 'crwdns653:0crwdne653:0'
),
'update' => array(
'error' => 'crwdns654:0crwdne654:0',
'success' => 'crwdns655:0crwdne655:0'
),
'delete' => array(
'confirm' => 'crwdns656:0crwdne656:0',
'error' => 'crwdns657:0crwdne657:0',
'success' => 'crwdns658:0crwdne658:0'
)
);
@@ -0,0 +1,42 @@
<?php
return [
'about_locations_title' => 'crwdns1811:0crwdne1811:0',
'about_locations' => 'crwdns1812:0crwdne1812:0',
'assets_rtd' => 'crwdns1610:0crwdne1610:0', // This has NEVER meant Assets Retired. I don't know how it keeps getting reverted.
'assets_checkedout' => 'crwdns1437:0crwdne1437:0',
'id' => 'crwdns640:0crwdne640:0',
'city' => 'crwdns641:0crwdne641:0',
'state' => 'crwdns642:0crwdne642:0',
'country' => 'crwdns643:0crwdne643:0',
'create' => 'crwdns644:0crwdne644:0',
'update' => 'crwdns645:0crwdne645:0',
'print_assigned' => 'crwdns6062:0crwdne6062:0',
'print_all_assigned' => 'crwdns6064:0crwdne6064:0',
'name' => 'crwdns646:0crwdne646:0',
'address' => 'crwdns647:0crwdne647:0',
'address2' => 'crwdns11880:0crwdne11880:0',
'zip' => 'crwdns648:0crwdne648:0',
'locations' => 'crwdns649:0crwdne649:0',
'parent' => 'crwdns1388:0crwdne1388:0',
'currency' => 'crwdns1389:0crwdne1389:0',
'ldap_ou' => 'crwdns1839:0crwdne1839:0',
'user_name' => 'crwdns6665:0crwdne6665:0',
'department' => 'crwdns6667:0crwdne6667:0',
'location' => 'crwdns6669:0crwdne6669:0',
'asset_tag' => 'crwdns6671:0crwdne6671:0',
'asset_name' => 'crwdns6673:0crwdne6673:0',
'asset_category' => 'crwdns6675:0crwdne6675:0',
'asset_manufacturer' => 'crwdns6677:0crwdne6677:0',
'asset_model' => 'crwdns6679:0crwdne6679:0',
'asset_serial' => 'crwdns6681:0crwdne6681:0',
'asset_location' => 'crwdns6683:0crwdne6683:0',
'asset_checked_out' => 'crwdns6685:0crwdne6685:0',
'asset_expected_checkin' => 'crwdns6687:0crwdne6687:0',
'date' => 'crwdns6689:0crwdne6689:0',
'phone' => 'crwdns12048:0crwdne12048:0',
'signed_by_asset_auditor' => 'crwdns6691:0crwdne6691:0',
'signed_by_finance_auditor' => 'crwdns6693:0crwdne6693:0',
'signed_by_location_manager' => 'crwdns6695:0crwdne6695:0',
'signed_by' => 'crwdns6697:0crwdne6697:0',
];
@@ -0,0 +1,30 @@
<?php
return array(
'support_url_help' => 'crwdns12028:0{LOCALE}crwdnd12028:0{SERIAL}crwdnd12028:0{MODEL_NUMBER}crwdnd12028:0{MODEL_NAME}crwdnd12028:0{LOCALE}crwdnd12028:0{SERIAL}crwdne12028:0',
'does_not_exist' => 'crwdns895:0crwdne895:0',
'assoc_users' => 'crwdns896:0crwdne896:0',
'create' => array(
'error' => 'crwdns897:0crwdne897:0',
'success' => 'crwdns898:0crwdne898:0'
),
'update' => array(
'error' => 'crwdns899:0crwdne899:0',
'success' => 'crwdns900:0crwdne900:0'
),
'restore' => array(
'error' => 'crwdns2014:0crwdne2014:0',
'success' => 'crwdns2015:0crwdne2015:0'
),
'delete' => array(
'confirm' => 'crwdns901:0crwdne901:0',
'error' => 'crwdns1126:0crwdne1126:0',
'success' => 'crwdns903:0crwdne903:0'
)
);
@@ -0,0 +1,16 @@
<?php
return array(
'about_manufacturers_title' => 'crwdns1813:0crwdne1813:0',
'about_manufacturers_text' => 'crwdns1840:0crwdne1840:0',
'asset_manufacturers' => 'crwdns890:0crwdne890:0',
'create' => 'crwdns891:0crwdne891:0',
'id' => 'crwdns892:0crwdne892:0',
'name' => 'crwdns1841:0crwdne1841:0',
'support_email' => 'crwdns1842:0crwdne1842:0',
'support_phone' => 'crwdns1843:0crwdne1843:0',
'support_url' => 'crwdns1844:0crwdne1844:0',
'warranty_lookup_url' => 'crwdns11589:0crwdne11589:0',
'update' => 'crwdns894:0crwdne894:0',
);
@@ -0,0 +1,18 @@
<?php
return array(
'about_models_title' => 'crwdns1815:0crwdne1815:0',
'about_models_text' => 'crwdns1816:0crwdne1816:0',
'deleted' => 'crwdns6077:0crwdne6077:0',
'bulk_delete' => 'crwdns1972:0crwdne1972:0',
'bulk_delete_help' => 'crwdns1973:0crwdne1973:0',
'bulk_delete_warn' => 'crwdns11521:0crwdne11521:0',
'restore' => 'crwdns1255:0crwdne1255:0',
'requestable' => 'crwdns1702:0crwdne1702:0',
'show_mac_address' => 'crwdns1180:0crwdne1180:0',
'view_deleted' => 'crwdns1256:0crwdne1256:0',
'view_models' => 'crwdns1257:0crwdne1257:0',
'fieldset' => 'crwdns1478:0crwdne1478:0',
'no_custom_field' => 'crwdns1479:0crwdne1479:0',
'add_default_values' => 'crwdns2025:0crwdne2025:0',
);
@@ -0,0 +1,47 @@
<?php
return array(
'deleted' => 'crwdns11801:0crwdne11801:0',
'does_not_exist' => 'crwdns671:0crwdne671:0',
'no_association' => 'crwdns11693:0crwdne11693:0',
'no_association_fix' => 'crwdns11235:0crwdne11235:0',
'assoc_users' => 'crwdns672:0crwdne672:0',
'create' => array(
'error' => 'crwdns673:0crwdne673:0',
'success' => 'crwdns674:0crwdne674:0',
'duplicate_set' => 'crwdns1406:0crwdne1406:0',
),
'update' => array(
'error' => 'crwdns675:0crwdne675:0',
'success' => 'crwdns676:0crwdne676:0',
),
'delete' => array(
'confirm' => 'crwdns677:0crwdne677:0',
'error' => 'crwdns678:0crwdne678:0',
'success' => 'crwdns679:0crwdne679:0'
),
'restore' => array(
'error' => 'crwdns1252:0crwdne1252:0',
'success' => 'crwdns1253:0crwdne1253:0'
),
'bulkedit' => array(
'error' => 'crwdns1883:0crwdne1883:0',
'success' => 'crwdns11509:0crwdne11509:0',
'warn' => 'crwdns12078:0crwdne12078:0',
),
'bulkdelete' => array(
'error' => 'crwdns1975:0crwdne1975:0',
'success' => 'crwdns11513:0crwdne11513:0',
'success_partial' => 'crwdns1977:0crwdne1977:0'
),
);
@@ -0,0 +1,17 @@
<?php
return array(
'create' => 'crwdns659:0crwdne659:0',
'created_at' => 'crwdns660:0crwdne660:0',
'eol' => 'crwdns661:0crwdne661:0',
'modelnumber' => 'crwdns662:0crwdne662:0',
'name' => 'crwdns663:0crwdne663:0',
'numassets' => 'crwdns664:0crwdne664:0',
'title' => 'crwdns665:0crwdne665:0',
'update' => 'crwdns666:0crwdne666:0',
'view' => 'crwdns667:0crwdne667:0',
'update' => 'crwdns666:0crwdne666:0',
'clone' => 'crwdns669:0crwdne669:0',
'edit' => 'crwdns670:0crwdne670:0',
);
@@ -0,0 +1,17 @@
<?php
return [
'info' => 'crwdns1136:0crwdne1136:0',
'deleted_user' => 'crwdns6699:0crwdne6699:0',
'send_reminder' => 'crwdns6701:0crwdne6701:0',
'reminder_sent' => 'crwdns6703:0crwdne6703:0',
'acceptance_deleted' => 'crwdns6705:0crwdne6705:0',
'acceptance_request' => 'crwdns6707:0crwdne6707:0',
'custom_export' => [
'user_address' => 'crwdns11870:0crwdne11870:0',
'user_city' => 'crwdns11872:0crwdne11872:0',
'user_state' => 'crwdns11874:0crwdne11874:0',
'user_country' => 'crwdns11876:0crwdne11876:0',
'user_zip' => 'crwdns11878:0crwdne11878:0'
]
];
@@ -0,0 +1,5 @@
<?php
return array(
'error' => 'crwdns1137:0crwdne1137:0'
);
@@ -0,0 +1,367 @@
<?php
return [
'ad' => 'crwdns1671:0crwdne1671:0',
'ad_domain' => 'crwdns1672:0crwdne1672:0',
'ad_domain_help' => 'crwdns1673:0crwdne1673:0',
'ad_append_domain_label' => 'crwdns5846:0crwdne5846:0',
'ad_append_domain' => 'crwdns5848:0crwdne5848:0',
'ad_append_domain_help' => 'crwdns5850:0crwdne5850:0',
'admin_cc_email' => 'crwdns2026:0crwdne2026:0',
'admin_cc_email_help' => 'crwdns2027:0crwdne2027:0',
'admin_settings' => 'crwdns11908:0crwdne11908:0',
'is_ad' => 'crwdns1674:0crwdne1674:0',
'alerts' => 'crwdns6315:0crwdne6315:0',
'alert_title' => 'crwdns11367:0crwdne11367:0',
'alert_email' => 'crwdns1198:0crwdne1198:0',
'alert_email_help' => 'crwdns6319:0crwdne6319:0',
'alerts_enabled' => 'crwdns1623:0crwdne1623:0',
'alert_interval' => 'crwdns1624:0crwdne1624:0',
'alert_inv_threshold' => 'crwdns1625:0crwdne1625:0',
'allow_user_skin' => 'crwdns6048:0crwdne6048:0',
'allow_user_skin_help_text' => 'crwdns6050:0crwdne6050:0',
'asset_ids' => 'crwdns1294:0crwdne1294:0',
'audit_interval' => 'crwdns1908:0crwdne1908:0',
'audit_interval_help' => 'crwdns11201:0crwdne11201:0',
'audit_warning_days' => 'crwdns1910:0crwdne1910:0',
'audit_warning_days_help' => 'crwdns1911:0crwdne1911:0',
'auto_increment_assets' => 'crwdns6321:0crwdne6321:0',
'auto_increment_prefix' => 'crwdns1148:0crwdne1148:0',
'auto_incrementing_help' => 'crwdns6323:0crwdne6323:0',
'backups' => 'crwdns1331:0crwdne1331:0',
'backups_help' => 'crwdns6812:0crwdne6812:0',
'backups_restoring' => 'crwdns6325:0crwdne6325:0',
'backups_upload' => 'crwdns6327:0crwdne6327:0',
'backups_path' => 'crwdns6329:0crwdne6329:0',
'backups_restore_warning' => 'crwdns11531:0crwdne11531:0',
'backups_logged_out' => 'crwdns6774:0crwdne6774:0',
'backups_large' => 'crwdns6335:0crwdne6335:0',
'barcode_settings' => 'crwdns1295:0crwdne1295:0',
'confirm_purge' => 'crwdns1611:0crwdne1611:0',
'confirm_purge_help' => 'crwdns5852:0crwdne5852:0',
'custom_css' => 'crwdns1419:0crwdne1419:0',
'custom_css_help' => 'crwdns1420:0crwdne1420:0',
'custom_forgot_pass_url' => 'crwdns1966:0crwdne1966:0',
'custom_forgot_pass_url_help' => 'crwdns1967:0crwdne1967:0',
'dashboard_message' => 'crwdns1982:0crwdne1982:0',
'dashboard_message_help' => 'crwdns1983:0crwdne1983:0',
'default_currency' => 'crwdns1390:0crwdne1390:0',
'default_eula_text' => 'crwdns1259:0crwdne1259:0',
'default_language' => 'crwdns1581:0crwdne1581:0',
'default_eula_help_text' => 'crwdns1260:0crwdne1260:0',
'display_asset_name' => 'crwdns828:0crwdne828:0',
'display_checkout_date' => 'crwdns829:0crwdne829:0',
'display_eol' => 'crwdns1118:0crwdne1118:0',
'display_qr' => 'crwdns1626:0crwdne1626:0',
'display_alt_barcode' => 'crwdns1664:0crwdne1664:0',
'email_logo' => 'crwdns5854:0crwdne5854:0',
'barcode_type' => 'crwdns1665:0crwdne1665:0',
'alt_barcode_type' => 'crwdns1666:0crwdne1666:0',
'email_logo_size' => 'crwdns5856:0crwdne5856:0',
'enabled' => 'crwdns6337:0crwdne6337:0',
'eula_settings' => 'crwdns1296:0crwdne1296:0',
'eula_markdown' => 'crwdns1261:0crwdne1261:0',
'favicon' => 'crwdns5858:0crwdne5858:0',
'favicon_format' => 'crwdns5860:0crwdne5860:0',
'favicon_size' => 'crwdns5862:0crwdne5862:0',
'footer_text' => 'crwdns1987:0crwdne1987:0',
'footer_text_help' => 'crwdns1988:0crwdne1988:0',
'general_settings' => 'crwdns1297:0crwdne1297:0',
'general_settings_keywords' => 'crwdns12084:0crwdne12084:0',
'general_settings_help' => 'crwdns6341:0crwdne6341:0',
'generate_backup' => 'crwdns1427:0crwdne1427:0',
'google_workspaces' => 'crwdns12080:0crwdne12080:0',
'header_color' => 'crwdns1196:0crwdne1196:0',
'info' => 'crwdns831:0crwdne831:0',
'label_logo' => 'crwdns5864:0crwdne5864:0',
'label_logo_size' => 'crwdns5866:0crwdne5866:0',
'laravel' => 'crwdns1119:0crwdne1119:0',
'ldap' => 'crwdns6343:0crwdne6343:0',
'ldap_default_group' => 'crwdns11203:0crwdne11203:0',
'ldap_default_group_info' => 'crwdns11205:0crwdne11205:0',
'no_default_group' => 'crwdns11213:0crwdne11213:0',
'ldap_help' => 'crwdns6345:0crwdne6345:0',
'ldap_client_tls_key' => 'crwdns6093:0crwdne6093:0',
'ldap_client_tls_cert' => 'crwdns6085:0crwdne6085:0',
'ldap_enabled' => 'crwdns1448:0crwdne1448:0',
'ldap_integration' => 'crwdns1449:0crwdne1449:0',
'ldap_settings' => 'crwdns1450:0crwdne1450:0',
'ldap_client_tls_cert_help' => 'crwdns6091:0crwdne6091:0',
'ldap_location' => 'crwdns11583:0crwdne11583:0',
'ldap_location_help' => 'crwdns11585:0crwdne11585:0',
'ldap_login_test_help' => 'crwdns1968:0crwdne1968:0',
'ldap_login_sync_help' => 'crwdns1969:0crwdne1969:0',
'ldap_manager' => 'crwdns6814:0crwdne6814:0',
'ldap_server' => 'crwdns1451:0crwdne1451:0',
'ldap_server_help' => 'crwdns1675:0crwdne1675:0',
'ldap_server_cert' => 'crwdns1475:0crwdne1475:0',
'ldap_server_cert_ignore' => 'crwdns1476:0crwdne1476:0',
'ldap_server_cert_help' => 'crwdns1477:0crwdne1477:0',
'ldap_tls' => 'crwdns1676:0crwdne1676:0',
'ldap_tls_help' => 'crwdns1677:0crwdne1677:0',
'ldap_uname' => 'crwdns1452:0crwdne1452:0',
'ldap_dept' => 'crwdns6052:0crwdne6052:0',
'ldap_phone' => 'crwdns6054:0crwdne6054:0',
'ldap_jobtitle' => 'crwdns6056:0crwdne6056:0',
'ldap_country' => 'crwdns6058:0crwdne6058:0',
'ldap_pword' => 'crwdns1453:0crwdne1453:0',
'ldap_basedn' => 'crwdns1454:0crwdne1454:0',
'ldap_filter' => 'crwdns1455:0crwdne1455:0',
'ldap_pw_sync' => 'crwdns1692:0crwdne1692:0',
'ldap_pw_sync_help' => 'crwdns1693:0crwdne1693:0',
'ldap_username_field' => 'crwdns1456:0crwdne1456:0',
'ldap_lname_field' => 'crwdns1457:0crwdne1457:0',
'ldap_fname_field' => 'crwdns1458:0crwdne1458:0',
'ldap_auth_filter_query' => 'crwdns1459:0crwdne1459:0',
'ldap_version' => 'crwdns1460:0crwdne1460:0',
'ldap_active_flag' => 'crwdns1461:0crwdne1461:0',
'ldap_activated_flag_help' => 'crwdns11176:0crwdne11176:0',
'ldap_emp_num' => 'crwdns1462:0crwdne1462:0',
'ldap_email' => 'crwdns1463:0crwdne1463:0',
'ldap_test' => 'crwdns6349:0crwdne6349:0',
'ldap_test_sync' => 'crwdns6351:0crwdne6351:0',
'license' => 'crwdns1989:0crwdne1989:0',
'load_remote' => 'crwdns12086:0crwdne12086:0',
'load_remote_help_text' => 'crwdns12088:0crwdne12088:0',
'login' => 'crwdns6353:0crwdne6353:0',
'login_attempt' => 'crwdns6355:0crwdne6355:0',
'login_ip' => 'crwdns6357:0crwdne6357:0',
'login_success' => 'crwdns6359:0crwdne6359:0',
'login_user_agent' => 'crwdns6361:0crwdne6361:0',
'login_help' => 'crwdns6363:0crwdne6363:0',
'login_note' => 'crwdns1890:0crwdne1890:0',
'login_note_help' => 'crwdns1891:0crwdne1891:0',
'login_remote_user_text' => 'crwdns2003:0crwdne2003:0',
'login_remote_user_enabled_text' => 'crwdns2004:0crwdne2004:0',
'login_remote_user_enabled_help' => 'crwdns2005:0crwdne2005:0',
'login_common_disabled_text' => 'crwdns2006:0crwdne2006:0',
'login_common_disabled_help' => 'crwdns2007:0crwdne2007:0',
'login_remote_user_custom_logout_url_text' => 'crwdns2008:0crwdne2008:0',
'login_remote_user_custom_logout_url_help' => 'crwdns2049:0crwdne2049:0',
'login_remote_user_header_name_text' => 'crwdns5868:0crwdne5868:0',
'login_remote_user_header_name_help' => 'crwdns5870:0crwdne5870:0',
'logo' => 'crwdns1197:0crwdne1197:0',
'logo_print_assets' => 'crwdns2051:0crwdne2051:0',
'logo_print_assets_help' => 'crwdns2053:0crwdne2053:0',
'full_multiple_companies_support_help_text' => 'crwdns1464:0crwdne1464:0',
'full_multiple_companies_support_text' => 'crwdns1465:0crwdne1465:0',
'show_in_model_list' => 'crwdns1990:0crwdne1990:0',
'optional' => 'crwdns1298:0crwdne1298:0',
'per_page' => 'crwdns832:0crwdne832:0',
'php' => 'crwdns1120:0crwdne1120:0',
'php_info' => 'crwdns6365:0crwdne6365:0',
'php_overview' => 'crwdns6367:0crwdne6367:0',
'php_overview_keywords' => 'crwdns6369:0crwdne6369:0',
'php_overview_help' => 'crwdns6371:0crwdne6371:0',
'php_gd_info' => 'crwdns833:0crwdne833:0',
'php_gd_warning' => 'crwdns834:0crwdne834:0',
'pwd_secure_complexity' => 'crwdns1892:0crwdne1892:0',
'pwd_secure_complexity_help' => 'crwdns1893:0crwdne1893:0',
'pwd_secure_complexity_disallow_same_pwd_as_user_fields' => 'crwdns6373:0crwdne6373:0',
'pwd_secure_complexity_letters' => 'crwdns6375:0crwdne6375:0',
'pwd_secure_complexity_numbers' => 'crwdns6377:0crwdne6377:0',
'pwd_secure_complexity_symbols' => 'crwdns6379:0crwdne6379:0',
'pwd_secure_complexity_case_diff' => 'crwdns6381:0crwdne6381:0',
'pwd_secure_min' => 'crwdns1894:0crwdne1894:0',
'pwd_secure_min_help' => 'crwdns5872:0crwdne5872:0',
'pwd_secure_uncommon' => 'crwdns1896:0crwdne1896:0',
'pwd_secure_uncommon_help' => 'crwdns1897:0crwdne1897:0',
'qr_help' => 'crwdns835:0crwdne835:0',
'qr_text' => 'crwdns836:0crwdne836:0',
'saml' => 'crwdns6383:0crwdne6383:0',
'saml_title' => 'crwdns6385:0crwdne6385:0',
'saml_help' => 'crwdns6387:0crwdne6387:0',
'saml_enabled' => 'crwdns5874:0crwdne5874:0',
'saml_integration' => 'crwdns5876:0crwdne5876:0',
'saml_sp_entityid' => 'crwdns5878:0crwdne5878:0',
'saml_sp_acs_url' => 'crwdns5880:0crwdne5880:0',
'saml_sp_sls_url' => 'crwdns5882:0crwdne5882:0',
'saml_sp_x509cert' => 'crwdns5884:0crwdne5884:0',
'saml_sp_metadata_url' => 'crwdns6060:0crwdne6060:0',
'saml_idp_metadata' => 'crwdns5886:0crwdne5886:0',
'saml_idp_metadata_help' => 'crwdns5888:0crwdne5888:0',
'saml_attr_mapping_username' => 'crwdns5890:0crwdne5890:0',
'saml_attr_mapping_username_help' => 'crwdns5892:0crwdne5892:0',
'saml_forcelogin_label' => 'crwdns11178:0crwdne11178:0',
'saml_forcelogin' => 'crwdns5896:0crwdne5896:0',
'saml_forcelogin_help' => 'crwdns5898:0crwdne5898:0',
'saml_slo_label' => 'crwdns5900:0crwdne5900:0',
'saml_slo' => 'crwdns5902:0crwdne5902:0',
'saml_slo_help' => 'crwdns5904:0crwdne5904:0',
'saml_custom_settings' => 'crwdns5906:0crwdne5906:0',
'saml_custom_settings_help' => 'crwdns5908:0crwdne5908:0',
'saml_download' => 'crwdns6389:0crwdne6389:0',
'setting' => 'crwdns837:0crwdne837:0',
'settings' => 'crwdns838:0crwdne838:0',
'show_alerts_in_menu' => 'crwdns1980:0crwdne1980:0',
'show_archived_in_list' => 'crwdns1984:0crwdne1984:0',
'show_archived_in_list_text' => 'crwdns1985:0crwdne1985:0',
'show_assigned_assets' => 'crwdns5910:0crwdne5910:0',
'show_assigned_assets_help' => 'crwdns5912:0crwdne5912:0',
'show_images_in_email' => 'crwdns2028:0crwdne2028:0',
'show_images_in_email_help' => 'crwdns2029:0crwdne2029:0',
'site_name' => 'crwdns839:0crwdne839:0',
'integrations' => 'crwdns11385:0crwdne11385:0',
'slack' => 'crwdns11409:0crwdne11409:0',
'general_webhook' => 'crwdns11411:0crwdne11411:0',
'ms_teams' => 'crwdns12058:0crwdne12058:0',
'webhook' => 'crwdns11387:0crwdne11387:0',
'webhook_presave' => 'crwdns11445:0crwdne11445:0',
'webhook_title' => 'crwdns11389:0crwdne11389:0',
'webhook_help' => 'crwdns11391:0crwdne11391:0',
'webhook_botname' => 'crwdns11393:0crwdne11393:0',
'webhook_channel' => 'crwdns11395:0crwdne11395:0',
'webhook_endpoint' => 'crwdns11397:0crwdne11397:0',
'webhook_integration' => 'crwdns11399:0crwdne11399:0',
'webhook_test' =>'crwdns11401:0crwdne11401:0',
'webhook_integration_help' => 'crwdns11403:0crwdne11403:0',
'webhook_integration_help_button' => 'crwdns11405:0crwdne11405:0',
'webhook_test_help' => 'crwdns11407:0crwdne11407:0',
'snipe_version' => 'crwdns1266:0crwdne1266:0',
'support_footer' => 'crwdns1991:0crwdne1991:0',
'support_footer_help' => 'crwdns1992:0crwdne1992:0',
'version_footer' => 'crwdns2040:0crwdne2040:0',
'version_footer_help' => 'crwdns2041:0crwdne2041:0',
'system' => 'crwdns1121:0crwdne1121:0',
'update' => 'crwdns840:0crwdne840:0',
'value' => 'crwdns841:0crwdne841:0',
'brand' => 'crwdns1433:0crwdne1433:0',
'brand_keywords' => 'crwdns6397:0crwdne6397:0',
'brand_help' => 'crwdns6399:0crwdne6399:0',
'web_brand' => 'crwdns5916:0crwdne5916:0',
'about_settings_title' => 'crwdns1434:0crwdne1434:0',
'about_settings_text' => 'crwdns1435:0crwdne1435:0',
'labels_per_page' => 'crwdns1582:0crwdne1582:0',
'label_dimensions' => 'crwdns1583:0crwdne1583:0',
'next_auto_tag_base' => 'crwdns1882:0crwdne1882:0',
'page_padding' => 'crwdns1584:0crwdne1584:0',
'privacy_policy_link' => 'crwdns2036:0crwdne2036:0',
'privacy_policy' => 'crwdns2037:0crwdne2037:0',
'privacy_policy_link_help' => 'crwdns2038:0crwdne2038:0',
'purge' => 'crwdns1613:0crwdne1613:0',
'purge_deleted' => 'crwdns6401:0crwdne6401:0',
'labels_display_bgutter' => 'crwdns1585:0crwdne1585:0',
'labels_display_sgutter' => 'crwdns1614:0crwdne1614:0',
'labels_fontsize' => 'crwdns1587:0crwdne1587:0',
'labels_pagewidth' => 'crwdns1588:0crwdne1588:0',
'labels_pageheight' => 'crwdns1589:0crwdne1589:0',
'label_gutters' => 'crwdns1590:0crwdne1590:0',
'page_dimensions' => 'crwdns1591:0crwdne1591:0',
'label_fields' => 'crwdns1592:0crwdne1592:0',
'inches' => 'crwdns1593:0crwdne1593:0',
'width_w' => 'crwdns1594:0crwdne1594:0',
'height_h' => 'crwdns1595:0crwdne1595:0',
'show_url_in_emails' => 'crwdns1953:0crwdne1953:0',
'show_url_in_emails_help_text' => 'crwdns1954:0crwdne1954:0',
'text_pt' => 'crwdns1596:0crwdne1596:0',
'thumbnail_max_h' => 'crwdns1898:0crwdne1898:0',
'thumbnail_max_h_help' => 'crwdns1899:0crwdne1899:0',
'two_factor' => 'crwdns1776:0crwdne1776:0',
'two_factor_secret' => 'crwdns1777:0crwdne1777:0',
'two_factor_enrollment' => 'crwdns1778:0crwdne1778:0',
'two_factor_enabled_text' => 'crwdns1779:0crwdne1779:0',
'two_factor_reset' => 'crwdns1780:0crwdne1780:0',
'two_factor_reset_help' => 'crwdns1781:0crwdne1781:0',
'two_factor_reset_success' => 'crwdns1782:0crwdne1782:0',
'two_factor_reset_error' => 'crwdns1783:0crwdne1783:0',
'two_factor_enabled_warning' => 'crwdns1784:0crwdne1784:0',
'two_factor_enabled_help' => 'crwdns1785:0crwdne1785:0',
'two_factor_optional' => 'crwdns1817:0crwdne1817:0',
'two_factor_required' => 'crwdns1787:0crwdne1787:0',
'two_factor_disabled' => 'crwdns1788:0crwdne1788:0',
'two_factor_enter_code' => 'crwdns1789:0crwdne1789:0',
'two_factor_config_complete' => 'crwdns1790:0crwdne1790:0',
'two_factor_enabled_edit_not_allowed' => 'crwdns1818:0crwdne1818:0',
'two_factor_enrollment_text' => "crwdns1791:0crwdne1791:0",
'require_accept_signature' => 'crwdns1819:0crwdne1819:0',
'require_accept_signature_help_text' => 'crwdns1820:0crwdne1820:0',
'left' => 'crwdns1597:0crwdne1597:0',
'right' => 'crwdns1598:0crwdne1598:0',
'top' => 'crwdns1599:0crwdne1599:0',
'bottom' => 'crwdns1600:0crwdne1600:0',
'vertical' => 'crwdns1601:0crwdne1601:0',
'horizontal' => 'crwdns1602:0crwdne1602:0',
'unique_serial' => 'crwdns2042:0crwdne2042:0',
'unique_serial_help_text' => 'crwdns2043:0crwdne2043:0',
'zerofill_count' => 'crwdns1678:0crwdne1678:0',
'username_format_help' => 'crwdns5918:0crwdne5918:0',
'oauth_title' => 'crwdns6403:0crwdne6403:0',
'oauth' => 'crwdns6405:0crwdne6405:0',
'oauth_help' => 'crwdns6407:0crwdne6407:0',
'asset_tag_title' => 'crwdns6409:0crwdne6409:0',
'barcode_title' => 'crwdns6411:0crwdne6411:0',
'barcodes' => 'crwdns6413:0crwdne6413:0',
'barcodes_help_overview' => 'crwdns6415:0crwdne6415:0',
'barcodes_help' => 'crwdns6417:0crwdne6417:0',
'barcodes_spinner' => 'crwdns6419:0crwdne6419:0',
'barcode_delete_cache' => 'crwdns6421:0crwdne6421:0',
'branding_title' => 'crwdns6423:0crwdne6423:0',
'general_title' => 'crwdns6425:0crwdne6425:0',
'mail_test' => 'crwdns6427:0crwdne6427:0',
'mail_test_help' => 'crwdns6429:0crwdne6429:0',
'filter_by_keyword' => 'crwdns6431:0crwdne6431:0',
'security' => 'crwdns6433:0crwdne6433:0',
'security_title' => 'crwdns6435:0crwdne6435:0',
'security_keywords' => 'crwdns6437:0crwdne6437:0',
'security_help' => 'crwdns6439:0crwdne6439:0',
'groups_keywords' => 'crwdns6441:0crwdne6441:0',
'groups_help' => 'crwdns6443:0crwdne6443:0',
'localization' => 'crwdns6445:0crwdne6445:0',
'localization_title' => 'crwdns6447:0crwdne6447:0',
'localization_keywords' => 'crwdns6449:0crwdne6449:0',
'localization_help' => 'crwdns6451:0crwdne6451:0',
'notifications' => 'crwdns6453:0crwdne6453:0',
'notifications_help' => 'crwdns11363:0crwdne11363:0',
'asset_tags_help' => 'crwdns6457:0crwdne6457:0',
'labels' => 'crwdns6459:0crwdne6459:0',
'labels_title' => 'crwdns6461:0crwdne6461:0',
'labels_help' => 'crwdns6463:0crwdne6463:0',
'purge' => 'crwdns6465:0crwdne6465:0',
'purge_keywords' => 'crwdns6467:0crwdne6467:0',
'purge_help' => 'crwdns6469:0crwdne6469:0',
'ldap_extension_warning' => 'crwdns6471:0crwdne6471:0',
'ldap_ad' => 'crwdns6473:0crwdne6473:0',
'employee_number' => 'crwdns6475:0crwdne6475:0',
'create_admin_user' => 'crwdns6477:0crwdne6477:0',
'create_admin_success' => 'crwdns6479:0crwdne6479:0',
'create_admin_redirect' => 'crwdns6481:0crwdne6481:0',
'setup_migrations' => 'crwdns6483:0crwdne6483:0',
'setup_no_migrations' => 'crwdns6485:0crwdne6485:0',
'setup_successful_migrations' => 'crwdns6487:0crwdne6487:0',
'setup_migration_output' => 'crwdns6489:0crwdne6489:0',
'setup_migration_create_user' => 'crwdns6491:0crwdne6491:0',
'ldap_settings_link' => 'crwdns6493:0crwdne6493:0',
'slack_test' => 'crwdns6495:0crwdne6495:0',
'label2_enable' => 'crwdns11723:0crwdne11723:0',
'label2_enable_help' => 'crwdns11725:0crwdne11725:0',
'label2_template' => 'crwdns11727:0crwdne11727:0',
'label2_template_help' => 'crwdns11729:0crwdne11729:0',
'label2_title' => 'crwdns11731:0crwdne11731:0',
'label2_title_help' => 'crwdns11733:0crwdne11733:0',
'label2_title_help_phold' => 'crwdns11767:0{COMPANY}crwdne11767:0',
'label2_asset_logo' => 'crwdns11737:0crwdne11737:0',
'label2_asset_logo_help' => 'crwdns11739:0crwdne11739:0',
'label2_1d_type' => 'crwdns11741:0crwdne11741:0',
'label2_1d_type_help' => 'crwdns11743:0crwdne11743:0',
'label2_2d_type' => 'crwdns11745:0crwdne11745:0',
'label2_2d_type_help' => 'crwdns11747:0crwdne11747:0',
'label2_2d_target' => 'crwdns11749:0crwdne11749:0',
'label2_2d_target_help' => 'crwdns11751:0crwdne11751:0',
'label2_fields' => 'crwdns11753:0crwdne11753:0',
'label2_fields_help' => 'crwdns11755:0crwdne11755:0',
'help_asterisk_bold' => 'crwdns11757:0crwdne11757:0',
'help_blank_to_use' => 'crwdns11759:0crwdne11759:0',
'help_default_will_use' => 'crwdns11789:0crwdne11789:0',
'default' => 'crwdns11763:0crwdne11763:0',
'none' => 'crwdns11765:0crwdne11765:0',
'google_callback_help' => 'crwdns11615:0crwdne11615:0',
'google_login' => 'crwdns11621:0crwdne11621:0',
'enable_google_login' => 'crwdns11617:0crwdne11617:0',
'enable_google_login_help' => 'crwdns11619:0crwdne11619:0',
'mail_reply_to' => 'crwdns11823:0crwdne11823:0',
'mail_from' => 'crwdns11825:0crwdne11825:0',
'database_driver' => 'crwdns11827:0crwdne11827:0',
'bs_table_storage' => 'crwdns11829:0crwdne11829:0',
'timezone' => 'crwdns11831:0crwdne11831:0',
];
@@ -0,0 +1,46 @@
<?php
return [
'update' => [
'error' => 'crwdns826:0crwdne826:0',
'success' => 'crwdns827:0crwdne827:0',
],
'backup' => [
'delete_confirm' => 'crwdns1423:0crwdne1423:0',
'file_deleted' => 'crwdns1424:0crwdne1424:0',
'generated' => 'crwdns1425:0crwdne1425:0',
'file_not_found' => 'crwdns1426:0crwdne1426:0',
'restore_warning' => 'crwdns6709:0crwdne6709:0',
'restore_confirm' => 'crwdns6711:0crwdne6711:0'
],
'purge' => [
'error' => 'crwdns1615:0crwdne1615:0',
'validation_failed' => 'crwdns1616:0crwdne1616:0',
'success' => 'crwdns1617:0crwdne1617:0',
],
'mail' => [
'sending' => 'crwdns6713:0crwdne6713:0',
'success' => 'crwdns6715:0crwdne6715:0',
'error' => 'crwdns6717:0crwdne6717:0',
'additional' => 'crwdns6719:0crwdne6719:0'
],
'ldap' => [
'testing' => 'crwdns6721:0crwdne6721:0',
'500' => 'crwdns6723:0crwdne6723:0',
'error' => 'crwdns6725:0crwdne6725:0',
'sync_success' => 'crwdns6727:0crwdne6727:0',
'testing_authentication' => 'crwdns6729:0crwdne6729:0',
'authentication_success' => 'crwdns6731:0crwdne6731:0'
],
'webhook' => [
'sending' => 'crwdns11373:0crwdne11373:0',
'success' => 'crwdns11841:0crwdne11841:0',
'success_pt1' => 'crwdns11375:0crwdne11375:0',
'success_pt2' => 'crwdns11377:0crwdne11377:0',
'500' => 'crwdns11379:0crwdne11379:0',
'error' => 'crwdns11381:0crwdne11381:0',
'error_redirect' => 'crwdns11843:0crwdne11843:0',
'error_misc' => 'crwdns11383:0crwdne11383:0',
]
];
@@ -0,0 +1,6 @@
<?php
return array(
'created' => 'crwdns6816:0crwdne6816:0',
'size' => 'crwdns6818:0crwdne6818:0',
);
@@ -0,0 +1,32 @@
<?php
return [
'does_not_exist' => 'crwdns1653:0crwdne1653:0',
'deleted_label' => 'crwdns11926:0crwdne11926:0',
'assoc_assets' => 'crwdns1654:0crwdne1654:0',
'create' => [
'error' => 'crwdns1655:0crwdne1655:0',
'success' => 'crwdns1656:0crwdne1656:0',
],
'update' => [
'error' => 'crwdns1657:0crwdne1657:0',
'success' => 'crwdns1658:0crwdne1658:0',
],
'delete' => [
'confirm' => 'crwdns1659:0crwdne1659:0',
'error' => 'crwdns1660:0crwdne1660:0',
'success' => 'crwdns1661:0crwdne1661:0',
],
'help' => [
'undeployable' => 'crwdns1955:0crwdne1955:0',
'deployable' => 'crwdns6743:0crwdne6743:0',
'archived' => 'crwdns1957:0crwdne1957:0',
'pending' => 'crwdns1958:0crwdne1958:0',
],
];
@@ -0,0 +1,19 @@
<?php
return array(
'about' => 'crwdns684:0crwdne684:0',
'archived' => 'crwdns1161:0crwdne1161:0',
'create' => 'crwdns683:0crwdne683:0',
'color' => 'crwdns1686:0crwdne1686:0',
'default_label' => 'crwdns2012:0crwdne2012:0',
'default_label_help' => 'crwdns2013:0crwdne2013:0',
'deployable' => 'crwdns1162:0crwdne1162:0',
'info' => 'crwdns1163:0crwdne1163:0',
'name' => 'crwdns680:0crwdne680:0',
'pending' => 'crwdns1164:0crwdne1164:0',
'status_type' => 'crwdns1165:0crwdne1165:0',
'show_in_nav' => 'crwdns1687:0crwdne1687:0',
'title' => 'crwdns681:0crwdne681:0',
'undeployable' => 'crwdns1166:0crwdne1166:0',
'update' => 'crwdns682:0crwdne682:0',
);

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