Compare commits

..

162 Commits

Author SHA1 Message Date
snipe 44ef39e419 Merge remote-tracking branch 'origin/develop' 2025-10-06 20:53:14 +01:00
snipe e05a0ef565 Merge pull request #17967 from marcusmoore/fixes/17963-delete-file-via-api-fix
Fixed #17963 - over eager deletion of asset files via api
2025-10-06 20:52:57 +01:00
snipe 0ea9c0647f Merge remote-tracking branch 'origin/develop'
# Conflicts:
#	config/version.php
2025-10-06 15:14:56 +01:00
snipe 00b9ba2b75 Merge pull request #17989 from grokability/fixes-tcpdf-png-handling
Fixed #17940 - pngs not showing in acceptance PDFs
2025-10-06 15:13:58 +01:00
snipe f1e3bc9531 Fixed #17940 - use base64encoding on images in acceptance PDF 2025-10-06 15:02:53 +01:00
snipe 7360e093b2 Bumped version 2025-10-06 10:41:15 +01:00
snipe 5f639bc24f Updated translations 2025-10-06 10:39:04 +01:00
snipe 884d2a9552 Merge remote-tracking branch 'origin/develop' 2025-10-04 14:09:54 +01:00
snipe fd8a8b29b1 Added inactive and expired to licenses table listing 2025-10-04 13:18:51 +01:00
snipe 4e1ef40c05 Updated active button colors 2025-10-04 13:16:46 +01:00
snipe 00af0ddff5 Merge pull request #17982 from grokability/expiring-alerts-improvements
Small expiring alerts improvements
2025-10-04 01:11:03 +01:00
snipe 2467e823a5 Reordered buttons 2025-10-04 01:06:56 +01:00
snipe 224642fcb5 Removed funky search cookie 2025-10-04 01:04:25 +01:00
snipe 59518ca2c5 Small style updates 2025-10-04 00:31:17 +01:00
snipe dfb7c73069 Added column search to users 2025-10-04 00:31:06 +01:00
snipe 70eccceab3 Updated button class for add new 2025-10-04 00:18:09 +01:00
snipe 3f69b70367 Moved btn methods closer to the BS table 2025-10-03 23:54:38 +01:00
snipe 94a0a2f8be Fixed dropdown toggle 2025-10-03 23:50:40 +01:00
snipe 7e23596ab8 Translate export to CSV 2025-10-03 23:09:33 +01:00
snipe 3c58a5dd3d Fixed column selector 2025-10-03 20:36:52 +01:00
snipe 51789ccbf3 Got tooltips to work on built-in buttons! 2025-10-03 18:54:05 +01:00
snipe 6ae4a9aa1a Added tooltips to custom btn methods 2025-10-03 17:14:47 +01:00
snipe 0aebd669b2 Fixed accessor for console view 2025-10-03 16:25:31 +01:00
snipe 2a92c4899d Don’t use parenthases unless a manufacturer is given 2025-10-03 16:19:00 +01:00
snipe 530089895a Added category and manufacturer to expiring license report 2025-10-03 16:13:00 +01:00
snipe ae8289fc8c Eager load cagory and manufacturer 2025-10-03 16:12:40 +01:00
snipe 90f4dfb48b Use regular blade syntax 2025-10-03 16:03:03 +01:00
snipe ec2eddf538 Add order scope to query 2025-10-03 16:02:07 +01:00
snipe 44d31d4b39 Moved date fields closer together 2025-10-03 16:01:49 +01:00
snipe 4934e7666c Added text string 2025-10-03 16:01:38 +01:00
snipe 35bf0d020e Added breadcrumb to expiring 2025-10-03 16:01:27 +01:00
snipe 4934dc85ac Reverse expires diff direction 2025-10-03 16:00:58 +01:00
snipe 5ceb50d7e5 Added expiring licenses to API and UI 2025-10-03 16:00:23 +01:00
snipe ae7ccbb7bd Fixed icons 2025-10-03 15:59:55 +01:00
snipe 1cd9fc47aa Use diff_in_days instead 2025-10-03 15:03:14 +01:00
snipe 013c50607a Put old setter back because reasons? 2025-10-03 14:46:32 +01:00
snipe d7bf9b7f2e Added more accessors and mutators 2025-10-03 14:38:37 +01:00
snipe 4702fdddc6 Nicer output in console command 2025-10-03 14:38:08 +01:00
snipe dd06a530c0 Added Terminates string 2025-10-03 14:37:43 +01:00
snipe c36125dc95 Added CSS to the message blade 2025-10-03 14:37:25 +01:00
snipe ae43f93d0a Improved expiring assets and licenses email 2025-10-03 14:37:12 +01:00
snipe 8918b17f77 Updated test 2025-10-03 14:36:16 +01:00
snipe dfd05e8b5b Refactored scope 2025-10-03 14:13:58 +01:00
snipe 3daa6dd051 Added accessors for termination date 2025-10-03 14:13:28 +01:00
snipe 14e43192e6 Merge remote-tracking branch 'origin/develop' 2025-10-03 09:17:35 +01:00
snipe 6cf88b1792 Merge pull request #17978 from marcusmoore/17205-replace-form-email-format
Fixed #17205 - replace Form:: email_format
2025-10-03 09:15:49 +01:00
snipe 6b9839367f Merge pull request #17973 from marcusmoore/fixes/17972-update-last-checkin-upon-edit
Fixed #17972 - set last_checkin if asset is checked in during an update
2025-10-03 09:15:35 +01:00
snipe 34fcf5d616 Merge pull request #17974 from marcusmoore/replace-form-checkbox
Replaced Form::checkbox with raw html
2025-10-03 09:15:12 +01:00
snipe 1cf3c74e67 Merge pull request #17979 from akemidx/term-date-on-license-report
Fixed #17977: Term date on license report
2025-10-03 09:14:07 +01:00
snipe 16b57b931e Merge pull request #17980 from marcusmoore/17206-replace-name-display-format-macro
Fixed #17206 - replace Form::name_display_format macro
2025-10-03 09:13:23 +01:00
Marcus Moore 3457e7d617 Remove Form::name_display_format macro 2025-10-02 16:08:37 -07:00
Marcus Moore edbe8001e6 Replace Form::name_display_format 2025-10-02 16:08:16 -07:00
akemidx 71644c1cbe added term date 2025-10-02 19:00:18 -04:00
Marcus Moore 03fd8df8bd Remove Form::email_format 2025-10-02 15:52:09 -07:00
Marcus Moore 71d622b6dd Replace Form:: email_format 2025-10-02 15:51:41 -07:00
Marcus Moore 908c8bc397 Remove Form::checkbox on user create screen 2025-10-02 14:33:48 -07:00
Marcus Moore 93082e1e87 Set last_checkin if asset checked in during update 2025-10-02 13:56:42 -07:00
Marcus Moore ef0a6aa25e Add failing condition 2025-10-02 13:53:19 -07:00
snipe 90afec864e Fixed info text help block class 2025-10-02 08:07:54 +01:00
Marcus Moore 4bbbd786cd Constrain to "uploaded" action_type 2025-10-01 14:37:36 -07:00
snipe 0c1b2a54e7 Merge remote-tracking branch 'origin/develop' 2025-10-01 22:27:06 +01:00
snipe a6ded20ede Merge pull request #17966 from uberbrady/fix_filetype_validation
Cleanups and improvements to output on snipeit:restore command
2025-10-01 22:26:49 +01:00
Brady Wetherington 9b96314371 Cleanups and improvements to output on snipeit:restore command 2025-10-01 22:07:45 +01:00
snipe 85e16ecd51 Merge remote-tracking branch 'origin/develop' 2025-10-01 21:34:50 +01:00
snipe 2ac36cdfd6 Fixed alignment on create-new dropdown in header 2025-10-01 21:32:28 +01:00
snipe e40c532354 Merge remote-tracking branch 'origin/develop' 2025-10-01 12:13:08 +01:00
snipe 9404dff79c Added note about markdown 2025-10-01 12:12:56 +01:00
snipe 55b324d8d6 Merge remote-tracking branch 'origin/develop' 2025-10-01 11:49:15 +01:00
snipe 3ed2e2d79e Added link to docs for common issues in upgrading script 2025-10-01 11:49:05 +01:00
snipe 3152d9eadd Merge remote-tracking branch 'origin/develop' 2025-10-01 11:24:33 +01:00
snipe f1266ab5d6 Check if telescope tables already exist 2025-10-01 11:24:20 +01:00
snipe e70f1408aa Merge remote-tracking branch 'origin/develop' 2025-10-01 11:19:35 +01:00
snipe 664e3984e3 Merge pull request #17877 from grokability/label-cjk-fix
Fixed CJK on labels
2025-10-01 11:16:55 +01:00
snipe 665c13e238 Merge pull request #17957 from marcusmoore/fixes/17956-handle-force-deleted-model-in-asset-edit
Fixed #17956 - handle accessing deleted model during asset update
2025-10-01 11:10:11 +01:00
snipe 8a667b20c2 Merge branch 'develop' into fixes/17956-handle-force-deleted-model-in-asset-edit 2025-10-01 11:09:40 +01:00
snipe 3693241292 Merge pull request #17959 from marcusmoore/fixes/17958-handle-force-deleted-model-in-bulk-edit
Fixes #17958 - handle accessing deleted model during bulk asset update
2025-10-01 11:06:32 +01:00
Marcus Moore 3c3acff79b Fix more attempted access of deleted model 2025-09-30 12:22:26 -07:00
Marcus Moore e15de83a95 Fix attempted access of deleted model 2025-09-30 12:19:12 -07:00
Marcus Moore 636fccbf97 Add failing test 2025-09-30 12:18:51 -07:00
Marcus Moore 7d8ed399a8 Fix accessing force deleted model 2025-09-30 11:27:56 -07:00
Marcus Moore 272385db6c Add failing test 2025-09-30 11:27:38 -07:00
snipe 9334b8df47 Improve Bug Report template details
Updated version placeholders and descriptions for clarity.
2025-09-30 11:57:06 +01:00
snipe e0bc2ae86f Add PHP and Composer version fields to bug report 2025-09-30 11:45:55 +01:00
snipe 2f019bb033 Merge remote-tracking branch 'origin/develop' 2025-09-30 11:40:34 +01:00
snipe 291be64aa0 Refined remnaining asset count for archived 2025-09-30 11:40:21 +01:00
snipe 75c83236ff Merge remote-tracking branch 'origin/develop' 2025-09-30 11:20:44 +01:00
snipe 72be171917 Added archived to model view 2025-09-30 11:20:33 +01:00
snipe 4ddee4ac40 Merge remote-tracking branch 'origin/develop' 2025-09-30 10:55:00 +01:00
snipe 43cd0d7eb3 Use min_amt formatter 2025-09-30 10:54:43 +01:00
snipe 6b693e2644 Merge remote-tracking branch 'origin/develop' 2025-09-30 10:51:35 +01:00
snipe eeea69d8f2 Make available_assets_count sortable 2025-09-30 10:51:25 +01:00
snipe 72cf921a4b Merge remote-tracking branch 'origin/develop' 2025-09-30 10:46:12 +01:00
snipe bec88a0441 Merge pull request #17950 from grokability/#17932-fix-remaining-counts-in-model-listing
Fixed #17932 - incorrect number for remaining assets in asset models
2025-09-29 20:55:52 +01:00
snipe 6e67e3a8a0 Fixed #17932 - incorrect number for remaining assets in asset models 2025-09-29 20:55:06 +01:00
snipe 4dc3c30354 Merge remote-tracking branch 'origin/develop' 2025-09-29 19:04:42 +01:00
snipe 947ccf911d Merge pull request #17868 from Godmartinz/adds-Tze_24mm-variant
Adds Brother Label TZe_24mm_E variant
2025-09-29 15:48:10 +01:00
snipe 06f313febe Merge pull request #17869 from marcusmoore/api-components-assigned-to-asset
Added api endpoint for retrieving components checked out to asset
2025-09-29 15:47:53 +01:00
snipe b387136b8f Merge pull request #17883 from akemidx/purchasepricereportfilter
FEATURE: Purchase Cost Report Filter
2025-09-29 15:37:39 +01:00
snipe 31614c5da1 Merge pull request #17888 from marcusmoore/fixes/bulk-checkout-extra-requests
Fixed excessive api requests on bulk checkout page
2025-09-29 14:46:19 +01:00
snipe 146b5a3085 Merge pull request #17933 from marcusmoore/17914-bulk-checkout-error-ux
Fixed #17914 - Improve UX around attempted bulk checkout of assigned assets
2025-09-29 14:44:20 +01:00
snipe 397cc1754a Merge remote-tracking branch 'origin/develop' 2025-09-29 11:05:45 +01:00
snipe ff1297cac5 Merge pull request #17945 from kingspride/develop
with --no-interactive, make composer non-interactive aswell
2025-09-29 11:04:30 +01:00
William Kirstaedter 8af3cf4056 with --no-interactive, make composer non-interactive aswell 2025-09-29 11:39:23 +02:00
Marcus Moore 9edec9e212 Extract translation 2025-09-25 11:09:27 -07:00
snipe be4362c59a Merge pull request #17925 from Godmartinz/fix-factory-auto-gen-action-logs
Adds option to disable auto generating action log from acceptance factory
2025-09-25 11:10:34 +01:00
Marcus Moore 8461b147de Link to removed assets 2025-09-24 16:38:48 -07:00
Godfrey M 82bdd43168 renamed variable 2025-09-24 15:38:30 -07:00
Godfrey M 533d82d4d8 remove unnecessary changes 2025-09-24 15:34:02 -07:00
Godfrey M 6f990dd1de adds an option to disable Auto assigned an actionlogs in factories 2025-09-24 15:27:16 -07:00
Marcus Moore be848598e3 Keep removed asset out of scope of partial 2025-09-24 14:32:25 -07:00
snipe 62a58fa23b Merge remote-tracking branch 'origin/develop' 2025-09-24 14:52:55 +01:00
snipe 7d0742054f Merge pull request #17923 from uberbrady/fix_checkout_type_selector2
Fixed #17919 - correct the behavior of the checkout type selector
2025-09-24 14:52:05 +01:00
Brady Wetherington dcf7e83507 Remove extra pointless class="active" 2025-09-24 14:47:13 +01:00
Brady Wetherington 407c2bf0c8 Switch to ?: from ?? to better handle empty strings 2025-09-24 14:45:43 +01:00
Brady Wetherington c46227ee94 Fix to the checkout-selector issue 2025-09-24 14:28:49 +01:00
snipe d8171eb056 Remove duplicate PUT route for hardware assets
Removed duplicate route definition for updating hardware assets.
2025-09-23 13:24:56 +01:00
snipe c67ca500db Clarify descriptions for multiple company support 2025-09-23 13:06:33 +01:00
snipe 0081e7b731 Revise demo reproduction question in Bug Report template 2025-09-23 13:05:26 +01:00
snipe 4e6483d3ed Enhance Bug Report template with required validations
Make fields required
2025-09-23 13:04:19 +01:00
snipe 0ddf0002c4 Change dropdown options to single quotes in Bug Report
Fixed quotes
2025-09-23 13:02:36 +01:00
snipe ad0daf33b9 Add dropdown options to Bug Report template
Added additional fields to bug report template related to FMCS
2025-09-23 13:01:37 +01:00
Marcus Moore c614c44d4c Remove assigned assets from bulk checkout 2025-09-22 16:04:29 -07:00
snipe 8a46579588 Merge pull request #17887 from marcusmoore/fixes/17404-prevent-bulk-checkout-across-companies
Fixed #17404 - Disallow bulk checkout of assets across companies
2025-09-22 18:57:43 +01:00
Marcus Moore fb9fb9c097 Merge branch 'develop' into fixes/17404-prevent-bulk-checkout-across-companies
# Conflicts:
#	app/Http/Controllers/Assets/BulkAssetsController.php
#	tests/Feature/Checkouts/Ui/BulkAssetCheckoutTest.php
2025-09-22 10:52:04 -07:00
snipe d9399534ce Merge pull request #17909 from spacjalex/17908-fix-typo
Fix #17908: typo in storage location of backups
2025-09-22 14:28:05 +01:00
spacjalex 17a749bbed fix typo 2025-09-22 15:23:14 +02:00
snipe 0b60c6a939 Merge remote-tracking branch 'origin/develop'
# Conflicts:
#	public/css/build/app.css
#	public/css/build/app.css.map
#	public/css/build/overrides.css
#	public/css/build/overrides.css.map
#	public/css/dist/all.css
#	public/mix-manifest.json
2025-09-19 12:44:49 +01:00
snipe 25ce63f00b Merge pull request #17904 from grokability/#17804-searchable-columns
Fixed #17804 - make columns searchable in column picker
2025-09-19 12:43:46 +01:00
snipe 2462bc05b3 Added column search to additional views 2025-09-19 12:41:30 +01:00
snipe c3748da0b1 Fixed #17804 - make columns searchable in column picker 2025-09-19 12:16:56 +01:00
snipe 90c242a441 Merge pull request #17897 from marcusmoore/fixes/17896-prevent-bulk-checkout-of-checked-out-assets
Fixed #17896 - Prevent assigned assets from being bulk checked out
2025-09-19 07:03:43 +01:00
Marcus Moore 52239a88b5 Improve test name 2025-09-18 17:27:17 -07:00
Marcus Moore 7a3596c86d Test against other types 2025-09-18 17:21:27 -07:00
Marcus Moore ac8a9e38f0 Implement fix 2025-09-18 17:18:27 -07:00
Marcus Moore 5c08f3a27e Add failing test 2025-09-18 17:14:33 -07:00
Marcus Moore 2dc11a84bf Fix test name 2025-09-18 17:05:08 -07:00
Marcus Moore 2960ea15f5 Consolidate to data provider 2025-09-18 14:29:12 -07:00
Marcus Moore 17aab4c490 Implement test 2025-09-18 14:20:05 -07:00
Marcus Moore 59d0f0d292 Re-order assertions 2025-09-18 14:05:13 -07:00
Marcus Moore 27d13a113a Implement test 2025-09-18 14:01:44 -07:00
Marcus Moore c58e999fbb Scaffold tests 2025-09-18 13:11:06 -07:00
Marcus Moore a02a96d5c4 Extract translation string 2025-09-18 12:57:56 -07:00
Marcus Moore 47e9e4704d Improve error message 2025-09-18 12:56:36 -07:00
Marcus Moore b2ad9d404e Fix re-population of assets 2025-09-18 12:38:11 -07:00
Marcus Moore 705474dc14 Avoid pre-loading all assets on page load 2025-09-17 16:56:37 -07:00
Marcus Moore e639d7726b Disallow bulk checkout across companies 2025-09-17 14:32:27 -07:00
Marcus Moore e29b0aa6a4 Add todo 2025-09-17 13:55:54 -07:00
Marcus Moore d2157868f2 Populate failing test 2025-09-17 13:49:32 -07:00
Marcus Moore 89cfafd933 Scaffold test 2025-09-17 13:40:34 -07:00
akemidx 69c5dbfc23 formatting 2025-09-17 05:39:45 -04:00
akemidx cf1bccfd65 prep for val 2025-09-16 15:24:44 -04:00
akemidx 99acf018f1 validation rule & query 2025-09-16 15:17:59 -04:00
akemidx cb63c12d2f i think this is gonna need livewire to validate lol 2025-09-16 08:24:22 -04:00
akemidx 6ce0fd20ce works, needs error handling 2025-09-16 08:11:42 -04:00
snipe b383cd9493 Fixed CJK on labels 2025-09-16 12:10:01 +01:00
Marcus Moore 06f060161d Apply offset and limit 2025-09-15 15:43:54 -07:00
Marcus Moore 73e0628124 Populate test 2025-09-15 15:26:30 -07:00
Marcus Moore 7393c4170b Apply first pass and scaffold additional test 2025-09-15 15:22:35 -07:00
Marcus Moore 73e185bf9d Scaffold route and tests 2025-09-15 15:12:05 -07:00
Godfrey M 77153c3e78 adds Tze_24mm variant 2025-09-15 11:20:35 -07:00
akemidx 50e210b2db fixing naming convention to match 2025-09-10 17:35:09 -04:00
akemidx b1de98f05d first front end 2025-09-09 19:18:29 -04:00
926 changed files with 5837 additions and 3414 deletions
+59 -1
View File
@@ -23,7 +23,23 @@ body:
attributes:
label: Snipe-IT Version
description: What version of Snipe-IT are you seeing this issue on? You can find the version number in the footer of any page in Snipe-IT.
placeholder: ex. v8.3.1 - build 19577 (master)
placeholder: ex. v8.3.2 - build 19577 (master)
validations:
required: true
- type: input
id: php-version
attributes:
label: PHP Version
description: What version of PHP are you running? You can find the version of PHP your webserver is running in the `Admin Settings` section in the footer, and the cli version by running `php -v` via command line .
placeholder: ex. v8.3.1 (web), PHP 8.4.12 (cli)
validations:
required: true
- type: input
id: composer-version
attributes:
label: Composer Version
description: What version of composer are you running? You can find the version number by running `composer --version`.
placeholder: ex. 2.8.10
validations:
required: true
- type: input
@@ -48,6 +64,16 @@ body:
- Not sure
validations:
required: true
- type: dropdown
id: upgrade-or-fresh
attributes:
label: Is this a fresh install or an upgrade?
options:
- Fresh install
- Upgrade
- NA
validations:
required: true
- type: textarea
id: what-happened
attributes:
@@ -67,6 +93,38 @@ body:
- Safari
- Microsoft Edge
- Other
- type: dropdown
id: on-demo
attributes:
label: Can you reproduce this on the public demo?
description: You can check this at https://demo.snipeitapp.com.
options:
- 'Yes'
- 'No'
- N/A
validations:
required: true
- type: dropdown
id: fmcs
attributes:
label: Do you have full multiple company support enabled?
description: You can check this in your Snipe-IT installation at `Admin Settings > General Settings > Scoping`.
options:
- 'Yes'
- 'No'
validations:
required: true
- type: dropdown
id: fmcs-location
attributes:
label: If you have full multiple company support enabled, do you have location scoping to company enabled?
description: You can check this in your Snipe-IT installation at `Admin Settings > General Settings > Scoping`.
options:
- 'Yes'
- 'No'
- I do not have full multiple company support enabled
validations:
required: true
- type: textarea
id: server-logs
attributes:
+98 -51
View File
@@ -5,6 +5,7 @@ namespace App\Console\Commands;
use Illuminate\Console\Command;
use ZipArchive;
use Illuminate\Support\Facades\Log;
use enshrined\svgSanitize\Sanitizer;
class SQLStreamer {
private $input;
@@ -242,9 +243,10 @@ class RestoreFromBackup extends Command
$private_dirs = [
'storage/private_uploads/accessories',
'storage/private_uploads/assetmodels',
'storage/private_uploads/maintenances',
'storage/private_uploads/models',
'storage/private_uploads/assetmodels' => 'storage/private_uploads/models', //this was changed from assetmodels => models Aug 10 2025
'storage/private_uploads/asset_maintenances' => 'storage/private_uploads/maintenances', //this was changed from asset_maintenances => maintenances Aug 10 2025
'storage/private_uploads/maintenances', //but let 'maintenances' take precedence
'storage/private_uploads/models', //and let 'models' take precedence
'storage/private_uploads/assets', // these are asset _files_, not the pictures.
'storage/private_uploads/audits',
'storage/private_uploads/components',
@@ -262,7 +264,7 @@ class RestoreFromBackup extends Command
];
$public_dirs = [
'public/uploads/accessories',
'public/uploads/assetmodels',
// 'public/uploads/assetmodels' => 'public/uploads/models', //according to git, this was _never_ a thing... (see below)
'public/uploads/maintenances',
'public/uploads/assets', // these are asset _pictures_, not asset files
'public/uploads/avatars',
@@ -273,7 +275,7 @@ class RestoreFromBackup extends Command
'public/uploads/departments',
'public/uploads/locations',
'public/uploads/manufacturers',
'public/uploads/models',
'public/uploads/models', // ...it's been this way for 9 years (as of late 2025)
'public/uploads/suppliers',
];
@@ -286,8 +288,6 @@ class RestoreFromBackup extends Command
'public/uploads/favicon-uploaded.*',
];
$all_files = $private_dirs + $public_dirs;
$sqlfiles = [];
$sqlfile_indices = [];
@@ -295,6 +295,20 @@ class RestoreFromBackup extends Command
$boring_files = [];
$unsafe_files = [];
$good_extensions = config('filesystems.allowed_upload_extensions_array');
$private_extensions = array_merge($good_extensions, ["csv", "key"]); //add csv, and 'key'
$public_extensions = array_diff($good_extensions, ["xml"]); //remove xml
$sanitizer = new Sanitizer();
/**
* TODO: I _hate_ the "continue 3" thing we keep doing here
* I think a better approach might be to have the "each file" stuff be in a method on this class, and the
* boring_files and interesting_files be properties on it that we fill out. Then, in that method, we could
* just do a 'return' once the file is actually handled (yay or nay). We could also start to break out some of
* the _other_ things that we do into their own methods too? But I don't care about that as much.
*/
for ($i = 0; $i < $za->numFiles; $i++) {
$stat_results = $za->statIndex($i);
// echo "index: $i\n";
@@ -309,7 +323,7 @@ class RestoreFromBackup extends Command
// skip macOS resource fork files (?!?!?!)
if (strpos($raw_path, '__MACOSX') !== false && strpos($raw_path, '._') !== false) {
//print "SKIPPING macOS Resource fork file: $raw_path\n";
$boring_files[] = $raw_path;
// $boring_files[] = $raw_path; //stop adding this to the boring files list; it's just confusing
continue;
}
if (@pathinfo($raw_path, PATHINFO_EXTENSION) == 'sql') {
@@ -318,44 +332,70 @@ class RestoreFromBackup extends Command
$sqlfile_indices[] = $i;
continue;
}
if ($raw_path[-1] == '/') {
//last character is '/' - this is a directory, and we don't need it, and we don't need to warn about it
continue;
}
if (in_array(basename($raw_path), [".gitkeep", ".gitignore", ".DS_Store"])) {
//skip these boring files silently without reporting on them; they're stupid
continue;
}
$extension = strtolower(pathinfo($raw_path, PATHINFO_EXTENSION));
foreach (array_merge($private_dirs, $public_dirs) as $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];
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
//print("FOUND THE EXACT DIRECTORY: $dir AT: $raw_path!!!\n");
foreach (['public' => $public_dirs, 'private' => $private_dirs] as $purpose => $dirs) {
$allowed_extensions = match ($purpose) {
'public' => $public_extensions,
'private' => $private_extensions,
};
foreach ($dirs as $dir => $destdir) {
if (is_int($dir)) {
$dir = $destdir;
}
$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?
//the CSV bit, below, is because we store CSV files as "blahcsv" - without an extension
if (!in_array($extension, $allowed_extensions) && !($dir == "storage/private_uploads/imports" && substr($raw_path, -3) == "csv" && $extension == "")) {
$unsafe_files[] = $raw_path;
Log::debug($raw_path . ' from directory ' . $dir . ' is being skipped');
} else {
if ($dir != $destdir) {
Log::debug("Getting ready to save file $raw_path to new directory $destdir");
}
$interesting_files[$raw_path] = ['dest' => $destdir, 'index' => $i];
}
continue 3;
}
}
}
$good_extensions = config('filesystems.allowed_upload_extensions_array');
foreach (array_merge($private_files, $public_files) as $file) {
$has_wildcard = (strpos($file, '*') !== false);
if ($has_wildcard) {
$file = substr($file, 0, -1); //trim last character (which should be the wildcard)
}
$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)) {
// gathering potentially unsafe files here to return at exit
$unsafe_files[] = $raw_path;
Log::debug('Potentially unsafe file '.$raw_path.' is being skipped');
$boring_files[] = $raw_path;
continue 2;
foreach (['public' => $public_files, 'private' => $private_files] as $purpose => $files) {
$allowed_extensions = match ($purpose) {
'public' => $public_extensions,
'private' => $private_extensions,
};
foreach ($files as $file) {
$has_wildcard = (strpos($file, '*') !== false);
if ($has_wildcard) {
$file = substr($file, 0, -1); //trim last character (which should be the wildcard)
}
//print("INTERESTING - last_pos is $last_pos when searching $raw_path for $file - last_pos+strlen(\$file) is: ".($last_pos+strlen($file))." and strlen(\$rawpath) is: ".strlen($raw_path)."\n");
//no wildcards found in $file, process 'normally'
if ($last_pos + strlen($file) == strlen($raw_path) || $has_wildcard) { //again, no trailing slash. or this is a wildcard and we just take it.
// print("FOUND THE EXACT FILE: $file AT: $raw_path!!!\n"); //we *do* care about this, though.
$interesting_files[$raw_path] = ['dest' => dirname($file), 'index' => $i];
continue 2;
$last_pos = strrpos($raw_path, $file); // no trailing slash!
if ($last_pos !== false) {
if (!in_array($extension, $allowed_extensions)) {
// gathering potentially unsafe files here to return at exit
$unsafe_files[] = $raw_path;
Log::debug('Potentially unsafe file ' . $raw_path . ' is being skipped');
$boring_files[] = $raw_path;
continue 3;
}
//print("INTERESTING - last_pos is $last_pos when searching $raw_path for $file - last_pos+strlen(\$file) is: ".($last_pos+strlen($file))." and strlen(\$rawpath) is: ".strlen($raw_path)."\n");
//no wildcards found in $file, process 'normally'
if ($last_pos + strlen($file) == strlen($raw_path) || $has_wildcard) { //again, no trailing slash. or this is a wildcard and we just take it.
// print("FOUND THE EXACT FILE: $file AT: $raw_path!!!\n"); //we *do* care about this, though.
$interesting_files[$raw_path] = ['dest' => dirname($file), 'index' => $i];
continue 3;
}
}
}
}
@@ -492,18 +532,25 @@ class RestoreFromBackup extends Command
}
foreach ($interesting_files as $pretty_file_name => $file_details) {
$ugly_file_name = $za->statIndex($file_details['index'])['name'];
$fp = $za->getStream($ugly_file_name);
//$this->info("Weird problem, here are file details? ".print_r($file_details,true));
if (!is_dir($file_details['dest'])) {
mkdir($file_details['dest'], 0755, true); //0755 is what Laravel uses, so we do that
$migrated_file_name = $file_details['dest'] . '/' . basename($pretty_file_name);
if (strcasecmp(substr($pretty_file_name, -4), ".svg") === 0) {
$svg_contents = $za->getFromIndex($file_details['index']);
$cleaned_svg = $sanitizer->sanitize($svg_contents);
file_put_contents($migrated_file_name, $cleaned_svg);
} else {
$fp = $za->getStream($ugly_file_name);
//$this->info("Weird problem, here are file details? ".print_r($file_details,true));
if (!is_dir($file_details['dest'])) {
mkdir($file_details['dest'], 0755, true); //0755 is what Laravel uses, so we do that
}
$migrated_file = fopen($migrated_file_name, 'w');
while (($buffer = fgets($fp, SQLStreamer::$buffer_size)) !== false) {
fwrite($migrated_file, $buffer);
}
fclose($migrated_file);
fclose($fp);
//$this->info("Wrote $ugly_file_name to $pretty_file_name");
}
$migrated_file = fopen($file_details['dest'].'/'.basename($pretty_file_name), 'w');
while (($buffer = fgets($fp, SQLStreamer::$buffer_size)) !== false) {
fwrite($migrated_file, $buffer);
}
fclose($migrated_file);
fclose($fp);
//$this->info("Wrote $ugly_file_name to $pretty_file_name");
if ($bar) {
$bar->advance();
}
+44 -6
View File
@@ -60,19 +60,57 @@ class SendExpirationAlerts extends Command
Mail::to($recipients)->send(new ExpiringAssetsMail($assets, $alert_interval));
$this->table(
['ID', 'Tag', 'Model', 'Model Number', 'EOL', 'EOL Months', 'Warranty Expires', 'Warranty Months'],
$assets->map(fn($item) => ['ID' => $item->id, 'Tag' => $item->asset_tag, 'Model' => $item->model->name, 'Model Number' => $item->model->model_number, 'EOL' => $item->asset_eol_date, 'EOL Months' => $item->model->eol, 'Warranty Expires' => $item->warranty_expires, 'Warranty Months' => $item->warranty_months])
);
[
trans('general.id'),
trans('admin/hardware/form.tag'),
trans('admin/hardware/form.model'),
trans('general.model_no'),
trans('general.purchase_date'),
trans('admin/hardware/form.eol_rate'),
trans('admin/hardware/form.eol_date'),
trans('admin/hardware/form.warranty_expires'),
],
$assets->map(fn($item) =>
[
trans('general.id') => $item->id,
trans('admin/hardware/form.tag') => $item->asset_tag,
trans('admin/hardware/form.model') => $item->model->name,
trans('general.model_no') => $item->model->model_number,
trans('general.purchase_date') => $item->purchase_date_formatted,
trans('admin/hardware/form.eol_rate') => $item->model->eol,
trans('admin/hardware/form.eol_date') => $item->eol_date ? $item->eol_formatted_date .' ('.$item->eol_diff_for_humans.')' : '',
trans('admin/hardware/form.warranty_expires') => $item->warranty_expires ? $item->warranty_expires_formatted_date .' ('.$item->warranty_expires_diff_for_humans.')' : '',
])
);
}
// Expiring licenses
$licenses = License::getExpiringLicenses($alert_interval);
$licenses = License::query()->ExpiringLicenses($alert_interval)
->with('manufacturer','category')
->orderBy('expiration_date', 'ASC')
->orderBy('termination_date', 'ASC')
->get();
if ($licenses->count() > 0) {
Mail::to($recipients)->send(new ExpiringLicenseMail($licenses, $alert_interval));
$this->table(
['ID', 'Name', 'Expires', 'Termination Date'],
$licenses->map(fn($item) => ['ID' => $item->id, 'Name' => $item->name, 'Expires' => $item->expiration_date, 'Termination Date' => $item->termination_date])
[
trans('general.id'),
trans('general.name'),
trans('general.purchase_date'),
trans('admin/licenses/form.expiration'),
trans('mail.expires'),
trans('admin/licenses/form.termination_date'),
trans('mail.terminates')],
$licenses->map(fn($item) => [
trans('general.id') => $item->id,
trans('general.name') => $item->name,
trans('general.purchase_date') => $item->purchase_date_formatted,
trans('admin/licenses/form.expiration') => $item->expires_formatted_date,
trans('mail.expires') => $item->expires_diff_for_humans,
trans('admin/licenses/form.termination_date') => $item->terminates_formatted_date,
trans('mail.terminates') => $item->terminates_diff_for_humans
])
);
}
@@ -77,7 +77,6 @@ class AcceptanceController extends Controller
$acceptance = CheckoutAcceptance::find($id);
$assigned_user = User::find($acceptance->assigned_to_id);
$settings = Setting::getSettings();
$path_logo = '';
$sig_filename='';
@@ -138,6 +137,13 @@ class AcceptanceController extends Controller
}
// Convert PDF logo to base64 for TCPDF
// This is needed for TCPDF to properly embed the image if it's a png and the cache isn't writable
$encoded_logo = null;
if ($settings->acceptance_pdf_logo) {
$encoded_logo = base64_encode(file_get_contents(public_path() . '/uploads/' . $settings->acceptance_pdf_logo));
}
// Get the data array ready for the notifications and PDF generation
$data = [
'item_tag' => $item->asset_tag,
@@ -153,8 +159,8 @@ class AcceptanceController extends Controller
'assigned_to' => $assigned_user->display_name,
'site_name' => $settings->site_name,
'company_name' => $item->company?->name?? $settings->site_name,
'signature' => ($sig_filename) ? storage_path() . '/private_uploads/signatures/' . $sig_filename : null,
'logo' => ($settings->acceptance_pdf_logo) ? public_path() . '/uploads/' . $settings->acceptance_pdf_logo : null,
'signature' => (($sig_filename && array_key_exists('1', $encoded_image))) ? $encoded_image[1] : null,
'logo' => ($encoded_logo) ?? null,
'date_settings' => $settings->date_display_format,
'admin' => auth()->user()->present()?->fullName,
'qty' => $acceptance->qty ?? 1,
@@ -46,6 +46,9 @@ class AssetModelsController extends Controller
'manufacturer',
'requestable',
'assets_count',
'assets_assigned_count',
'assets_archived_count',
'remaining',
'category',
'fieldset',
'deleted_at',
@@ -73,7 +76,10 @@ class AssetModelsController extends Controller
'models.require_serial'
])
->with('category', 'depreciation', 'manufacturer', 'fieldset.fields.defaultValues', 'adminuser')
->withCount('assets as assets_count');
->withCount('assets as assets_count')
->withCount('availableAssets as remaining')
->withCount('assignedAssets as assets_assigned_count')
->withCount('archivedAssets as assets_archived_count');
if ($request->input('status')=='deleted') {
$assetmodels->onlyTrashed();
@@ -6,6 +6,7 @@ use App\Events\CheckoutableCheckedIn;
use App\Http\Requests\StoreAssetRequest;
use App\Http\Requests\UpdateAssetRequest;
use App\Http\Traits\MigratesLegacyAssetLocations;
use App\Http\Transformers\ComponentsTransformer;
use App\Models\AccessoryCheckout;
use App\Models\CheckoutAcceptance;
use App\Models\LicenseSeat;
@@ -1322,6 +1323,18 @@ class AssetsController extends Controller
return (new AssetsTransformer)->transformCheckedoutAccessories($accessory_checkouts, $total);
}
public function assignedComponents(Request $request, Asset $asset): JsonResponse|array
{
$this->authorize('view', Asset::class);
$this->authorize('view', $asset);
$asset->loadCount('components');
$total = $asset->components_count;
$components = $asset->load(['components' => fn($query) => $query->applyOffsetAndLimit($total)])->components;
return (new ComponentsTransformer)->transformComponents($components, $total);
}
/**
* Generate asset labels by tag
@@ -7,6 +7,7 @@ use App\Http\Controllers\Controller;
use App\Http\Transformers\LicensesTransformer;
use App\Http\Transformers\SelectlistTransformer;
use App\Models\License;
use App\Models\Setting;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\JsonResponse;
@@ -25,9 +26,12 @@ class LicensesController extends Controller
$this->authorize('view', License::class);
$licenses = License::with('company', 'manufacturer', 'supplier','category', 'adminuser')->withCount('freeSeats as free_seats_count');
$settings = Setting::getSettings();
if ($request->input('status')=='inactive') {
$licenses->ExpiredLicenses();
} elseif ($request->input('status')=='expiring') {
$licenses->ExpiringLicenses($settings->alert_interval);
} else {
$licenses->ActiveLicenses();
}
@@ -193,8 +193,12 @@ class UploadedFilesController extends Controller
// Check for the file
$log = Actionlog::find($file_id)->where('item_type', self::$map_object_type[$object_type])
->where('item_id', $object->id)->first();
$log = Actionlog::query()
->where('id', $file_id)
->where('action_type', 'uploaded')
->where('item_type', self::$map_object_type[$object_type])
->where('item_id', $object->id)
->first();
if ($log) {
// Check the file actually exists, and delete it
@@ -213,4 +217,4 @@ class UploadedFilesController extends Controller
return response()->json(Helper::formatStandardApiResponse('error', null, trans_choice('general.file_upload_status.delete.error', 1)), 500);
}
}
}
@@ -363,7 +363,7 @@ class AssetsController extends Controller
$asset->purchase_cost = $request->input('purchase_cost', null);
$asset->purchase_date = $request->input('purchase_date', null);
$asset->next_audit_date = $request->input('next_audit_date', null);
if ($request->filled('purchase_date') && !$request->filled('asset_eol_date') && ($asset->model->eol > 0)) {
if ($request->filled('purchase_date') && !$request->filled('asset_eol_date') && ($asset->model?->eol > 0)) {
$asset->purchase_date = $request->input('purchase_date', null);
$asset->asset_eol_date = Carbon::parse($request->input('purchase_date'))->addMonths($asset->model->eol)->format('Y-m-d');
$asset->eol_explicit = false;
@@ -379,7 +379,7 @@ class AssetsController extends Controller
} else {
$asset->eol_explicit = true;
}
} elseif (!$request->filled('asset_eol_date') && (($asset->model->eol) == 0)) {
} elseif (!$request->filled('asset_eol_date') && (($asset->model?->eol) == 0)) {
$asset->asset_eol_date = null;
$asset->eol_explicit = false;
}
@@ -398,6 +398,7 @@ class AssetsController extends Controller
$asset->assigned_to = null;
$asset->assigned_type = null;
$asset->accepted = null;
$asset->last_checkin = now();
event(new CheckoutableCheckedIn($asset, $target, auth()->user(), 'Checkin on asset update with '.$status->getStatuslabelType().' status', date('Y-m-d H:i:s'), $originalValues));
}
@@ -163,7 +163,7 @@ class BulkAssetsController extends Controller
$modelNames = [];
foreach($models as $model) {
$modelNames[] = $model->model->name;
$modelNames[] = $model->model?->name;
}
if ($request->filled('bulk_actions')) {
@@ -470,7 +470,7 @@ class BulkAssetsController extends Controller
*/
// Does the model have a fieldset?
if ($asset->model->fieldset) {
if ($asset->model?->fieldset) {
foreach ($asset->model->fieldset->fields as $field) {
// null custom fields
@@ -621,9 +621,25 @@ class BulkAssetsController extends Controller
{
$this->authorize('checkout', Asset::class);
$alreadyAssigned = collect();
if (old('selected_assets') && is_array(old('selected_assets'))) {
$assets = Asset::findMany(old('selected_assets'));
[$assignable, $alreadyAssigned] = $assets->partition(function (Asset $asset) {
return !$asset->assigned_to;
});
session()->flashInput(['selected_assets' => $assignable->pluck('id')->values()->toArray()]);
}
$do_not_change = ['' => trans('general.do_not_change')];
$status_label_list = $do_not_change + Helper::deployableStatusLabelList();
return view('hardware/bulk-checkout')->with('statusLabel_list', $status_label_list);
return view('hardware/bulk-checkout', [
'statusLabel_list' => $status_label_list,
'removed_assets' => $alreadyAssigned,
]);
}
/**
@@ -647,6 +663,30 @@ class BulkAssetsController extends Controller
$assets = Asset::findOrFail($asset_ids);
// Prevent checking out assets that are already checked out
if ($assets->pluck('assigned_to')->unique()->filter()->isNotEmpty()) {
// re-add the asset ids so the assets select is re-populated
$request->session()->flashInput(['selected_assets' => $asset_ids]);
return redirect(route('hardware.bulkcheckout.show'))
->with('error', trans('general.error_assets_already_checked_out'));
}
// Prevent checking out assets across companies if FMCS enabled
if (Setting::getSettings()->full_multiple_companies_support && $target->company_id) {
$company_ids = $assets->pluck('company_id')->unique();
// if there is more than one unique company id or the singular company id does not match
// then the checkout is invalid
if ($company_ids->count() > 1 || $company_ids->first() != $target->company_id) {
// re-add the asset ids so the assets select is re-populated
$request->session()->flashInput(['selected_assets' => $asset_ids]);
return redirect(route('hardware.bulkcheckout.show'))
->with('error', trans('general.error_user_company_multiple'));
}
}
if (request('checkout_to_type') == 'asset') {
foreach ($asset_ids as $asset_id) {
if ($target->id == $asset_id) {
@@ -685,6 +685,14 @@ class ReportsController extends Controller
$assets->whereBetween('assets.purchase_date', [$request->input('purchase_start'), $request->input('purchase_end')]);
}
if ($request->filled('purchase_cost_start')) {
if ($request->filled('purchase_cost_end')) {
$assets->whereBetween('assets.purchase_cost', [$request->input('purchase_cost_start'), $request->input('purchase_cost_end')]);
} else {
$assets->where('assets.purchase_cost', ">", $request->input('purchase_cost_start'));
}
}
if (($request->filled('created_start')) && ($request->filled('created_end'))) {
$created_start = Carbon::parse($request->input('created_start'))->startOfDay();
$created_end = Carbon::parse($request->input('created_end'))->endOfDay();
@@ -14,6 +14,15 @@ class CustomAssetReportRequest extends Request
return true;
}
public function prepareForValidation()
{
if($this->filled('purchase_cost_end') && !$this->filled('purchase_cost_start')){
$this->merge(['purchase_cost_start' => 0 ]);
}
}
/**
* Get the validation rules that apply to the request.
*
@@ -24,6 +33,7 @@ class CustomAssetReportRequest extends Request
return [
'purchase_start' => 'date|date_format:Y-m-d|nullable',
'purchase_end' => 'date|date_format:Y-m-d|nullable',
'purchase_cost_end' => 'numeric|nullable|gte:purchase_cost_start',
'created_start' => 'date|date_format:Y-m-d|nullable',
'created_end' => 'date|date_format:Y-m-d|nullable',
'checkout_date_start' => 'date|date_format:Y-m-d|nullable',
@@ -48,12 +48,15 @@ class AssetModelsTransformer
'image' => ($assetmodel->image != '') ? Storage::disk('public')->url('models/'.e($assetmodel->image)) : null,
'model_number' => ($assetmodel->model_number ? e($assetmodel->model_number): null),
'min_amt' => ($assetmodel->min_amt) ? (int) $assetmodel->min_amt : null,
'remaining' => (int) ($assetmodel->assets_count - $assetmodel->min_amt),
'depreciation' => ($assetmodel->depreciation) ? [
'id' => (int) $assetmodel->depreciation->id,
'name'=> e($assetmodel->depreciation->name),
] : null,
'assets_count' => (int) $assetmodel->assets_count,
'assets_assigned_count' => (int) $assetmodel->assets_assigned_count,
'assets_archived_count' => (int) $assetmodel->assets_archived_count,
'remaining' => (int) ($assetmodel->assets_count - (int) $assetmodel->assets_assigned_count) - (int) $assetmodel->assets_archived_count,
'category' => ($assetmodel->category) ? [
'id' => (int) $assetmodel->category->id,
'name'=> e($assetmodel->category->name),
+69 -12
View File
@@ -227,7 +227,6 @@ class Asset extends Depreciable
}
public function customFieldValidationRules()
{
@@ -266,7 +265,6 @@ class Asset extends Depreciable
return parent::save($params);
}
public function getDisplayNameAttribute()
{
return $this->present()->name();
@@ -277,20 +275,79 @@ class Asset extends Depreciable
*
* @return \Carbon\Carbon|null
*/
public function getWarrantyExpiresAttribute()
protected function warrantyExpires(): Attribute
{
if (isset($this->attributes['warranty_months']) && isset($this->attributes['purchase_date'])) {
if (is_string($this->attributes['purchase_date']) || is_string($this->attributes['purchase_date'])) {
$purchase_date = \Carbon\Carbon::parse($this->attributes['purchase_date']);
} else {
$purchase_date = \Carbon\Carbon::instance($this->attributes['purchase_date']);
return Attribute:: make(
get: fn(mixed $value, array $attributes) => ($attributes['warranty_months'] && $attributes['purchase_date']) ? Carbon::parse($attributes['purchase_date'])->addMonths($attributes['warranty_months']) : null,
);
}
protected function warrantyExpiresFormattedDate(): Attribute
{
return Attribute:: make(
get: fn(mixed $value, array $attributes) => Helper::getFormattedDateObject($this->warrantyExpires, 'date', false)
);
}
protected function warrantyExpiresDiff(): Attribute
{
return Attribute:: make(
get: fn(mixed $value, array $attributes) => $this->warrantyExpires ? round((Carbon::now()->diffInDays($this->warrantyExpires))) : null,
);
}
protected function warrantyExpiresDiffForHumans(): Attribute
{
return Attribute:: make(
get: fn(mixed $value, array $attributes) => $this->warrantyExpires ? Carbon::parse($this->warrantyExpires)->diffForHumans() : null,
);
}
protected function eolDate(): Attribute
{
return Attribute:: make(
get: function(mixed $value, array $attributes) {
if ($attributes['asset_eol_date'] && $attributes['eol_explicit'] == '1') {
return Carbon::parse($attributes['asset_eol_date']);
} elseif ($attributes['purchase_date'] && $this->model && ((int) $this->model->eol > 0)) {
return Carbon::parse($attributes['purchase_date'])->addMonths((int) $this->model->eol);
} else {
return null;
}
}
$purchase_date->setTime(0, 0, 0);
);
return $purchase_date->addMonths((int) $this->attributes['warranty_months']);
}
}
protected function eolFormattedDate(): Attribute
{
return Attribute:: make(
get: fn(mixed $value, array $attributes) => $this->eolDate ? Helper::getFormattedDateObject($this->eolDate, 'date', false) : null,
);
}
protected function eolDiffInDays(): Attribute
{
return Attribute:: make(
get: fn(mixed $value, array $attributes) => $this->eolDate ? round((Carbon::now()->diffInDays(Carbon::parse($this->eolDate), false, 1))) : null,
);
}
protected function eolDiffForHumans(): Attribute
{
return Attribute:: make(
get: fn(mixed $value, array $attributes) => $this->eolDate ? Carbon::parse($this->eolDate)->diffForHumans() : null,
);
return null;
}
+16
View File
@@ -122,6 +122,22 @@ class AssetModel extends SnipeModel
return $this->hasMany(\App\Models\Asset::class, 'model_id');
}
public function availableAssets()
{
return $this->hasMany(\App\Models\Asset::class, 'model_id')->RTD();
}
public function assignedAssets()
{
return $this->hasMany(\App\Models\Asset::class, 'model_id')->Deployed();
}
public function archivedAssets()
{
return $this->hasMany(\App\Models\Asset::class, 'model_id')->Archived();
}
/**
* Establishes the model -> category relationship
*
+2 -2
View File
@@ -184,7 +184,7 @@ class CheckoutAcceptance extends Model
$pdf->AddPage();
if ($data['logo'] != null) {
$pdf->writeHTML('<img src="'.$data['logo'].'">', true, 0, true, 0, '');
$pdf->writeHTML('<img src="@'.$data['logo'].'">', true, 0, true, 0, '');
} else {
$pdf->writeHTML('<h3>'.$data['site_name'].'</h3><br /><br />', true, 0, true, 0, 'C');
}
@@ -230,7 +230,7 @@ class CheckoutAcceptance extends Model
$pdf->Ln();
if ($data['signature'] != null) {
$pdf->writeHTML('<img src="'.$data['signature'].'">', true, 0, true, 0, '');
$pdf->writeHTML('<img src="@'.$data['signature'].'">', true, 0, true, 0, '');
$pdf->writeHTML('<hr>', true, 0, true, 0, '');
$pdf->writeHTML(e($data['assigned_to']), true, 0, true, 0, 'C');
$pdf->Ln();
+3 -2
View File
@@ -229,7 +229,7 @@ class DefaultLabel extends RectangleSheet
static::writeText(
$pdf, $record->get('title'),
$textX1, 0,
'freesans', 'b', $this->textSize, 'L',
Helper::isCjk($record->get('title')) ? 'cid0cs' : 'freesans', 'b', $this->textSize, 'L',
$textW, $this->textSize,
true, 0
);
@@ -246,11 +246,12 @@ class DefaultLabel extends RectangleSheet
static::writeText(
$pdf, (($field['label']) ? $field['label'].' ' : '') . $field['value'],
$textX1, $textY,
'freesans', '', $this->textSize, 'L',
Helper::isCjk($field['label']) ? 'cid0cs' : 'freesans', '', $this->textSize, 'L',
$textW, $this->textSize,
true, 0
);
$textY += $this->textSize + self::TEXT_MARGIN;
$fieldsDone++;
}
+11 -4
View File
@@ -211,29 +211,36 @@ abstract class Label
*/
public final function writeText(TCPDF $pdf, $text, $x, $y, $font=null, $style=null, $size=null, $align='L', $width=null, $height=null, $squash=false, $border=0, $spacing=0)
{
$prevFamily = $pdf->getFontFamily();
$prevStyle = $pdf->getFontStyle();
$prevSizePt = $pdf->getFontSizePt();
$text = !empty($text) ? $text : '';
$fontFamily = !empty($font) ? $font : $prevFamily;
$fontStyle = !empty($style) ? $style : $prevStyle;
if ($size) { $fontSizePt = Helper::convertUnit($size, $this->getUnit(), 'pt', true);
} else { $fontSizePt = $prevSizePt;
if ($size) {
$fontSizePt = Helper::convertUnit($size, $this->getUnit(), 'pt', true);
} else {
$fontSizePt = $prevSizePt;
}
$pdf->SetFontSpacing($spacing);
$parts = collect(explode('**', $text))
->map(
function ($part, $index) use ($pdf, $fontFamily, $fontStyle, $fontSizePt) {
function ($part, $index) use ($pdf, $fontFamily, $fontStyle, $fontSizePt, $text) {
$modStyle = ($index % 2 == 1) ? 'B' : $fontStyle;
$pdf->setFont($fontFamily, $modStyle, $fontSizePt);
return [
'text' => $part,
'text_width' => $pdf->GetStringWidth($part),
'font_family' => $fontFamily,
'font_family' => Helper::isCjk($text) ? 'cid0cs' : $fontFamily,
'font_style' => $modStyle,
'font_size' => $fontSizePt,
];
@@ -0,0 +1,107 @@
<?php
namespace App\Models\Labels\Tapes\Brother;
class TZe_24mm_E extends TZe_24mm
{
private const BARCODE_MARGIN = 1.50;
private const TAG_SIZE = 2.00;
private const TITLE_SIZE = 2.80;
private const TITLE_MARGIN = 0.50;
private const LABEL_SIZE = 2.00;
private const LABEL_MARGIN = - 0.35;
private const FIELD_SIZE = 2.80;
private const FIELD_MARGIN = 0.15;
private const BARCODE1D_SIZE = - 1.00;
public function getUnit() { return 'mm'; }
public function getWidth() { return 45.0; }
public function getHeight() { return 15; }
public function getSupportAssetTag() { return true; }
public function getSupport1DBarcode() { return true; }
public function getSupport2DBarcode() { return true; }
public function getSupportFields() { return 3; }
public function getSupportLogo() { return false; }
public function getSupportTitle() { return true; }
public function preparePDF($pdf) {}
public function write($pdf, $record) {
$pa = $this->getPrintableArea();
$currentX = $pa->x1;
$currentY = $pa->y1;
$usableWidth = $pa->w;
$usableHeight = $pa->h - self::BARCODE1D_SIZE;
$barcodeSize = $usableHeight - self::TAG_SIZE;
if ($record->has('barcode2d')) {
static::writeText(
$pdf, $record->get('tag'),
$pa->x1, $pa->y2 - self::TAG_SIZE - self::BARCODE1D_SIZE,
'freesans', 'b', self::TAG_SIZE, 'C',
$barcodeSize, self::TAG_SIZE, true, 0
);
static::write2DBarcode(
$pdf, $record->get('barcode2d')->content, $record->get('barcode2d')->type,
$currentX, $currentY,
$barcodeSize, $barcodeSize
);
$currentX += $barcodeSize + self::BARCODE_MARGIN;
$usableWidth -= $barcodeSize + self::BARCODE_MARGIN;
} else {
static::writeText(
$pdf, $record->get('tag'),
$pa->x1, $pa->y2 - self::TAG_SIZE - self::BARCODE1D_SIZE,
'freesans', 'B', self::TAG_SIZE, 'R',
$usableWidth, self::TAG_SIZE, true, 0
);
}
if ($record->has('title')) {
static::writeText(
$pdf, $record->get('title'),
$currentX, $currentY,
'freesans', 'B', self::TITLE_SIZE, 'L',
$usableWidth, self::TITLE_SIZE, true, 0
);
$currentY += self::TITLE_SIZE + self::TITLE_MARGIN;
}
foreach ($record->get('fields') as $field) {
// Write label and value on the same line
// Calculate label width with proportional character spacing
$labelWidth = $pdf->GetStringWidth($field['label'], 'freesans', '', self::LABEL_SIZE);
$charCount = strlen($field['label']);
$spacingPerChar = 0.5;
$totalSpacing = $charCount * $spacingPerChar;
$adjustedWidth = $labelWidth + $totalSpacing;
static::writeText(
$pdf, $field['label'],
$currentX, $currentY,
'freesans', 'B', self::LABEL_SIZE, 'L',
$adjustedWidth, self::LABEL_SIZE, true, 0, $spacingPerChar
);
static::writeText(
$pdf, $field['value'],
$currentX + $adjustedWidth + 2, $currentY,
'freesans', 'B', self::FIELD_SIZE, 'L',
$usableWidth - $adjustedWidth - 2, self::FIELD_SIZE, true, 0, 0.3
);
$currentY += max(self::LABEL_SIZE, self::FIELD_SIZE) + self::FIELD_MARGIN;
}
if ($record->has('barcode1d')) {
static::write1DBarcode(
$pdf, $record->get('barcode1d')->content, $record->get('barcode1d')->type,
$currentX, $barcodeSize + self::BARCODE_MARGIN, $usableWidth - self::TAG_SIZE, self::TAG_SIZE
);
}
}
}
+71 -52
View File
@@ -8,6 +8,7 @@ use App\Models\Traits\HasUploads;
use App\Models\Traits\Searchable;
use App\Presenters\Presentable;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\DB;
@@ -156,6 +157,29 @@ class License extends Depreciable
);
}
protected function terminatesFormattedDate(): Attribute
{
return Attribute:: make(
get: fn(mixed $value, array $attributes) => $attributes['termination_date'] ? Helper::getFormattedDateObject($attributes['termination_date'], 'date', false) : null,
);
}
protected function terminatesDiffInDays(): Attribute
{
return Attribute:: make(
get: fn(mixed $value, array $attributes) => $attributes['termination_date'] ? Carbon::now()->diffInDays($attributes['termination_date']) : null,
);
}
protected function terminatesDiffForHumans(): Attribute
{
return Attribute:: make(
get: fn(mixed $value, array $attributes) => $attributes['termination_date'] ? Carbon::parse($attributes['termination_date'])->diffForHumans() : null,
);
}
public function prepareLimitChangeRule($parameters, $field)
{
$actual_seat_count = $this->licenseseats()->count(); //we use the *actual* seat count here, in case your license has gone wonky
@@ -706,49 +730,6 @@ class License extends Depreciable
return $this->hasMany(\App\Models\LicenseSeat::class)->whereNull('assigned_to')->whereNull('deleted_at')->whereNull('asset_id');
}
/**
* Returns expiring licenses.
*
* This checks if:
*
* 1) The license has not been deleted
* 2) The expiration date is between now and the number of days specified
* 3) There is an expiration date set and the termination date has not passed
* 4) The license termination date is null or has not passed
*
* @author A. Gianotto <snipe@snipe.net>
* @since [v1.0]
* @return \Illuminate\Database\Eloquent\Relations\Relation
* @see \App\Console\Commands\SendExpiringLicenseNotifications
*/
public static function getExpiringLicenses($days = 60)
{
return self::whereNull('licenses.deleted_at')
// The termination date is null or within range
->where(function ($query) use ($days) {
$query->whereNull('termination_date')
->orWhereBetween('termination_date', [Carbon::now(), Carbon::now()->addDays($days)]);
})
->where(function ($query) use ($days) {
$query->whereNotNull('expiration_date')
// Handle expired licenses without termination dates
->where(function ($query) use ($days) {
$query->whereNull('termination_date')
->whereBetween('expiration_date', [Carbon::now(), Carbon::now()->addDays($days)]);
})
// Handle expired licenses with termination dates in the future
->orWhere(function ($query) use ($days) {
$query->whereBetween('termination_date', [Carbon::now(), Carbon::now()->addDays($days)]);
});
})
->orderBy('expiration_date', 'ASC')
->orderBy('termination_date', 'ASC')
->get();
}
public function scopeActiveLicenses($query)
{
@@ -765,19 +746,57 @@ class License extends Depreciable
});
}
/**
* Expiried/terminated licenses scope
*
* @author A. Gianotto <snipe@snipe.net>
* @since [v1.0]
* @return \Illuminate\Database\Eloquent\Relations\Relation
* @see \App\Console\Commands\SendExpiringLicenseNotifications
*/
public function scopeExpiredLicenses($query)
{
return $query->whereDate('termination_date', '<=', Carbon::now())// The termination date is null or within range
->orWhere(function ($query) {
$query->whereDate('expiration_date', '<=', Carbon::now());
})
->whereNull('deleted_at');
}
return $query->whereNull('licenses.deleted_at')
/**
* Expiring/terminating licenses scope
*
* This checks if:
*
* 1) The license has not been deleted
* 2) The expiration date is between now and the number of days specified
* 3) There is an expiration date set and the termination date has not passed
* 4) The license termination date is null or has not passed
*
* @author A. Gianotto <snipe@snipe.net>
* @since [v1.0]
* @return \Illuminate\Database\Eloquent\Relations\Relation
* @see \App\Console\Commands\SendExpiringLicenseNotifications
*/
public function scopeExpiringLicenses($query, $days = 60)
{
return $query// The termination date is null or within range
->where(function ($query) use ($days) {
$query->whereNull('termination_date')
->orWhereBetween('termination_date', [Carbon::now(), Carbon::now()->addDays($days)]);
})
->where(function ($query) use ($days) {
$query->whereNotNull('expiration_date')
// Handle expiring licenses without termination dates
->where(function ($query) use ($days) {
$query->whereNull('termination_date')
->whereBetween('expiration_date', [Carbon::now(), Carbon::now()->addDays($days)]);
})
// The termination date is null or within range
->where(function ($query) {
$query->whereNull('termination_date')
->orWhereDate('termination_date', '<=', [Carbon::now()]);
})
->orWhere(function ($query) {
$query->whereNull('expiration_date')
->orWhereDate('expiration_date', '<=', [Carbon::now()]);
// Handle expiring licenses with termination dates in the future
->orWhere(function ($query) use ($days) {
$query->whereBetween('termination_date', [Carbon::now(), Carbon::now()->addDays($days)]);
});
});
}
+33
View File
@@ -3,6 +3,7 @@
namespace App\Models;
use App\Helpers\Helper;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
@@ -19,6 +20,37 @@ class SnipeModel extends Model
$this->attributes['purchase_date'] = $value;
}
protected function purchaseDateFormatted(): Attribute
{
return Attribute:: make(
get: fn(mixed $value, array $attributes) => $attributes['purchase_date'] ? Helper::getFormattedDateObject(Carbon::parse($attributes['purchase_date']), 'date', false) : null,
);
}
protected function expiresDiffInDays(): Attribute
{
return Attribute:: make(
get: fn(mixed $value, array $attributes) => $attributes['expiration_date'] ? Carbon::now()->diffInDays($attributes['expiration_date']) : null,
);
}
protected function expiresDiffForHumans(): Attribute
{
return Attribute:: make(
get: fn(mixed $value, array $attributes) => $attributes['expiration_date'] ? Carbon::parse($attributes['expiration_date'])->diffForHumans() : null,
);
}
protected function expiresFormattedDate(): Attribute
{
return Attribute:: make(
get: fn(mixed $value, array $attributes) => $attributes['expiration_date'] ? Helper::getFormattedDateObject($attributes['expiration_date'], 'date', false) : null,
);
}
/**
* @param $value
*/
@@ -180,6 +212,7 @@ class SnipeModel extends Model
);
}
public function getEula()
{
+4 -4
View File
@@ -168,14 +168,14 @@ class AssetObserver
public function saving(Asset $asset)
{
// determine if calculated eol and then calculate it - this should only happen on a new asset
if (is_null($asset->asset_eol_date) && !is_null($asset->purchase_date) && ($asset->model->eol > 0)){
if (is_null($asset->asset_eol_date) && !is_null($asset->purchase_date) && ($asset->model?->eol > 0)) {
$asset->asset_eol_date = $asset->purchase_date->addMonths($asset->model->eol)->format('Y-m-d');
$asset->eol_explicit = false;
}
// determine if explicit and set eol_explicit to true
if (!is_null($asset->asset_eol_date) && !is_null($asset->purchase_date)) {
if($asset->model->eol > 0) {
if ($asset->model?->eol > 0) {
$months = (int) Carbon::parse($asset->asset_eol_date)->diffInMonths($asset->purchase_date, true);
if($months != $asset->model->eol) {
$asset->eol_explicit = true;
@@ -184,9 +184,9 @@ class AssetObserver
} elseif (!is_null($asset->asset_eol_date) && is_null($asset->purchase_date)) {
$asset->eol_explicit = true;
}
if ((!is_null($asset->asset_eol_date)) && (!is_null($asset->purchase_date)) && (is_null($asset->model->eol) || ($asset->model->eol == 0))) {
if ((!is_null($asset->asset_eol_date)) && (!is_null($asset->purchase_date)) && (is_null($asset->model?->eol) || ($asset->model?->eol == 0))) {
$asset->eol_explicit = true;
}
}
}
+21 -2
View File
@@ -89,17 +89,36 @@ class AssetModelPresenter extends Presenter
'class' => 'text-right text-padding-number-cell',
'footerFormatter' => 'qtySumFormatter',
],
[
'field' => 'assets_assigned_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.assigned'),
'visible' => true,
'class' => 'text-right text-padding-number-cell',
'footerFormatter' => 'qtySumFormatter',
],
[
'field' => 'remaining',
'searchable' => false,
'sortable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.remaining'),
'visible' => true,
'class' => 'text-right text-padding-number-cell',
'footerFormatter' => 'qtySumFormatter',
],
[
'field' => 'assets_archived_count',
'searchable' => false,
'sortable' => true,
'switchable' => true,
'title' => trans('general.archived'),
'visible' => true,
'class' => 'text-right text-padding-number-cell',
'footerFormatter' => 'qtySumFormatter',
],
[
'field' => 'depreciation',
'searchable' => false,
+7 -8
View File
@@ -48,6 +48,13 @@ class LicensePresenter extends Presenter
'sortable' => true,
'title' => trans('admin/licenses/form.expiration'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'termination_date',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('admin/licenses/form.termination_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'license_email',
'searchable' => true,
@@ -110,14 +117,6 @@ class LicensePresenter extends Presenter
'title' => trans('general.purchase_date'),
'formatter' => 'dateDisplayFormatter',
],
[
'field' => 'termination_date',
'searchable' => true,
'sortable' => true,
'visible' => false,
'title' => trans('admin/licenses/form.termination_date'),
'formatter' => 'dateDisplayFormatter',
],
[
'field' => 'depreciation',
'searchable' => true,
+6 -1
View File
@@ -350,10 +350,15 @@ class BreadcrumbsServiceProvider extends ServiceProvider
* Licenses Breadcrumbs
*/
if ((request()->is('licenses*')) && (request()->status=='inactive')) {
Breadcrumbs::for('licenses.index', fn(Trail $trail) => $trail->parent('home', route('home'))
->push(trans('general.licenses'), route('licenses.index'))
->push(trans('general.show_inactive'), route('licenses.index'))
);
} elseif ((request()->is('licenses*')) && (request()->status=='expiring')) {
Breadcrumbs::for('licenses.index', fn (Trail $trail) =>
$trail->parent('home', route('home'))
->push(trans('general.licenses'), route('licenses.index'))
->push(trans('general.show_inactive'), route('licenses.index'))
->push(trans('general.show_expiring'), route('licenses.index'))
);
} else {
Breadcrumbs::for('licenses.index', fn (Trail $trail) =>
+6 -2
View File
@@ -74,6 +74,10 @@ class Label implements View
[0 => $template->getWidth(), 1 => $template->getHeight(), 'Rotate' => $template->getRotation()]
);
// Required for CJK languages, otherwise the embedded font can get too massive
$pdf->SetFontSubsetting(true);
// Reset parameters
$pdf->SetPrintHeader(false);
$pdf->SetPrintFooter(false);
@@ -176,14 +180,14 @@ class Label implements View
// For fields that have multiple options, we need to combine them
// into a single field so all values are displayed.
->reduce(function ($previous, $current) {
// On the first iteration we simply return the item.
// On the first iteration, we simply return the item.
// If there is only one item to be processed for the row
// then this effectively skips everything below this if block.
if (is_null($previous)) {
return $current;
}
// At this point we are dealing with a row with multiple items being displayed.
// At this point, we are dealing with a row with multiple items being displayed.
// We need to combine the label and value of the current item with the previous item.
// The end result of this will be in this format:
+5 -5
View File
@@ -1,10 +1,10 @@
<?php
return array (
'app_version' => 'v8.3.2',
'full_app_version' => 'v8.3.2 - build 19905-g028b4e7b7',
'build_version' => '19905',
'app_version' => 'v8.3.3',
'full_app_version' => 'v8.3.3 - build 20061-g884d2a955',
'build_version' => '20061',
'prerelease_version' => '',
'hash_version' => 'g028b4e7b7',
'full_hash' => 'v8.3.2-319-g028b4e7b7',
'hash_version' => 'g884d2a955',
'full_hash' => 'v8.3.3-154-g884d2a955',
'branch' => 'master',
);
@@ -23,23 +23,39 @@ class CheckoutAcceptanceFactory extends Factory
'assigned_to_id' => User::factory(),
];
}
protected static bool $skipActionLog = false;
public function withoutActionLog(): static
{
// turn off for this create() call
static::$skipActionLog = true;
// ensure it turns back on AFTER creating
return $this->afterCreating(function () {
static::$skipActionLog = false;
});
}
public function configure(): static
{
return $this->afterCreating(function (CheckoutAcceptance $acceptance) {
if (static::$skipActionLog) {
return; // short-circuit
}
if ($acceptance->checkoutable instanceof Asset) {
$this->createdAssociatedActionLogEntry($acceptance);
}
if ($acceptance->checkoutable instanceof Asset && $acceptance->assignedTo instanceof User) {
$acceptance->checkoutable->update([
'assigned_to' => $acceptance->assigned_to_id,
'assigned_type' => get_class($acceptance->assignedTo),
'assigned_to' => $acceptance->assigned_to_id,
'assigned_type'=> get_class($acceptance->assignedTo),
]);
}
});
}
public function forAccessory()
{
return $this->state([
@@ -21,39 +21,45 @@ return new class extends Migration
{
$schema = Schema::connection($this->getConnection());
$schema->create('telescope_entries', function (Blueprint $table) {
$table->bigIncrements('sequence');
$table->uuid('uuid');
$table->uuid('batch_id');
$table->string('family_hash')->nullable();
$table->boolean('should_display_on_index')->default(true);
$table->string('type', 20);
$table->longText('content');
$table->dateTime('created_at')->nullable();
if (! Schema::hasTable('telescope_entries') ) {
$schema->create('telescope_entries', function (Blueprint $table) {
$table->bigIncrements('sequence');
$table->uuid('uuid');
$table->uuid('batch_id');
$table->string('family_hash')->nullable();
$table->boolean('should_display_on_index')->default(true);
$table->string('type', 20);
$table->longText('content');
$table->dateTime('created_at')->nullable();
$table->unique('uuid');
$table->index('batch_id');
$table->index('family_hash');
$table->index('created_at');
$table->index(['type', 'should_display_on_index']);
});
$table->unique('uuid');
$table->index('batch_id');
$table->index('family_hash');
$table->index('created_at');
$table->index(['type', 'should_display_on_index']);
});
}
$schema->create('telescope_entries_tags', function (Blueprint $table) {
$table->uuid('entry_uuid');
$table->string('tag');
if (! Schema::hasTable('telescope_entries_tags') ) {
$schema->create('telescope_entries_tags', function (Blueprint $table) {
$table->uuid('entry_uuid');
$table->string('tag');
$table->primary(['entry_uuid', 'tag']);
$table->index('tag');
$table->primary(['entry_uuid', 'tag']);
$table->index('tag');
$table->foreign('entry_uuid')
->references('uuid')
->on('telescope_entries')
->onDelete('cascade');
});
$table->foreign('entry_uuid')
->references('uuid')
->on('telescope_entries')
->onDelete('cascade');
});
}
$schema->create('telescope_monitoring', function (Blueprint $table) {
$table->string('tag')->primary();
});
if (! Schema::hasTable('telescope_monitoring') ) {
$schema->create('telescope_monitoring', function (Blueprint $table) {
$table->string('tag')->primary();
});
}
}
/**
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -2,8 +2,8 @@
"/js/dist/all.js": "/js/dist/all.js?id=5c191843e0bb9292ec6b7f0a3c5765b3",
"/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=bf1a348eae3e60c62b8879953f7df14c",
"/css/dist/skins/_all-skins.css": "/css/dist/skins/_all-skins.css?id=146086d653897e2557af5e68f6f8c56f",
"/css/build/overrides.css": "/css/build/overrides.css?id=da2636d15880131386d4077637ec9be2",
"/css/build/app.css": "/css/build/app.css?id=813a3e9610d1108dbe35f62435d436fd",
"/css/build/overrides.css": "/css/build/overrides.css?id=3f6ab7e6902cca7d96e637b82dc95e65",
"/css/build/app.css": "/css/build/app.css?id=5876cf8fb09a66f8f9e0b2472c9cc9f8",
"/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=bdf169bc2141f453390614c138cdce95",
"/css/dist/skins/skin-yellow.css": "/css/dist/skins/skin-yellow.css?id=e1e6e1c64cf14fc350585aaeb0e42f6b",
"/css/dist/skins/skin-yellow-dark.css": "/css/dist/skins/skin-yellow-dark.css?id=08ae1b3e66008966ce5d600ea3ad04a2",
@@ -19,7 +19,7 @@
"/css/dist/skins/skin-blue.css": "/css/dist/skins/skin-blue.css?id=68a92d85c8e351dfb38a835307f126ec",
"/css/dist/skins/skin-blue-dark.css": "/css/dist/skins/skin-blue-dark.css?id=cbb20ad6182b658f34117bf96a621b63",
"/css/dist/skins/skin-black.css": "/css/dist/skins/skin-black.css?id=84e2ee950ae04444988b37038e5a3951",
"/css/dist/all.css": "/css/dist/all.css?id=a480f24f1a8b590f3686e529fd25309b",
"/css/dist/all.css": "/css/dist/all.css?id=88a000a091cb26a138368945df92ab83",
"/css/dist/signature-pad.css": "/css/dist/signature-pad.css?id=6a89d3cd901305e66ced1cf5f13147f7",
"/css/dist/signature-pad.min.css": "/css/dist/signature-pad.min.css?id=6a89d3cd901305e66ced1cf5f13147f7",
"/js/select2/i18n/af.js": "/js/select2/i18n/af.js?id=4f6fcd73488ce79fae1b7a90aceaecde",
+4
View File
@@ -1260,4 +1260,8 @@ caption.tableCaption {
clip: rect(0,0,0,0);
white-space: preserve;
display: inline-block;
}
input[name="columnsSearch"] {
width: 120px;
}
@@ -5,7 +5,7 @@ return [
'manage' => 'crwdns6501:0crwdne6501:0',
'field' => 'crwdns1487:0crwdne1487:0',
'about_fieldsets_title' => 'crwdns1488:0crwdne1488:0',
'about_fieldsets_text' => 'crwdns13508:0crwdne13508:0',
'about_fieldsets_text' => 'crwdns13746:0crwdne13746:0',
'custom_format' => 'crwdns6505:0crwdne6505:0',
'encrypt_field' => 'crwdns1792:0crwdne1792:0',
'encrypt_field_help' => 'crwdns1683:0crwdne1683:0',
@@ -2,7 +2,7 @@
return [
'about_asset_depreciations' => 'crwdns819:0crwdne819:0',
'about_depreciations' => 'crwdns820:0crwdne820:0',
'about_depreciations' => 'crwdns13748:0crwdne13748:0',
'asset_depreciations' => 'crwdns821:0crwdne821:0',
'create' => 'crwdns1799:0crwdne1799:0',
'depreciation_name' => 'crwdns823:0crwdne823:0',
@@ -44,6 +44,8 @@ return [
'redirect_to_checked_out_to' => 'crwdns12226:0crwdne12226:0',
'select_statustype' => 'crwdns1167:0crwdne1167:0',
'serial' => 'crwdns716:0crwdne716:0',
'serial_required' => 'crwdns13774:0crwdne13774:0',
'serial_required_post_model_update' => 'crwdns13776:0crwdne13776:0',
'status' => 'crwdns717:0crwdne717:0',
'tag' => 'crwdns719:0crwdne719:0',
'update' => 'crwdns720:0crwdne720:0',
@@ -22,6 +22,8 @@ return [
'requested' => 'crwdns1697:0crwdne1697:0',
'not_requestable' => 'crwdns6555:0crwdne6555:0',
'requestable_status_warning' => 'crwdns11681:0crwdne11681:0',
'require_serial' => 'crwdns13770:0crwdne13770:0',
'require_serial_help' => 'crwdns13772:0crwdne13772:0',
'restore' => 'crwdns1178:0crwdne1178:0',
'pending' => 'crwdns1170:0crwdne1170:0',
'undeployable' => 'crwdns1171:0crwdne1171:0',
@@ -46,11 +46,12 @@ return array(
'not_enough_seats' => 'crwdns11902:0crwdne11902:0',
'mismatch' => 'crwdns12574:0crwdne12574:0',
'unavailable' => 'crwdns12576:0crwdne12576:0',
'license_is_inactive' => 'crwdns13798:0crwdne13798:0',
),
'checkin' => array(
'error' => 'crwdns948:0crwdne948:0',
'not_reassignable' => 'crwdns12802:0crwdne12802:0',
'not_reassignable' => 'crwdns13778:0crwdne13778:0',
'success' => 'crwdns949:0crwdne949:0'
),
@@ -3,12 +3,13 @@
return array(
'does_not_exist' => 'crwdns650:0crwdne650:0',
'assoc_users' => 'crwdns13150:0crwdne13150:0',
'assoc_users' => 'crwdns13788:0crwdne13788:0',
'assoc_assets' => 'crwdns1404:0crwdne1404:0',
'assoc_child_loc' => 'crwdns1405:0crwdne1405:0',
'assigned_assets' => 'crwdns11179:0crwdne11179:0',
'current_location' => 'crwdns11181:0crwdne11181:0',
'open_map' => 'crwdns12696:0crwdne12696:0',
'deleted_warning' => 'crwdns13790:0crwdne13790:0',
'create' => array(
@@ -12,7 +12,8 @@ return [
'create' => 'crwdns644:0crwdne644:0',
'update' => 'crwdns645:0crwdne645:0',
'print_assigned' => 'crwdns6062:0crwdne6062:0',
'print_all_assigned' => 'crwdns6064:0crwdne6064:0',
'print_inventory' => 'crwdns13792:0crwdne13792:0',
'print_all_assigned' => 'crwdns13794:0crwdne13794:0',
'name' => 'crwdns646:0crwdne646:0',
'address' => 'crwdns647:0crwdne647:0',
'address2' => 'crwdns11880:0crwdne11880:0',
+2 -3
View File
@@ -11,7 +11,6 @@ return array(
'title' => 'crwdns665:0crwdne665:0',
'update' => 'crwdns666:0crwdne666:0',
'view' => 'crwdns667:0crwdne667:0',
'update' => 'crwdns666:0crwdne666:0',
'clone' => 'crwdns669:0crwdne669:0',
'edit' => 'crwdns670:0crwdne670:0',
'clone' => 'crwdns669:0crwdne669:0',
'edit' => 'crwdns670:0crwdne670:0',
);
@@ -24,7 +24,6 @@ return [
'auto_assign_label' => 'crwdns11345:0crwdne11345:0',
'auto_assign_help' => 'crwdns11347:0crwdne11347:0',
'software_user' => 'crwdns1131:0crwdne1131:0',
'send_email_help' => 'crwdns5920:0crwdne5920:0',
'view_user' => 'crwdns1132:0crwdne1132:0',
'usercsv' => 'crwdns1193:0crwdne1193:0',
'two_factor_admin_optin_help' => 'crwdns1823:0crwdne1823:0',
+21 -7
View File
@@ -160,7 +160,7 @@ return [
'import' => 'crwdns1411:0crwdne1411:0',
'import_this_file' => 'crwdns11922:0crwdne11922:0',
'importing' => 'crwdns6034:0crwdne6034:0',
'importing_help' => 'crwdns6036:0crwdne6036:0',
'importing_help' => 'crwdns13750:0crwdne13750:0',
'import-history' => 'crwdns1694:0crwdne1694:0',
'asset_maintenance' => 'crwdns1335:0crwdne1335:0',
'asset_maintenance_report' => 'crwdns1336:0crwdne1336:0',
@@ -309,10 +309,12 @@ return [
'total_licenses' => 'crwdns1092:0crwdne1092:0',
'total_accessories' => 'crwdns1771:0crwdne1771:0',
'total_consumables' => 'crwdns1772:0crwdne1772:0',
'total_cost' => 'crwdns13822:0crwdne13822:0',
'type' => 'crwdns1203:0crwdne1203:0',
'undeployable' => 'crwdns1093:0crwdne1093:0',
'unknown_admin' => 'crwdns1094:0crwdne1094:0',
'unknown_user' => 'crwdns13404:0crwdne13404:0',
'unit_cost' => 'crwdns13820:0crwdne13820:0',
'username' => 'crwdns10464:0crwdne10464:0',
'update' => 'crwdns1341:0crwdne1341:0',
'updating_item' => 'crwdns12804:0crwdne12804:0',
@@ -353,9 +355,11 @@ return [
'audit_overdue' => 'crwdns5988:0crwdne5988:0',
'accept' => 'crwdns6016:0crwdne6016:0',
'i_accept' => 'crwdns6018:0crwdne6018:0',
'i_decline_item' => 'crwdns13490:0crwdne13490:0',
'i_accept_item' => 'crwdns13492:0crwdne13492:0',
'i_accept_with_count' => 'crwdns13780:0crwdne13780:0',
'i_decline_item' => 'crwdns13782:0crwdne13782:0',
'i_accept_item' => 'crwdns13784:0crwdne13784:0',
'i_decline' => 'crwdns6020:0crwdne6020:0',
'i_decline_with_count' => 'crwdns13786:0crwdne13786:0',
'accept_decline' => 'crwdns6163:0crwdne6163:0',
'sign_tos' => 'crwdns6022:0crwdne6022:0',
'clear_signature' => 'crwdns6024:0crwdne6024:0',
@@ -393,6 +397,7 @@ return [
'permissions' => 'crwdns6223:0crwdne6223:0',
'managed_ldap' => 'crwdns6225:0crwdne6225:0',
'export' => 'crwdns6227:0crwdne6227:0',
'export_all_to_csv' => 'crwdns13832:0crwdne13832:0',
'ldap_sync' => 'crwdns6229:0crwdne6229:0',
'ldap_user_sync' => 'crwdns6231:0crwdne6231:0',
'synchronize' => 'crwdns6233:0crwdne6233:0',
@@ -482,7 +487,9 @@ return [
'update_existing_values' => 'crwdns11457:0crwdne11457:0',
'auto_incrementing_asset_tags_disabled_so_tags_required' => 'crwdns11493:0crwdne11493:0',
'auto_incrementing_asset_tags_enabled_so_now_assets_will_be_created' => 'crwdns11495:0crwdne11495:0',
'send_welcome_email_to_users' => 'crwdns13514:0crwdne13514:0',
'send_welcome_email_to_users' => 'crwdns13752:0crwdne13752:0',
'send_welcome_email_help' => 'crwdns13754:0crwdne13754:0',
'send_welcome_email_import_help' => 'crwdns13756:0crwdne13756:0',
'send_email' => 'crwdns12108:0crwdne12108:0',
'call' => 'crwdns12110:0crwdne12110:0',
'back_before_importing' => 'crwdns11461:0crwdne11461:0',
@@ -512,7 +519,10 @@ return [
'item_notes' => 'crwdns11635:0crwdne11635:0',
'item_name_var' => 'crwdns11637:0crwdne11637:0',
'error_user_company' => 'crwdns11833:0crwdne11833:0',
'error_user_company_multiple' => 'crwdns13828:0crwdne13828:0',
'error_user_company_accept_view' => 'crwdns11787:0crwdne11787:0',
'error_assets_already_checked_out' => 'crwdns13826:0crwdne13826:0',
'assigned_assets_removed' => 'crwdns13830:0crwdne13830:0',
'importer' => [
'checked_out_to_fullname' => 'crwdns11639:0crwdne11639:0',
'checked_out_to_first_name' => 'crwdns11641:0crwdne11641:0',
@@ -584,6 +594,8 @@ return [
'components' => 'crwdns12146:0crwdne12146:0',
],
'show_inactive' => 'crwdns13818:0crwdne13818:0',
'show_expiring' => 'crwdns13834:0crwdne13834:0',
'more_info' => 'crwdns12288:0crwdne12288:0',
'quickscan_bulk_help' => 'crwdns12290:0crwdne12290:0',
'whoops' => 'crwdns12304:0crwdne12304:0',
@@ -608,6 +620,8 @@ return [
'use_cloned_no_image_help' => 'crwdns13526:0crwdne13526:0',
'footer_credit' => 'crwdns13282:0crwdne13282:0',
'set_password' => 'crwdns13494:0crwdne13494:0',
'upload_deleted' => 'crwdns13768:0crwdne13768:0',
'child_locations' => 'crwdns13796:0crwdne13796:0',
// Add form placeholders here
'placeholders' => [
@@ -624,11 +638,11 @@ return [
'site_default' => 'crwdns13057:0crwdne13057:0',
'default_blue' => 'crwdns13059:0crwdne13059:0',
'blue_dark' => 'crwdns13061:0crwdne13061:0',
'green' => 'crwdns13063:0crwdne13063:0',
'green' => 'crwdns13758:0crwdne13758:0',
'green_dark' => 'crwdns13065:0crwdne13065:0',
'red' => 'crwdns13067:0crwdne13067:0',
'red' => 'crwdns13760:0crwdne13760:0',
'red_dark' => 'crwdns13069:0crwdne13069:0',
'orange' => 'crwdns13071:0crwdne13071:0',
'orange' => 'crwdns13762:0crwdne13762:0',
'orange_dark' => 'crwdns13073:0crwdne13073:0',
'black' => 'crwdns13075:0crwdne13075:0',
'black_dark' => 'crwdns13077:0crwdne13077:0',
+13 -11
View File
@@ -3,9 +3,9 @@
return [
'Accessory_Checkin_Notification' => 'crwdns6004:0crwdne6004:0',
'Accessory_Checkout_Notification' => 'crwdns12060:0crwdne12060:0',
'Asset_Checkin_Notification' => 'crwdns13620:0crwdne13620:0',
'Asset_Checkout_Notification' => 'crwdns13622:0crwdne13622:0',
'Accessory_Checkout_Notification' => 'crwdns13800:0crwdne13800:0',
'Asset_Checkin_Notification' => 'crwdns13764:0crwdne13764:0',
'Asset_Checkout_Notification' => 'crwdns13766:0crwdne13766:0',
'Confirm_Accessory_Checkin' => 'crwdns5992:0crwdne5992:0',
'Confirm_Asset_Checkin' => 'crwdns5990:0crwdne5990:0',
'Confirm_component_checkin' => 'crwdns13500:0crwdne13500:0',
@@ -21,8 +21,8 @@ return [
'Expected_Checkin_Date' => 'crwdns6012:0crwdne6012:0',
'Expected_Checkin_Notification' => 'crwdns6030:0crwdne6030:0',
'Expected_Checkin_Report' => 'crwdns6028:0crwdne6028:0',
'Expiring_Assets_Report' => 'crwdns1732:0crwdne1732:0',
'Expiring_Licenses_Report' => 'crwdns1733:0crwdne1733:0',
'Expiring_Assets_Report' => 'crwdns13808:0crwdne13808:0',
'Expiring_Licenses_Report' => 'crwdns13810:0crwdne13810:0',
'Item_Request_Canceled' => 'crwdns1739:0crwdne1739:0',
'Item_Requested' => 'crwdns1740:0crwdne1740:0',
'License_Checkin_Notification' => 'crwdns6008:0crwdne6008:0',
@@ -31,7 +31,7 @@ return [
'Low_Inventory_Report' => 'crwdns1745:0crwdne1745:0',
'a_user_canceled' => 'crwdns1704:0crwdne1704:0',
'a_user_requested' => 'crwdns1705:0crwdne1705:0',
'acceptance_asset_accepted_to_user' => 'crwdns13478:0crwdne13478:0',
'acceptance_asset_accepted_to_user' => 'crwdns13824:0crwdne13824:0',
'acceptance_asset_accepted' => 'crwdns10552:0crwdne10552:0',
'acceptance_asset_declined' => 'crwdns10554:0crwdne10554:0',
'send_pdf_copy' => 'crwdns13480:0crwdne13480:0',
@@ -42,8 +42,9 @@ return [
'asset_name' => 'crwdns12716:0crwdne12716:0',
'asset_requested' => 'crwdns1711:0crwdne1711:0',
'asset_tag' => 'crwdns6068:0crwdne6068:0',
'assets_warrantee_alert' => 'crwdns6313:0crwdne6313:0',
'assets_warrantee_alert' => 'crwdns13812:0crwdne13812:0',
'assigned_to' => 'crwdns1714:0crwdne1714:0',
'eol' => 'crwdns13814:0crwdne13814:0',
'best_regards' => 'crwdns1715:0crwdne1715:0',
'canceled' => 'crwdns12718:0crwdne12718:0',
'checkin_date' => 'crwdns12720:0crwdne12720:0',
@@ -58,6 +59,7 @@ return [
'days' => 'crwdns1729:0crwdne1729:0',
'expecting_checkin_date' => 'crwdns12724:0crwdne12724:0',
'expires' => 'crwdns1731:0crwdne1731:0',
'terminates' => 'crwdns13836:0crwdne13836:0',
'following_accepted' => 'crwdns13434:0crwdne13434:0',
'following_declined' => 'crwdns13436:0crwdne13436:0',
'hello' => 'crwdns1734:0crwdne1734:0',
@@ -68,16 +70,16 @@ return [
'inventory_report' => 'crwdns11243:0crwdne11243:0',
'item' => 'crwdns12726:0crwdne12726:0',
'item_checked_reminder' => 'crwdns12322:0crwdne12322:0',
'license_expiring_alert' => 'crwdns2048:0crwdne2048:0',
'license_expiring_alert' => 'crwdns13816:0crwdne13816:0',
'link_to_update_password' => 'crwdns1742:0crwdne1742:0',
'login' => 'crwdns12792:0crwdne12792:0',
'login_first_admin' => 'crwdns1743:0crwdne1743:0',
'low_inventory_alert' => 'crwdns2046:0crwdne2046:0',
'min_QTY' => 'crwdns1746:0crwdne1746:0',
'name' => 'crwdns1747:0crwdne1747:0',
'new_item_checked' => 'crwdns1748:0crwdne1748:0',
'new_item_checked_with_acceptance' => 'crwdns13007:0crwdne13007:0',
'new_item_checked_location' => 'crwdns13744:0crwdne13744:0',
'new_item_checked' => 'crwdns13802:0crwdne13802:0',
'new_item_checked_with_acceptance' => 'crwdns13804:0crwdne13804:0',
'new_item_checked_location' => 'crwdns13806:0crwdne13806:0',
'recent_item_checked' => 'crwdns13009:0crwdne13009:0',
'notes' => 'crwdns12070:0crwdne12070:0',
'password' => 'crwdns12728:0crwdne12728:0',
@@ -5,7 +5,7 @@ return [
'manage' => 'Manage',
'field' => 'veld',
'about_fieldsets_title' => 'Oor Fieldsets',
'about_fieldsets_text' => 'Veldstelle stel jou in staat om groepe van persoonlike velde te skep wat gereeld hergebruik word vir spesifieke tipe bates.',
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used for specific asset model types.',
'custom_format' => 'Custom Regex format...',
'encrypt_field' => 'Enkripteer die waarde van hierdie veld in die databasis',
'encrypt_field_help' => 'WAARSKUWING: Om \'n veld te enkripteer, maak dit onondersoekbaar.',
@@ -2,7 +2,7 @@
return [
'about_asset_depreciations' => 'Oor bate afskrywing',
'about_depreciations' => 'U kan bate-afskrywings opstel om bates te deprecieer gebaseer op reguit-waardevermindering.',
'about_depreciations' => 'You can set up asset depreciations to depreciate assets based on linear (straight-line), Half Year applied with condition, or Half Year always applied.',
'asset_depreciations' => 'Bate afskrywing',
'create' => 'Skep waardevermindering',
'depreciation_name' => 'Waardevermindering Naam',
@@ -44,6 +44,8 @@ return [
'redirect_to_checked_out_to' => 'Go to Checked Out to',
'select_statustype' => 'Kies Status Tipe',
'serial' => 'Serial',
'serial_required' => 'Asset :number requires a serial number',
'serial_required_post_model_update' => ':asset_model have been updated to require a serial number. Please add a serial number for this asset.',
'status' => 'status',
'tag' => 'Bate-tag',
'update' => 'Asset Update',
@@ -22,6 +22,8 @@ return [
'requested' => 'versoek',
'not_requestable' => 'Not Requestable',
'requestable_status_warning' => 'Do not change requestable status',
'require_serial' => 'Require Serial Number',
'require_serial_help' => 'A serial number will be required when creating a new asset of this model.',
'restore' => 'Herstel bate',
'pending' => 'hangende',
'undeployable' => 'Undeployable',
@@ -46,11 +46,12 @@ return array(
'not_enough_seats' => 'Not enough license seats available for checkout',
'mismatch' => 'The license seat provided does not match the license',
'unavailable' => 'This seat is not available for checkout.',
'license_is_inactive' => 'This license is expired or terminated.',
),
'checkin' => array(
'error' => 'Daar was \'n probleem om die lisensie te kontroleer. Probeer asseblief weer.',
'not_reassignable' => 'License not reassignable',
'not_reassignable' => 'Seat has been used',
'success' => 'Die lisensie is suksesvol nagegaan'
),
@@ -3,12 +3,13 @@
return array(
'does_not_exist' => 'Ligging bestaan nie.',
'assoc_users' => 'This location is not currently deletable because it is the location of record for at least one asset or user, has assets assigned to it, or is the parent location of another location. Please update your records to no longer reference this location and try again ',
'assoc_users' => 'This location is not currently deletable because it is the location of record for at least one item or user, has assets assigned to it, or is the parent location of another location. Please update your records to no longer reference this location and try again ',
'assoc_assets' => 'Hierdie ligging is tans geassosieer met ten minste een bate en kan nie uitgevee word nie. Dateer asseblief jou bates op om nie meer hierdie ligging te verwys nie en probeer weer.',
'assoc_child_loc' => 'Hierdie ligging is tans die ouer van ten minste een kind se plek en kan nie uitgevee word nie. Werk asseblief jou liggings by om nie meer hierdie ligging te verwys nie en probeer weer.',
'assigned_assets' => 'Assigned Assets',
'current_location' => 'Current Location',
'open_map' => 'Open in :map_provider_icon Maps',
'deleted_warning' => 'This location has been deleted. Please restore it before attempting to make any changes.',
'create' => array(
@@ -12,7 +12,8 @@ return [
'create' => 'Skep Ligging',
'update' => 'Opdateer Plek',
'print_assigned' => 'Print Assigned',
'print_all_assigned' => 'Print All Assigned',
'print_inventory' => 'Print Inventory',
'print_all_assigned' => 'Print Inventory and Assigned',
'name' => 'Pleknaam',
'address' => 'adres',
'address2' => 'Address Line 2',
+2 -3
View File
@@ -11,7 +11,6 @@ return array(
'title' => 'Bate Modelle',
'update' => 'Update Bate Model',
'view' => 'Bekyk bate-model',
'update' => 'Update Bate Model',
'clone' => 'Klone Model',
'edit' => 'Wysig Model',
'clone' => 'Klone Model',
'edit' => 'Wysig Model',
);
@@ -24,7 +24,6 @@ return [
'auto_assign_label' => 'Include this user when auto-assigning eligible licenses',
'auto_assign_help' => 'Skip this user in auto assignment of licenses',
'software_user' => 'Sagteware Uitgesoek na: naam',
'send_email_help' => 'You must provide an email address for this user to send them credentials. Emailing credentials can only be done on user creation. Passwords are stored in a one-way hash and cannot be retrieved once saved.',
'view_user' => 'Sien gebruiker: naam',
'usercsv' => 'CSV-lêer',
'two_factor_admin_optin_help' => 'Jou huidige administrasie-instellings laat selektiewe handhawing van twee-faktor-verifikasie toe.',
+21 -7
View File
@@ -160,7 +160,7 @@ return [
'import' => 'invoer',
'import_this_file' => 'Map fields and process this file',
'importing' => 'Importing',
'importing_help' => 'You can import assets, accessories, licenses, components, consumables, and users via CSV file. <br><br>The CSV should be comma-delimited and formatted with headers that match the ones in the <a href="https://snipe-it.readme.io/docs/importing" target="_new">sample CSVs in the documentation</a>.',
'importing_help' => 'The CSV should be comma-delimited and formatted with headers that match the ones in the <a href="https://snipe-it.readme.io/docs/importing" target="_new">sample CSVs in the documentation</a>.',
'import-history' => 'Invoer Geskiedenis',
'asset_maintenance' => 'Bate Onderhoud',
'asset_maintenance_report' => 'Asset Maintenance Report',
@@ -309,10 +309,12 @@ return [
'total_licenses' => 'totale lisensies',
'total_accessories' => 'totale toebehore',
'total_consumables' => 'totale verbruiksgoedere',
'total_cost' => 'Total Cost',
'type' => 'tipe',
'undeployable' => 'Un-verbintenis',
'unknown_admin' => 'Onbekende Admin',
'unknown_user' => 'Unknown User',
'unit_cost' => 'Unit Cost',
'username' => 'Gebruikersnaam',
'update' => 'Opdateer',
'updating_item' => 'Updating :item',
@@ -353,9 +355,11 @@ return [
'audit_overdue' => 'Overdue for Audit',
'accept' => 'Accept :asset',
'i_accept' => 'I accept',
'i_decline_item' => 'Decline this item',
'i_accept_item' => 'Accept this item',
'i_accept_with_count' => 'I accept :count item|I accept :count items',
'i_decline_item' => 'Decline this item|Decline these items',
'i_accept_item' => 'Accept this item|Accept these items',
'i_decline' => 'I decline',
'i_decline_with_count' => 'I decline :count item|I decline :count items',
'accept_decline' => 'Accept/Decline',
'sign_tos' => 'Sign below to indicate that you agree to the terms of service:',
'clear_signature' => 'Clear Signature',
@@ -394,6 +398,7 @@ return [
'permissions' => 'Permissions',
'managed_ldap' => '(Managed via LDAP)',
'export' => 'Export',
'export_all_to_csv' => 'Export all to CSV',
'ldap_sync' => 'LDAP Sync',
'ldap_user_sync' => 'LDAP User Sync',
'synchronize' => 'Synchronize',
@@ -483,7 +488,9 @@ return [
'update_existing_values' => 'Update Existing Values?',
'auto_incrementing_asset_tags_disabled_so_tags_required' => 'Generating auto-incrementing asset tags is disabled so all rows need to have the "Asset Tag" column populated.',
'auto_incrementing_asset_tags_enabled_so_now_assets_will_be_created' => 'Note: Generating auto-incrementing asset tags is enabled so assets will be created for rows that do not have "Asset Tag" populated. Rows that do have "Asset Tag" populated will be updated with the provided information.',
'send_welcome_email_to_users' => ' Send Welcome Email for new Users? Note that only users with a valid email address and who are marked as activated in your import file will received a welcome.',
'send_welcome_email_to_users' => ' Send welcome email to new users',
'send_welcome_email_help' => 'Only users with a valid email address and who are marked as activated will receive a welcome email where they can reset their password.',
'send_welcome_email_import_help' => 'Only new users with a valid email address and who are marked as activated in your import file will receive a welcome email where they can set their password.',
'send_email' => 'Send Email',
'call' => 'Call number',
'back_before_importing' => 'Backup before importing?',
@@ -513,7 +520,10 @@ return [
'item_notes' => ':item Notes',
'item_name_var' => ':item Name',
'error_user_company' => 'Checkout target company and asset company do not match',
'error_user_company_multiple' => 'One or more of the checkout target company and asset company do not match',
'error_user_company_accept_view' => 'An Asset assigned to you belongs to a different company so you can\'t accept nor deny it, please check with your manager',
'error_assets_already_checked_out' => 'One or more of the assets are already checked out',
'assigned_assets_removed' => 'The following were removed from the selected assets because they are already checked out',
'importer' => [
'checked_out_to_fullname' => 'Checked Out to: Full Name',
'checked_out_to_first_name' => 'Checked Out to: First Name',
@@ -585,6 +595,8 @@ return [
'components' => ':count Component|:count Components',
],
'show_inactive' => 'Expired or Terminated',
'show_expiring' => 'Expiring or Terminating Soon',
'more_info' => 'Meer inligting',
'quickscan_bulk_help' => 'Checking this box will edit the asset record to reflect this new location. Leaving it unchecked will simply note the location in the audit log. Note that if this asset is checked out, it will not change the location of the person, asset or location it is checked out to.',
'whoops' => 'Whoops!',
@@ -609,6 +621,8 @@ return [
'use_cloned_no_image_help' => 'This item does not have an associated image and instead inherits from the model or category it belongs to. If you would like to use a specific image for this item, you can upload a new one below.',
'footer_credit' => '<a target="_blank" href="https://snipeitapp.com" rel="noopener">Snipe-IT</a> is open source software, made with <i class="fa fa-heart" aria-hidden="true" style="color: #a94442; font-size: 10px" /></i><span class="sr-only">love</span> by <a href="https://bsky.app/profile/snipeitapp.com" rel="noopener">@snipeitapp.com</a>.',
'set_password' => 'Set a Password',
'upload_deleted' => 'Upload Deleted',
'child_locations' => 'Child Locations',
// Add form placeholders here
'placeholders' => [
@@ -625,11 +639,11 @@ return [
'site_default' => 'Site Default',
'default_blue' => 'Default Blue',
'blue_dark' => 'Blue (Dark Mode)',
'green' => 'Green Dark',
'green' => 'Green',
'green_dark' => 'Green (Dark Mode)',
'red' => 'Red Dark',
'red' => 'Red',
'red_dark' => 'Red (Dark Mode)',
'orange' => 'Orange Dark',
'orange' => 'Orange',
'orange_dark' => 'Orange (Dark Mode)',
'black' => 'Black',
'black_dark' => 'Black (Dark Mode)',
+13 -11
View File
@@ -3,9 +3,9 @@
return [
'Accessory_Checkin_Notification' => 'Accessory checked in',
'Accessory_Checkout_Notification' => 'Accessory checked out',
'Asset_Checkin_Notification' => 'Asset checked in: [:tag]',
'Asset_Checkout_Notification' => 'Asset checked out: [:tag]',
'Accessory_Checkout_Notification' => 'Accessory checked out|:count Accessories checked out',
'Asset_Checkin_Notification' => 'Asset checked in: :tag',
'Asset_Checkout_Notification' => 'Asset checked out: :tag',
'Confirm_Accessory_Checkin' => 'Accessory checkin confirmation',
'Confirm_Asset_Checkin' => 'Asset checkin confirmation',
'Confirm_component_checkin' => 'Component checkin confirmation',
@@ -21,8 +21,8 @@ return [
'Expected_Checkin_Date' => 'An asset checked out to you is due to be checked back in on :date',
'Expected_Checkin_Notification' => 'Reminder: :name checkin deadline approaching',
'Expected_Checkin_Report' => 'Expected asset checkin report',
'Expiring_Assets_Report' => 'Verlenging van bateverslag.',
'Expiring_Licenses_Report' => 'Verlenging van lisensiesverslag.',
'Expiring_Assets_Report' => 'Verlenging van bateverslag',
'Expiring_Licenses_Report' => 'Verlenging van lisensiesverslag',
'Item_Request_Canceled' => 'Item Versoek gekanselleer',
'Item_Requested' => 'Item gevra',
'License_Checkin_Notification' => 'License checked in',
@@ -31,7 +31,7 @@ return [
'Low_Inventory_Report' => 'Lae voorraadverslag',
'a_user_canceled' => '\'N Gebruiker het \'n itemversoek op die webwerf gekanselleer',
'a_user_requested' => '\'N Gebruiker het \'n item op die webwerf versoek',
'acceptance_asset_accepted_to_user' => 'You have accepted an item assigned to you by :site_name',
'acceptance_asset_accepted_to_user' => 'You have accepted an item assigned to you by :site_name|You have accepted :qty items assigned to you by :site_name',
'acceptance_asset_accepted' => 'A user has accepted an item',
'acceptance_asset_declined' => 'A user has declined an item',
'send_pdf_copy' => 'Send a copy of this acceptance to my email address',
@@ -42,8 +42,9 @@ return [
'asset_name' => 'Bate Naam',
'asset_requested' => 'Bate aangevra',
'asset_tag' => 'Bate-tag',
'assets_warrantee_alert' => 'There is :count asset with a warranty expiring in the next :threshold days.|There are :count assets with warranties expiring in the next :threshold days.',
'assets_warrantee_alert' => 'There is :count asset with an expiring warranty or that are reaching their end of life in the next :threshold days.|There are :count assets with expiring warranties or that are reaching their end of life in the next :threshold days.',
'assigned_to' => 'Toevertrou aan',
'eol' => 'EOL',
'best_regards' => 'Beste wense,',
'canceled' => 'Gekanselleer',
'checkin_date' => 'Incheckdatum',
@@ -58,6 +59,7 @@ return [
'days' => 'dae',
'expecting_checkin_date' => 'Verwagte tjekdatum',
'expires' => 'verstryk',
'terminates' => 'Terminates',
'following_accepted' => 'The following was accepted',
'following_declined' => 'The following was declined',
'hello' => 'hallo',
@@ -68,16 +70,16 @@ return [
'inventory_report' => 'Inventory Report',
'item' => 'item',
'item_checked_reminder' => 'This is a reminder that you currently have :count items checked out to you that you have not accepted or declined. Please click the link below to confirm your decision.',
'license_expiring_alert' => 'There is :count license expiring in the next :threshold days.|There are :count licenses expiring in the next :threshold days.',
'license_expiring_alert' => 'There is :count license expiring or terminating in the next :threshold days.|There are :count licenses expiring or terminating in the next :threshold days.',
'link_to_update_password' => 'Klik asseblief op die volgende skakel om u webtuiste te verander:',
'login' => 'Teken aan',
'login_first_admin' => 'Teken in op jou nuwe Snipe-IT-installasie deur die volgende inligting te gebruik:',
'low_inventory_alert' => 'There is :count item that is below minimum inventory or will soon be low.|There are :count items that are below minimum inventory or will soon be low.',
'min_QTY' => 'Min QTY',
'name' => 'naam',
'new_item_checked' => '\'N Nuwe item is onder u naam nagegaan, besonderhede is hieronder.',
'new_item_checked_with_acceptance' => 'A new item has been checked out under your name that requires acceptance, details are below.',
'new_item_checked_location' => 'A new item has been checked out to :location, details are below.',
'new_item_checked' => 'A new item has been checked out under your name, details are below.|:count new items have been checked out under your name, details are below.',
'new_item_checked_with_acceptance' => 'A new item has been checked out under your name that requires acceptance, details are below.|:count new items have been checked out under your name that requires acceptance, details are below.',
'new_item_checked_location' => 'A new item has been checked out to :location, details are below.|:count new items have been checked out to :location, details are below.',
'recent_item_checked' => 'An item was recently checked out under your name that requires acceptance, details are below.',
'notes' => 'notas',
'password' => 'wagwoord',
@@ -5,7 +5,7 @@ return [
'manage' => 'Manage',
'field' => 'Field',
'about_fieldsets_title' => 'About Fieldsets',
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used for specific asset model types.',
'custom_format' => 'Custom Regex format...',
'encrypt_field' => 'Encrypt the value of this field in the database',
'encrypt_field_help' => 'WARNING: Encrypting a field makes it unsearchable.',
@@ -2,7 +2,7 @@
return [
'about_asset_depreciations' => 'About Asset Depreciations',
'about_depreciations' => 'You can set up asset depreciations to depreciate assets based on straight-line depreciation.',
'about_depreciations' => 'You can set up asset depreciations to depreciate assets based on linear (straight-line), Half Year applied with condition, or Half Year always applied.',
'asset_depreciations' => 'Asset Depreciations',
'create' => 'Create Depreciation',
'depreciation_name' => 'Depreciation Name',
@@ -44,6 +44,8 @@ return [
'redirect_to_checked_out_to' => 'Go to Checked Out to',
'select_statustype' => 'Select Status Type',
'serial' => 'Serial',
'serial_required' => 'Asset :number requires a serial number',
'serial_required_post_model_update' => ':asset_model have been updated to require a serial number. Please add a serial number for this asset.',
'status' => 'Status',
'tag' => 'የንብረት መለያ',
'update' => 'Asset Update',
@@ -22,6 +22,8 @@ return [
'requested' => 'Requested',
'not_requestable' => 'Not Requestable',
'requestable_status_warning' => 'Do not change requestable status',
'require_serial' => 'Require Serial Number',
'require_serial_help' => 'A serial number will be required when creating a new asset of this model.',
'restore' => 'Restore Asset',
'pending' => 'Pending',
'undeployable' => 'Undeployable',
@@ -46,11 +46,12 @@ return array(
'not_enough_seats' => 'Not enough license seats available for checkout',
'mismatch' => 'The license seat provided does not match the license',
'unavailable' => 'This seat is not available for checkout.',
'license_is_inactive' => 'This license is expired or terminated.',
),
'checkin' => array(
'error' => 'There was an issue checking in the license. Please try again.',
'not_reassignable' => 'License not reassignable',
'not_reassignable' => 'Seat has been used',
'success' => 'The license was checked in successfully'
),
@@ -3,12 +3,13 @@
return array(
'does_not_exist' => 'Location does not exist.',
'assoc_users' => 'This location is not currently deletable because it is the location of record for at least one asset or user, has assets assigned to it, or is the parent location of another location. Please update your records to no longer reference this location and try again ',
'assoc_users' => 'This location is not currently deletable because it is the location of record for at least one item or user, has assets assigned to it, or is the parent location of another location. Please update your records to no longer reference this location and try again ',
'assoc_assets' => 'This location is currently associated with at least one asset and cannot be deleted. Please update your assets to no longer reference this location and try again. ',
'assoc_child_loc' => 'This location is currently the parent of at least one child location and cannot be deleted. Please update your locations to no longer reference this location and try again. ',
'assigned_assets' => 'Assigned Assets',
'current_location' => 'Current Location',
'open_map' => 'Open in :map_provider_icon Maps',
'deleted_warning' => 'This location has been deleted. Please restore it before attempting to make any changes.',
'create' => array(
@@ -12,7 +12,8 @@ return [
'create' => 'Create Location',
'update' => 'Update Location',
'print_assigned' => 'Print Assigned',
'print_all_assigned' => 'Print All Assigned',
'print_inventory' => 'Print Inventory',
'print_all_assigned' => 'Print Inventory and Assigned',
'name' => 'Location Name',
'address' => 'አድራሻ',
'address2' => 'Address Line 2',
+2 -3
View File
@@ -11,7 +11,6 @@ return array(
'title' => 'የንብረት ዓይነቶች',
'update' => 'Update Asset Model',
'view' => 'View Asset Model',
'update' => 'Update Asset Model',
'clone' => 'Clone Model',
'edit' => 'Edit Model',
'clone' => 'Clone Model',
'edit' => 'Edit Model',
);
@@ -24,7 +24,6 @@ return [
'auto_assign_label' => 'Include this user when auto-assigning eligible licenses',
'auto_assign_help' => 'Skip this user in auto assignment of licenses',
'software_user' => 'Software Checked out to :name',
'send_email_help' => 'You must provide an email address for this user to send them credentials. Emailing credentials can only be done on user creation. Passwords are stored in a one-way hash and cannot be retrieved once saved.',
'view_user' => 'View User :name',
'usercsv' => 'CSV file',
'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication. ',
+21 -7
View File
@@ -160,7 +160,7 @@ return [
'import' => 'Import',
'import_this_file' => 'Map fields and process this file',
'importing' => 'Importing',
'importing_help' => 'You can import assets, accessories, licenses, components, consumables, and users via CSV file. <br><br>The CSV should be comma-delimited and formatted with headers that match the ones in the <a href="https://snipe-it.readme.io/docs/importing" target="_new">sample CSVs in the documentation</a>.',
'importing_help' => 'The CSV should be comma-delimited and formatted with headers that match the ones in the <a href="https://snipe-it.readme.io/docs/importing" target="_new">sample CSVs in the documentation</a>.',
'import-history' => 'Import History',
'asset_maintenance' => 'Asset Maintenance',
'asset_maintenance_report' => 'Asset Maintenance Report',
@@ -309,10 +309,12 @@ return [
'total_licenses' => 'total licenses',
'total_accessories' => 'total accessories',
'total_consumables' => 'total consumables',
'total_cost' => 'Total Cost',
'type' => 'Type',
'undeployable' => 'Un-deployable',
'unknown_admin' => 'Unknown Admin',
'unknown_user' => 'Unknown User',
'unit_cost' => 'Unit Cost',
'username' => 'Username',
'update' => 'Update',
'updating_item' => 'Updating :item',
@@ -353,9 +355,11 @@ return [
'audit_overdue' => 'Overdue for Audit',
'accept' => 'Accept :asset',
'i_accept' => 'I accept',
'i_decline_item' => 'Decline this item',
'i_accept_item' => 'Accept this item',
'i_accept_with_count' => 'I accept :count item|I accept :count items',
'i_decline_item' => 'Decline this item|Decline these items',
'i_accept_item' => 'Accept this item|Accept these items',
'i_decline' => 'I decline',
'i_decline_with_count' => 'I decline :count item|I decline :count items',
'accept_decline' => 'Accept/Decline',
'sign_tos' => 'Sign below to indicate that you agree to the terms of service:',
'clear_signature' => 'Clear Signature',
@@ -394,6 +398,7 @@ return [
'permissions' => 'Permissions',
'managed_ldap' => '(Managed via LDAP)',
'export' => 'Export',
'export_all_to_csv' => 'Export all to CSV',
'ldap_sync' => 'LDAP Sync',
'ldap_user_sync' => 'LDAP User Sync',
'synchronize' => 'Synchronize',
@@ -483,7 +488,9 @@ return [
'update_existing_values' => 'Update Existing Values?',
'auto_incrementing_asset_tags_disabled_so_tags_required' => 'Generating auto-incrementing asset tags is disabled so all rows need to have the "Asset Tag" column populated.',
'auto_incrementing_asset_tags_enabled_so_now_assets_will_be_created' => 'Note: Generating auto-incrementing asset tags is enabled so assets will be created for rows that do not have "Asset Tag" populated. Rows that do have "Asset Tag" populated will be updated with the provided information.',
'send_welcome_email_to_users' => ' Send Welcome Email for new Users? Note that only users with a valid email address and who are marked as activated in your import file will received a welcome.',
'send_welcome_email_to_users' => ' Send welcome email to new users',
'send_welcome_email_help' => 'Only users with a valid email address and who are marked as activated will receive a welcome email where they can reset their password.',
'send_welcome_email_import_help' => 'Only new users with a valid email address and who are marked as activated in your import file will receive a welcome email where they can set their password.',
'send_email' => 'Send Email',
'call' => 'Call number',
'back_before_importing' => 'Backup before importing?',
@@ -513,7 +520,10 @@ return [
'item_notes' => ':item Notes',
'item_name_var' => ':item Name',
'error_user_company' => 'Checkout target company and asset company do not match',
'error_user_company_multiple' => 'One or more of the checkout target company and asset company do not match',
'error_user_company_accept_view' => 'An Asset assigned to you belongs to a different company so you can\'t accept nor deny it, please check with your manager',
'error_assets_already_checked_out' => 'One or more of the assets are already checked out',
'assigned_assets_removed' => 'The following were removed from the selected assets because they are already checked out',
'importer' => [
'checked_out_to_fullname' => 'Checked Out to: Full Name',
'checked_out_to_first_name' => 'Checked Out to: First Name',
@@ -585,6 +595,8 @@ return [
'components' => ':count Component|:count Components',
],
'show_inactive' => 'Expired or Terminated',
'show_expiring' => 'Expiring or Terminating Soon',
'more_info' => 'More Info',
'quickscan_bulk_help' => 'Checking this box will edit the asset record to reflect this new location. Leaving it unchecked will simply note the location in the audit log. Note that if this asset is checked out, it will not change the location of the person, asset or location it is checked out to.',
'whoops' => 'Whoops!',
@@ -609,6 +621,8 @@ return [
'use_cloned_no_image_help' => 'This item does not have an associated image and instead inherits from the model or category it belongs to. If you would like to use a specific image for this item, you can upload a new one below.',
'footer_credit' => '<a target="_blank" href="https://snipeitapp.com" rel="noopener">Snipe-IT</a> is open source software, made with <i class="fa fa-heart" aria-hidden="true" style="color: #a94442; font-size: 10px" /></i><span class="sr-only">love</span> by <a href="https://bsky.app/profile/snipeitapp.com" rel="noopener">@snipeitapp.com</a>.',
'set_password' => 'Set a Password',
'upload_deleted' => 'Upload Deleted',
'child_locations' => 'Child Locations',
// Add form placeholders here
'placeholders' => [
@@ -625,11 +639,11 @@ return [
'site_default' => 'Site Default',
'default_blue' => 'Default Blue',
'blue_dark' => 'Blue (Dark Mode)',
'green' => 'Green Dark',
'green' => 'Green',
'green_dark' => 'Green (Dark Mode)',
'red' => 'Red Dark',
'red' => 'Red',
'red_dark' => 'Red (Dark Mode)',
'orange' => 'Orange Dark',
'orange' => 'Orange',
'orange_dark' => 'Orange (Dark Mode)',
'black' => 'Black',
'black_dark' => 'Black (Dark Mode)',
+13 -11
View File
@@ -3,9 +3,9 @@
return [
'Accessory_Checkin_Notification' => 'Accessory checked in',
'Accessory_Checkout_Notification' => 'Accessory checked out',
'Asset_Checkin_Notification' => 'Asset checked in: [:tag]',
'Asset_Checkout_Notification' => 'Asset checked out: [:tag]',
'Accessory_Checkout_Notification' => 'Accessory checked out|:count Accessories checked out',
'Asset_Checkin_Notification' => 'Asset checked in: :tag',
'Asset_Checkout_Notification' => 'Asset checked out: :tag',
'Confirm_Accessory_Checkin' => 'Accessory checkin confirmation',
'Confirm_Asset_Checkin' => 'Asset checkin confirmation',
'Confirm_component_checkin' => 'Component checkin confirmation',
@@ -21,8 +21,8 @@ return [
'Expected_Checkin_Date' => 'An asset checked out to you is due to be checked back in on :date',
'Expected_Checkin_Notification' => 'Reminder: :name checkin deadline approaching',
'Expected_Checkin_Report' => 'Expected asset checkin report',
'Expiring_Assets_Report' => 'Expiring Assets Report.',
'Expiring_Licenses_Report' => 'Expiring Licenses Report.',
'Expiring_Assets_Report' => 'Expiring Assets Report',
'Expiring_Licenses_Report' => 'Expiring Licenses Report',
'Item_Request_Canceled' => 'Item Request Canceled',
'Item_Requested' => 'Item Requested',
'License_Checkin_Notification' => 'License checked in',
@@ -31,7 +31,7 @@ return [
'Low_Inventory_Report' => 'Low Inventory Report',
'a_user_canceled' => 'A user has canceled an item request on the website',
'a_user_requested' => 'A user has requested an item on the website',
'acceptance_asset_accepted_to_user' => 'You have accepted an item assigned to you by :site_name',
'acceptance_asset_accepted_to_user' => 'You have accepted an item assigned to you by :site_name|You have accepted :qty items assigned to you by :site_name',
'acceptance_asset_accepted' => 'A user has accepted an item',
'acceptance_asset_declined' => 'A user has declined an item',
'send_pdf_copy' => 'Send a copy of this acceptance to my email address',
@@ -42,8 +42,9 @@ return [
'asset_name' => 'Asset Name',
'asset_requested' => 'Asset requested',
'asset_tag' => 'የንብረት መለያ',
'assets_warrantee_alert' => 'There is :count asset with a warranty expiring in the next :threshold days.|There are :count assets with warranties expiring in the next :threshold days.',
'assets_warrantee_alert' => 'There is :count asset with an expiring warranty or that are reaching their end of life in the next :threshold days.|There are :count assets with expiring warranties or that are reaching their end of life in the next :threshold days.',
'assigned_to' => 'Assigned To',
'eol' => 'EOL',
'best_regards' => 'Best regards,',
'canceled' => 'Canceled',
'checkin_date' => 'Checkin Date',
@@ -58,6 +59,7 @@ return [
'days' => 'Days',
'expecting_checkin_date' => 'Expected Checkin Date',
'expires' => 'Expires',
'terminates' => 'Terminates',
'following_accepted' => 'The following was accepted',
'following_declined' => 'The following was declined',
'hello' => 'Hello',
@@ -68,16 +70,16 @@ return [
'inventory_report' => 'Inventory Report',
'item' => 'Item',
'item_checked_reminder' => 'This is a reminder that you currently have :count items checked out to you that you have not accepted or declined. Please click the link below to confirm your decision.',
'license_expiring_alert' => 'There is :count license expiring in the next :threshold days.|There are :count licenses expiring in the next :threshold days.',
'license_expiring_alert' => 'There is :count license expiring or terminating in the next :threshold days.|There are :count licenses expiring or terminating in the next :threshold days.',
'link_to_update_password' => 'Please click on the following link to update your :web password:',
'login' => 'Login',
'login_first_admin' => 'Login to your new Snipe-IT installation using the credentials below:',
'low_inventory_alert' => 'There is :count item that is below minimum inventory or will soon be low.|There are :count items that are below minimum inventory or will soon be low.',
'min_QTY' => 'Min QTY',
'name' => 'Name',
'new_item_checked' => 'A new item has been checked out under your name, details are below.',
'new_item_checked_with_acceptance' => 'A new item has been checked out under your name that requires acceptance, details are below.',
'new_item_checked_location' => 'A new item has been checked out to :location, details are below.',
'new_item_checked' => 'A new item has been checked out under your name, details are below.|:count new items have been checked out under your name, details are below.',
'new_item_checked_with_acceptance' => 'A new item has been checked out under your name that requires acceptance, details are below.|:count new items have been checked out under your name that requires acceptance, details are below.',
'new_item_checked_location' => 'A new item has been checked out to :location, details are below.|:count new items have been checked out to :location, details are below.',
'recent_item_checked' => 'An item was recently checked out under your name that requires acceptance, details are below.',
'notes' => 'Notes',
'password' => 'Password',
@@ -5,7 +5,7 @@ return [
'manage' => 'إدارة',
'field' => 'حقل',
'about_fieldsets_title' => 'حول مجموعة الحقول',
'about_fieldsets_text' => '(مجموعات الحقول) تسمح لك بإنشاء مجموعات من الحقول اللتي يمكن إعادة إستخدامها مع موديل محدد.',
'about_fieldsets_text' => 'مجموعات الحقول تسمح لك بإنشاء مجموعات من الحقول المخصصة التي يعاد استخدامها في كثير من الأحيان لأنواع معينة من نماذج الأصول.',
'custom_format' => 'تنسيق Regex المخصص...',
'encrypt_field' => 'تشفير قيمة هذا الحقل في قاعدة البيانات',
'encrypt_field_help' => 'تحذير: تشفير الحقل يجعله غير قابل للبحث.',
@@ -2,7 +2,7 @@
return [
'about_asset_depreciations' => 'حول استهلاك الأصول',
'about_depreciations' => 'يمكنك إعداد استهلاك الأصول لخفض قيمة الأصول على اساس القسط الثابت للاستهلاك.',
'about_depreciations' => 'You can set up asset depreciations to depreciate assets based on linear (straight-line), Half Year applied with condition, or Half Year always applied.',
'asset_depreciations' => 'استهلاك الأصول',
'create' => 'إنشاء الاستهلاك',
'depreciation_name' => 'اسم الاستهلاك',
@@ -44,6 +44,8 @@ return [
'redirect_to_checked_out_to' => 'Go to Checked Out to',
'select_statustype' => 'حدد نوع الحالة',
'serial' => 'التسلسل',
'serial_required' => 'Asset :number requires a serial number',
'serial_required_post_model_update' => ':asset_model have been updated to require a serial number. Please add a serial number for this asset.',
'status' => 'الحالة',
'tag' => 'ترميز الأصل',
'update' => 'تحديث الأصل',
@@ -22,6 +22,8 @@ return [
'requested' => 'تم الطلب',
'not_requestable' => 'غير مطلوب',
'requestable_status_warning' => 'لا تقم بتغيير حالة الطلب',
'require_serial' => 'Require Serial Number',
'require_serial_help' => 'A serial number will be required when creating a new asset of this model.',
'restore' => 'استعادة الأصل',
'pending' => 'قيد الانتظار',
'undeployable' => 'غير قابل للتوزيع',
@@ -46,11 +46,12 @@ return array(
'not_enough_seats' => 'لا توجد مقاعد ترخيص كافية متاحة للدفع',
'mismatch' => 'The license seat provided does not match the license',
'unavailable' => 'This seat is not available for checkout.',
'license_is_inactive' => 'This license is expired or terminated.',
),
'checkin' => array(
'error' => 'حدثت مشكلة في التحقق من الترخيص. يرجى إعادة المحاولة.',
'not_reassignable' => 'License not reassignable',
'not_reassignable' => 'Seat has been used',
'success' => 'تم ادخال الترخيص بنجاح'
),
@@ -3,12 +3,13 @@
return array(
'does_not_exist' => 'الموقع غير موجود.',
'assoc_users' => 'This location is not currently deletable because it is the location of record for at least one asset or user, has assets assigned to it, or is the parent location of another location. Please update your records to no longer reference this location and try again ',
'assoc_users' => 'This location is not currently deletable because it is the location of record for at least one item or user, has assets assigned to it, or is the parent location of another location. Please update your records to no longer reference this location and try again ',
'assoc_assets' => 'هذا الموقع مرتبط حاليا بمادة عرض واحدة على الأقل ولا يمكن حذفها. يرجى تحديث مواد العرض لم تعد تشير إلى هذا الموقع ثم أعد المحاولة. ',
'assoc_child_loc' => 'هذا الموقع هو حاليا أحد الوالدين لموقع طفل واحد على الأقل ولا يمكن حذفه. يرجى تحديث مواقعك لم تعد تشير إلى هذا الموقع ثم أعد المحاولة.',
'assigned_assets' => 'الأصول المعينة',
'current_location' => 'الموقع الحالي',
'open_map' => 'Open in :map_provider_icon Maps',
'deleted_warning' => 'This location has been deleted. Please restore it before attempting to make any changes.',
'create' => array(
@@ -12,7 +12,8 @@ return [
'create' => 'إنشاء موقع',
'update' => 'تحديث الموقع',
'print_assigned' => 'طباعة كل الممتلكات',
'print_all_assigned' => 'طباعة كل المعين',
'print_inventory' => 'Print Inventory',
'print_all_assigned' => 'Print Inventory and Assigned',
'name' => 'إسم الموقع',
'address' => 'العنوان',
'address2' => 'سطر العنوان 2',
+2 -3
View File
@@ -11,7 +11,6 @@ return array(
'title' => 'موديلات الأصول',
'update' => 'تحديث موديل الأصول',
'view' => 'عرض موديل الأصول',
'update' => 'تحديث موديل الأصول',
'clone' => 'استنساخ الموديل',
'edit' => 'تعديل الموديل',
'clone' => 'استنساخ الموديل',
'edit' => 'تعديل الموديل',
);
@@ -24,7 +24,6 @@ return [
'auto_assign_label' => 'تضمين هذا المستخدم عند التعيين التلقائي للتراخيص المؤهلة',
'auto_assign_help' => 'تخطي هذا المستخدم في التعيين التلقائي للترخيص',
'software_user' => 'البرامج المخرجة الى: :name',
'send_email_help' => 'يجب عليك توفير عنوان بريد إلكتروني لهذا المستخدم لإرسال بيانات اعتماده. لا يمكن إرسال بيانات الاعتماد البريدية إلا عند إنشاء المستخدم. يتم تخزين كلمات المرور في تجزئة ذات اتجاه واحد ولا يمكن استرجاعها بمجرد الحفظ.',
'view_user' => 'عرض المستخدم :name',
'usercsv' => 'ملف CSV',
'two_factor_admin_optin_help' => 'تسمح إعدادات المشرف الحالية بإنفاذ انتقائي للمصادقة الثنائية.',
+21 -7
View File
@@ -160,7 +160,7 @@ return [
'import' => 'استيراد',
'import_this_file' => 'حقول الخريطة ومعالجة هذا الملف',
'importing' => 'الاستيراد',
'importing_help' => 'يمكنك استيراد الأصول، الملحقات، التراخيص، المكونات، المواد الاستهلاكية، والمستخدمين عبر ملف CSV. <br><br>يجب أن تكون CSV محددة بفواصل وأن يتم تنسيقها مع رؤوس تطابق تلك الموجودة في <a href="https://snipe-it.readme.io/docs/importing" target="_new">عينة CSVs في الوثائق</a>.',
'importing_help' => 'The CSV should be comma-delimited and formatted with headers that match the ones in the <a href="https://snipe-it.readme.io/docs/importing" target="_new">sample CSVs in the documentation</a>.',
'import-history' => 'استيراد الأرشيف',
'asset_maintenance' => 'صيانة الأصول',
'asset_maintenance_report' => 'تقرير صيانة الأصول',
@@ -309,10 +309,12 @@ return [
'total_licenses' => 'مجموع التراخيص',
'total_accessories' => 'مجموع الملحقات',
'total_consumables' => 'مجموع المواد الاستهلاكية',
'total_cost' => 'Total Cost',
'type' => 'اكتب',
'undeployable' => 'غير قابلة للتوزيع',
'unknown_admin' => 'إداري غير معروف',
'unknown_user' => 'Unknown User',
'unit_cost' => 'Unit Cost',
'username' => 'اسم المستخدم',
'update' => 'تحديث',
'updating_item' => 'Updating :item',
@@ -353,9 +355,11 @@ return [
'audit_overdue' => 'مراجعة الحسابات المتأخرة',
'accept' => 'قبول :asset',
'i_accept' => 'قبول',
'i_decline_item' => 'Decline this item',
'i_accept_item' => 'Accept this item',
'i_accept_with_count' => 'I accept :count item|I accept :count items',
'i_decline_item' => 'Decline this item|Decline these items',
'i_accept_item' => 'Accept this item|Accept these items',
'i_decline' => 'أنا أرفض',
'i_decline_with_count' => 'I decline :count item|I decline :count items',
'accept_decline' => 'قبول/رفض',
'sign_tos' => 'قم بتسجيل الدخول أدناه للإشارة إلى أنك توافق على شروط الخدمة:',
'clear_signature' => 'مسح التوقيع',
@@ -394,6 +398,7 @@ return [
'permissions' => 'الأذونات',
'managed_ldap' => '(تدار عبر LDAP)',
'export' => 'تصدير',
'export_all_to_csv' => 'Export all to CSV',
'ldap_sync' => 'مزامنة LDAP',
'ldap_user_sync' => 'مزامنة مستخدم LDAP',
'synchronize' => 'مزامنة',
@@ -483,7 +488,9 @@ return [
'update_existing_values' => 'تحديث القيم الموجودة؟',
'auto_incrementing_asset_tags_disabled_so_tags_required' => 'تم تعطيل إنشاء علامات الأصول التزايدية التلقائية لذلك يجب أن يكون لجميع الصفوف عمود "علامة الأصول" مأهول.',
'auto_incrementing_asset_tags_enabled_so_now_assets_will_be_created' => 'ملاحظة: تم تمكين إنشاء علامات الأصول التزايدية التلقائية لذلك سيتم إنشاء أصول للصفوف التي لا تحتوي على "علامة الأصول" مأهولة. الصفوف التي تحتوي على "علامة أصول" مأهولة سيتم تحديثها مع المعلومات المقدمة.',
'send_welcome_email_to_users' => ' Send Welcome Email for new Users? Note that only users with a valid email address and who are marked as activated in your import file will received a welcome.',
'send_welcome_email_to_users' => ' Send welcome email to new users',
'send_welcome_email_help' => 'Only users with a valid email address and who are marked as activated will receive a welcome email where they can reset their password.',
'send_welcome_email_import_help' => 'Only new users with a valid email address and who are marked as activated in your import file will receive a welcome email where they can set their password.',
'send_email' => 'إرسال البريد الإلكتروني',
'call' => 'رقم المكالمة',
'back_before_importing' => 'النسخ الاحتياطي قبل الاستيراد؟',
@@ -513,7 +520,10 @@ return [
'item_notes' => ':item ملاحظات',
'item_name_var' => ':إسم العنصر',
'error_user_company' => 'لا تتطابق الشركة المستهدفة وشركة الأصول',
'error_user_company_multiple' => 'One or more of the checkout target company and asset company do not match',
'error_user_company_accept_view' => 'الأصل الذي تم تعيينه لك ينتمي إلى شركة أخرى لذلك لا يمكنك قبوله أو رفضه، يرجى التحقق من المدير الخاص بك',
'error_assets_already_checked_out' => 'One or more of the assets are already checked out',
'assigned_assets_removed' => 'The following were removed from the selected assets because they are already checked out',
'importer' => [
'checked_out_to_fullname' => 'تم الخروج إلى: الاسم الكامل',
'checked_out_to_first_name' => 'تم الخروج إلى: الاسم الأول',
@@ -585,6 +595,8 @@ return [
'components' => ':count مكون<unk> :count مكونات',
],
'show_inactive' => 'Expired or Terminated',
'show_expiring' => 'Expiring or Terminating Soon',
'more_info' => 'المزيد من المعلومات',
'quickscan_bulk_help' => 'Checking this box will edit the asset record to reflect this new location. Leaving it unchecked will simply note the location in the audit log. Note that if this asset is checked out, it will not change the location of the person, asset or location it is checked out to.',
'whoops' => 'Whoops!',
@@ -609,6 +621,8 @@ return [
'use_cloned_no_image_help' => 'This item does not have an associated image and instead inherits from the model or category it belongs to. If you would like to use a specific image for this item, you can upload a new one below.',
'footer_credit' => '<a target="_blank" href="https://snipeitapp.com" rel="noopener">Snipe-IT</a> is open source software, made with <i class="fa fa-heart" aria-hidden="true" style="color: #a94442; font-size: 10px" /></i><span class="sr-only">love</span> by <a href="https://bsky.app/profile/snipeitapp.com" rel="noopener">@snipeitapp.com</a>.',
'set_password' => 'Set a Password',
'upload_deleted' => 'Upload Deleted',
'child_locations' => 'Child Locations',
// Add form placeholders here
'placeholders' => [
@@ -625,11 +639,11 @@ return [
'site_default' => 'Site Default',
'default_blue' => 'Default Blue',
'blue_dark' => 'Blue (Dark Mode)',
'green' => 'Green Dark',
'green' => 'Green',
'green_dark' => 'Green (Dark Mode)',
'red' => 'Red Dark',
'red' => 'Red',
'red_dark' => 'Red (Dark Mode)',
'orange' => 'Orange Dark',
'orange' => 'Orange',
'orange_dark' => 'Orange (Dark Mode)',
'black' => 'Black',
'black_dark' => 'Black (Dark Mode)',
+13 -11
View File
@@ -3,9 +3,9 @@
return [
'Accessory_Checkin_Notification' => 'تم تسحيل الملحق',
'Accessory_Checkout_Notification' => 'تم التحقق من الملحق',
'Asset_Checkin_Notification' => 'Asset checked in: [:tag]',
'Asset_Checkout_Notification' => 'Asset checked out: [:tag]',
'Accessory_Checkout_Notification' => 'Accessory checked out|:count Accessories checked out',
'Asset_Checkin_Notification' => 'Asset checked in: :tag',
'Asset_Checkout_Notification' => 'Asset checked out: :tag',
'Confirm_Accessory_Checkin' => 'تأكيد تسجيل الأصول',
'Confirm_Asset_Checkin' => 'تأكيد تسجيل الأصول',
'Confirm_component_checkin' => 'Component checkin confirmation',
@@ -21,8 +21,8 @@ return [
'Expected_Checkin_Date' => 'من المقرر أن يتم التحقق من الأصول التي تم إخراجها إليك في :date',
'Expected_Checkin_Notification' => 'تذكير: تاريخ تحقق :name يقترب من الموعد النهائي',
'Expected_Checkin_Report' => 'تقرير تسجيل الأصول المتوقع',
'Expiring_Assets_Report' => 'تقرير الأصول المنتهية الصلاحية.',
'Expiring_Licenses_Report' => 'تقرير التراخيص المنتهية الصلاحية.',
'Expiring_Assets_Report' => 'تقرير الأصول المنتهية الصلاحية',
'Expiring_Licenses_Report' => 'تقرير التراخيص المنتهية الصلاحية',
'Item_Request_Canceled' => 'تم إلغاء طلب العنصر',
'Item_Requested' => 'العنصر المطلوب',
'License_Checkin_Notification' => 'تم تسجيل الرخصة',
@@ -31,7 +31,7 @@ return [
'Low_Inventory_Report' => 'تقرير المخزون المنخفض',
'a_user_canceled' => 'ألغى المستخدم طلب عنصر على الموقع',
'a_user_requested' => 'طلب مستخدم عنصر على الموقع',
'acceptance_asset_accepted_to_user' => 'You have accepted an item assigned to you by :site_name',
'acceptance_asset_accepted_to_user' => 'You have accepted an item assigned to you by :site_name|You have accepted :qty items assigned to you by :site_name',
'acceptance_asset_accepted' => 'قام مستخدم بقبول عنصر',
'acceptance_asset_declined' => 'قام مستخدم برفض عنصر',
'send_pdf_copy' => 'Send a copy of this acceptance to my email address',
@@ -42,8 +42,9 @@ return [
'asset_name' => 'اسم الأصل',
'asset_requested' => 'تم طلب مادة العرض',
'asset_tag' => 'وسم الأصل',
'assets_warrantee_alert' => 'هناك :count أصل مع ضمان تنتهي صلاحيته في :threshold أيام.<unk> هناك :count أصول مع ضمانات تنتهي صلاحيتها في :threshold أيام.',
'assets_warrantee_alert' => 'There is :count asset with an expiring warranty or that are reaching their end of life in the next :threshold days.|There are :count assets with expiring warranties or that are reaching their end of life in the next :threshold days.',
'assigned_to' => 'عينت الى',
'eol' => 'نهاية العمر',
'best_regards' => 'أفضل التحيات،',
'canceled' => 'ملغى',
'checkin_date' => 'تاريخ الادخال',
@@ -58,6 +59,7 @@ return [
'days' => 'أيام',
'expecting_checkin_date' => 'تاريخ الادخال المتوقع',
'expires' => 'ينتهي',
'terminates' => 'Terminates',
'following_accepted' => 'The following was accepted',
'following_declined' => 'The following was declined',
'hello' => 'مرحبا',
@@ -68,16 +70,16 @@ return [
'inventory_report' => 'تقرير المخزون',
'item' => 'عنصر',
'item_checked_reminder' => 'This is a reminder that you currently have :count items checked out to you that you have not accepted or declined. Please click the link below to confirm your decision.',
'license_expiring_alert' => 'هنالك :count رخص سوف تنتهي في الأيام :threshold القادمة.',
'license_expiring_alert' => 'There is :count license expiring or terminating in the next :threshold days.|There are :count licenses expiring or terminating in the next :threshold days.',
'link_to_update_password' => 'يرجى النقر على الرابط التالي لتحديث كلمة المرور الخاصة بك على :web :',
'login' => 'الدخول',
'login_first_admin' => 'قم بتسجيل الدخول إلى التثبيت الجديد من Snipe-IT باستخدام البيانات أدناه:',
'low_inventory_alert' => 'هنالك :count عناصر أقل من الحد الأدنى للمخزون أول سوف تصبح أقل منه قريباً.',
'min_QTY' => 'دقيقة الكمية',
'name' => 'اسم',
'new_item_checked' => 'تم فحص عنصر جديد تحت اسمك، التفاصيل أدناه.',
'new_item_checked_with_acceptance' => 'A new item has been checked out under your name that requires acceptance, details are below.',
'new_item_checked_location' => 'A new item has been checked out to :location, details are below.',
'new_item_checked' => 'A new item has been checked out under your name, details are below.|:count new items have been checked out under your name, details are below.',
'new_item_checked_with_acceptance' => 'A new item has been checked out under your name that requires acceptance, details are below.|:count new items have been checked out under your name that requires acceptance, details are below.',
'new_item_checked_location' => 'A new item has been checked out to :location, details are below.|:count new items have been checked out to :location, details are below.',
'recent_item_checked' => 'An item was recently checked out under your name that requires acceptance, details are below.',
'notes' => 'ملاحظات',
'password' => 'كلمة المرور',
@@ -5,7 +5,7 @@ return [
'manage' => 'Управление',
'field' => 'Поле',
'about_fieldsets_title' => 'Относно Fieldsets',
'about_fieldsets_text' => 'Fieldsets позволяват създаването на групи от персонализирани полета, които се използват и преизползват често за специфични типове модели на активи.',
'about_fieldsets_text' => '"Група от полета" позволяват създаването на групи от персонализирани полета, които се използват и преизползват често за специфични типове модели на активи.',
'custom_format' => 'Персонализиран формат...',
'encrypt_field' => 'Шифроване на стойността на това поле в базата данни',
'encrypt_field_help' => 'ВНИМАНИЕ: Шифроване на поле го прави невалидно за търсене.',
@@ -2,7 +2,7 @@
return [
'about_asset_depreciations' => 'Относно амортизацията на активи',
'about_depreciations' => 'Тук можете да конфигурирате линейна амортизация на активи във времето.',
'about_depreciations' => 'You can set up asset depreciations to depreciate assets based on linear (straight-line), Half Year applied with condition, or Half Year always applied.',
'asset_depreciations' => 'Амортизация на активи',
'create' => 'Създаване на амортизация',
'depreciation_name' => 'Амортизация',
@@ -44,6 +44,8 @@ return [
'redirect_to_checked_out_to' => 'Отидете на Checked Out to',
'select_statustype' => 'Избиране на тип на статуса',
'serial' => 'Сериен номер',
'serial_required' => 'Asset :number requires a serial number',
'serial_required_post_model_update' => ':asset_model have been updated to require a serial number. Please add a serial number for this asset.',
'status' => 'Статус',
'tag' => 'Инвентарен номер',
'update' => 'Обновяване на актив',
@@ -22,6 +22,8 @@ return [
'requested' => 'Изискан',
'not_requestable' => 'Не може да бъде изискан',
'requestable_status_warning' => 'Да не се сменя статуса за изискване',
'require_serial' => 'Require Serial Number',
'require_serial_help' => 'A serial number will be required when creating a new asset of this model.',
'restore' => 'Възстановяване на актив',
'pending' => 'Предстоящ',
'undeployable' => 'Не може да бъде предоставян',
@@ -46,11 +46,12 @@ return array(
'not_enough_seats' => 'Няма достатъчно лицензи за изписване',
'mismatch' => 'Броя лицензни места не отговаря на броя лицензи',
'unavailable' => 'Този лиценз за работно място не е наличен за изписване.',
'license_is_inactive' => 'This license is expired or terminated.',
),
'checkin' => array(
'error' => 'Възникна проблем при вписването на лиценза. Моля, опитайте отново.',
'not_reassignable' => 'Лиценза не може да се прехвърля',
'not_reassignable' => 'Seat has been used',
'success' => 'Лицензът е вписан'
),
@@ -3,12 +3,13 @@
return array(
'does_not_exist' => 'Местоположението не съществува.',
'assoc_users' => 'Това местоположение не може да бъде изтрито, защото има поне един запис на актив или потребител, зачислен към него или съдържа под локаций. Моля обновете вашите записи, така че да не съдържат това местоположение и пробвайте да го изтриете отново. ',
'assoc_users' => 'This location is not currently deletable because it is the location of record for at least one item or user, has assets assigned to it, or is the parent location of another location. Please update your records to no longer reference this location and try again ',
'assoc_assets' => 'Местоположението е свързано с поне един актив и не може да бъде изтрито. Моля, актуализирайте активите, така че да не са свързани с това местоположение и опитайте отново. ',
'assoc_child_loc' => 'В избраното местоположение е присъединено едно или повече местоположения. Моля преместете ги в друго и опитайте отново.',
'assigned_assets' => 'Изписани Активи',
'current_location' => 'Текущо местоположение',
'open_map' => 'Отвори в :map_provider_icon карти',
'deleted_warning' => 'This location has been deleted. Please restore it before attempting to make any changes.',
'create' => array(
@@ -12,7 +12,8 @@ return [
'create' => 'Създаване на местоположение',
'update' => 'Обновяване на местоположение',
'print_assigned' => 'Печат',
'print_all_assigned' => 'Печат на всички отдадени',
'print_inventory' => 'Print Inventory',
'print_all_assigned' => 'Print Inventory and Assigned',
'name' => 'Местоположение',
'address' => 'Aдрес',
'address2' => 'Адрес ред 2',
+2 -3
View File
@@ -11,7 +11,6 @@ return array(
'title' => 'Модели на активи',
'update' => 'Обновяване на модел на актив',
'view' => 'Преглед на модел на актив',
'update' => 'Обновяване на модел на актив',
'clone' => 'Копиране на модел',
'edit' => 'Редакция на модел',
'clone' => 'Копиране на модел',
'edit' => 'Редакция на модел',
);
@@ -24,7 +24,6 @@ return [
'auto_assign_label' => 'Включи този потребител при автоматичното асоцииране на лицензи',
'auto_assign_help' => 'Не включвай този потребител при автоматичното асоцииране на лицензи',
'software_user' => 'Софтуерни продукти, изписани на :name',
'send_email_help' => 'Трябва да предоставите е-майл адрес за този потребител за да му се изпратят името и паролата. Изпращането на име и парола може да стане при създаването на потребителя. Паролите се съхраняват криптирани и не могат да се възстановят.',
'view_user' => 'Преглед на потребител :name',
'usercsv' => 'CSV файл',
'two_factor_admin_optin_help' => 'Текущите настройки на администратор позволяват избирателно прилагане на двуфакторова автентификация. ',
+21 -7
View File
@@ -160,7 +160,7 @@ return [
'import' => 'Зареждане',
'import_this_file' => 'Асоциирайте полетата и обработете този файл',
'importing' => 'Импортиране',
'importing_help' => 'Може да импортирате активи, аксесоари, лицензи, компоненти, консумативи и потребители чрез CSV файл. <br><br>CSV файла трябва да е разделен със запетая и форматирани колони, като тези от <a href="https://snipe-it.readme.io/docs/importing" target="_new">примерен CSV файл</a>.',
'importing_help' => 'The CSV should be comma-delimited and formatted with headers that match the ones in the <a href="https://snipe-it.readme.io/docs/importing" target="_new">sample CSVs in the documentation</a>.',
'import-history' => 'История на въвеждане',
'asset_maintenance' => 'Поддръжка на активи',
'asset_maintenance_report' => 'Справка за поддръжка на активи',
@@ -309,10 +309,12 @@ return [
'total_licenses' => 'общо лицензи',
'total_accessories' => 'Общ брой аксесоари',
'total_consumables' => 'Общ брой консумативи',
'total_cost' => 'Total Cost',
'type' => 'Тип',
'undeployable' => 'Не може да бъде предоставян',
'unknown_admin' => 'Непознат администратор',
'unknown_user' => 'Unknown User',
'unit_cost' => 'Unit Cost',
'username' => 'Потребител',
'update' => 'Обновяване',
'updating_item' => 'Обновяване :item',
@@ -353,9 +355,11 @@ return [
'audit_overdue' => 'Просрочен Одит',
'accept' => 'Приеми :asset',
'i_accept' => 'Съгласен съм',
'i_decline_item' => 'Decline this item',
'i_accept_item' => 'Accept this item',
'i_accept_with_count' => 'I accept :count item|I accept :count items',
'i_decline_item' => 'Decline this item|Decline these items',
'i_accept_item' => 'Accept this item|Accept these items',
'i_decline' => 'Отказ',
'i_decline_with_count' => 'I decline :count item|I decline :count items',
'accept_decline' => 'Премане/отказване',
'sign_tos' => 'Подпишете се за да се съгласите с условията за ползване:',
'clear_signature' => 'Изчисти подписа',
@@ -394,6 +398,7 @@ return [
'permissions' => 'Права за достъп',
'managed_ldap' => '(Управляван през LDAP)',
'export' => 'Експорт',
'export_all_to_csv' => 'Export all to CSV',
'ldap_sync' => 'LDAP синхронизация',
'ldap_user_sync' => 'LDAP синхронизация на потребител',
'synchronize' => 'Синхронизиране',
@@ -483,7 +488,9 @@ return [
'update_existing_values' => 'Обнови същестуващите стойности?',
'auto_incrementing_asset_tags_disabled_so_tags_required' => 'Автоматичното номериране на активите е забранено, така че всички редове трябва да имат попълнен номер на актив.',
'auto_incrementing_asset_tags_enabled_so_now_assets_will_be_created' => 'Бележка: Генериране на пореден номер на актив е включено, така че активите, които нямат номер ще бъдат зъздадени, докато тези, които имат номер ще бъдат обновени с предоставената информация.',
'send_welcome_email_to_users' => ' Send Welcome Email for new Users? Note that only users with a valid email address and who are marked as activated in your import file will received a welcome.',
'send_welcome_email_to_users' => ' Send welcome email to new users',
'send_welcome_email_help' => 'Only users with a valid email address and who are marked as activated will receive a welcome email where they can reset their password.',
'send_welcome_email_import_help' => 'Only new users with a valid email address and who are marked as activated in your import file will receive a welcome email where they can set their password.',
'send_email' => 'Изпращане на имейл',
'call' => 'Обаждане',
'back_before_importing' => 'Архивно копие преди импортиране?',
@@ -513,7 +520,10 @@ return [
'item_notes' => ':item бележки',
'item_name_var' => ':item Име',
'error_user_company' => 'Изписването към посочената фирма и асоциираната фирма към артикула не съвпадат',
'error_user_company_multiple' => 'One or more of the checkout target company and asset company do not match',
'error_user_company_accept_view' => 'Актива заведен на вас пренадлежи към друга фирма, затова не можете да го приемете или откажете. Свържете се с вашият администратор',
'error_assets_already_checked_out' => 'One or more of the assets are already checked out',
'assigned_assets_removed' => 'The following were removed from the selected assets because they are already checked out',
'importer' => [
'checked_out_to_fullname' => 'Изписан на: Full Name',
'checked_out_to_first_name' => 'Изписан на: First Name',
@@ -585,6 +595,8 @@ return [
'components' => ':count Компонент|:count Компоненти',
],
'show_inactive' => 'Expired or Terminated',
'show_expiring' => 'Expiring or Terminating Soon',
'more_info' => 'Повече информация',
'quickscan_bulk_help' => 'Поставянето на отметка в това квадратче ще редактира записа на актива, за да отрази това ново местоположение. Оставянето му без отметка просто ще отбележи местоположението в журнала за проверка. Обърнете внимание, че ако този актив бъде извлечен, той няма да промени местоположението на лицето, актива или местоположението, към които е извлечен.',
'whoops' => 'Упс!',
@@ -609,6 +621,8 @@ return [
'use_cloned_no_image_help' => 'This item does not have an associated image and instead inherits from the model or category it belongs to. If you would like to use a specific image for this item, you can upload a new one below.',
'footer_credit' => '<a target="_blank" href="https://snipeitapp.com" rel="noopener">Snipe-IT</a> is open source software, made with <i class="fa fa-heart" aria-hidden="true" style="color: #a94442; font-size: 10px" /></i><span class="sr-only">love</span> by <a href="https://bsky.app/profile/snipeitapp.com" rel="noopener">@snipeitapp.com</a>.',
'set_password' => 'Set a Password',
'upload_deleted' => 'Upload Deleted',
'child_locations' => 'Child Locations',
// Add form placeholders here
'placeholders' => [
@@ -625,11 +639,11 @@ return [
'site_default' => 'Настройки по подразбиране на сайта',
'default_blue' => 'По подразбиране Синьо',
'blue_dark' => 'Синьо (тъмен режим)',
'green' => 'Тъмно Зелено',
'green' => 'Green',
'green_dark' => 'Зелено (тъмен режим)',
'red' => 'Тъмно Червено',
'red' => 'Red',
'red_dark' => 'Червено (тъмен режим)',
'orange' => 'Тъмно Оранжево',
'orange' => 'Orange',
'orange_dark' => 'Оранжево (тъмен режим)',
'black' => 'Черно',
'black_dark' => 'Черно (тъмен режим)',
+13 -11
View File
@@ -3,9 +3,9 @@
return [
'Accessory_Checkin_Notification' => 'Аксесоарат е вписан',
'Accessory_Checkout_Notification' => 'Изписани Аксесоари',
'Asset_Checkin_Notification' => 'Asset checked in: [:tag]',
'Asset_Checkout_Notification' => 'Asset checked out: [:tag]',
'Accessory_Checkout_Notification' => 'Accessory checked out|:count Accessories checked out',
'Asset_Checkin_Notification' => 'Asset checked in: :tag',
'Asset_Checkout_Notification' => 'Asset checked out: :tag',
'Confirm_Accessory_Checkin' => 'Потвърждение при връщане на аксесоар',
'Confirm_Asset_Checkin' => 'Потвърждение при връщане на актив',
'Confirm_component_checkin' => 'Component checkin confirmation',
@@ -21,8 +21,8 @@ return [
'Expected_Checkin_Date' => 'Наближава срока за връщане на актив който е заведен на Вас, трябва да се върна на :date',
'Expected_Checkin_Notification' => 'Напомняне: :name крайната дата за вписване наближава',
'Expected_Checkin_Report' => 'Очакван рапорт за вписване на актив',
'Expiring_Assets_Report' => 'Доклад за изтичащи активи.',
'Expiring_Licenses_Report' => 'Доклад за изтичащи лицензи.',
'Expiring_Assets_Report' => 'Доклад за изтичащи активи',
'Expiring_Licenses_Report' => 'Доклад за изтичащи лицензи',
'Item_Request_Canceled' => 'Заявка за артикул отменена',
'Item_Requested' => 'Артикул заявен',
'License_Checkin_Notification' => 'Лиценза е вписан',
@@ -31,7 +31,7 @@ return [
'Low_Inventory_Report' => 'Доклад за нисък запас',
'a_user_canceled' => 'Потребител е отменил заявка за елемент в уебсайта',
'a_user_requested' => 'Потребител е направил заявка за елемент в уебсайта',
'acceptance_asset_accepted_to_user' => 'You have accepted an item assigned to you by :site_name',
'acceptance_asset_accepted_to_user' => 'You have accepted an item assigned to you by :site_name|You have accepted :qty items assigned to you by :site_name',
'acceptance_asset_accepted' => 'Потребителя прие актива',
'acceptance_asset_declined' => 'Потребителя отказа актива',
'send_pdf_copy' => 'Send a copy of this acceptance to my email address',
@@ -42,8 +42,9 @@ return [
'asset_name' => 'Име на актив',
'asset_requested' => 'Заявка за актив',
'asset_tag' => 'Инвентарен номер',
'assets_warrantee_alert' => 'Има :count актив(а) с гаранция, която ще изтече в следващите :threshold дни.|Има :count активa с гаранции, която ще изтече в следващите :threshold дни.',
'assets_warrantee_alert' => 'There is :count asset with an expiring warranty or that are reaching their end of life in the next :threshold days.|There are :count assets with expiring warranties or that are reaching their end of life in the next :threshold days.',
'assigned_to' => 'Възложени на',
'eol' => 'EOL',
'best_regards' => 'С най-добри пожелания.',
'canceled' => 'Отменено',
'checkin_date' => 'Дата на вписване',
@@ -58,6 +59,7 @@ return [
'days' => 'Дни',
'expecting_checkin_date' => 'Очаквана дата на вписване',
'expires' => 'Изтича',
'terminates' => 'Terminates',
'following_accepted' => 'The following was accepted',
'following_declined' => 'The following was declined',
'hello' => 'Здравейте',
@@ -68,16 +70,16 @@ return [
'inventory_report' => 'Списък активи',
'item' => 'Информация',
'item_checked_reminder' => 'This is a reminder that you currently have :count items checked out to you that you have not accepted or declined. Please click the link below to confirm your decision.',
'license_expiring_alert' => 'Има :count лиценз, който изтича в следващите :threshold дни.|Има :count лиценза, които изтичат в следващите :threshold дни.',
'license_expiring_alert' => 'There is :count license expiring or terminating in the next :threshold days.|There are :count licenses expiring or terminating in the next :threshold days.',
'link_to_update_password' => 'Моля щракенете върху следния линк за да обновите своята :web password:',
'login' => 'Логин',
'login_first_admin' => 'Влезте в своята Snipe-IT инсталация използвайки данните по-долу:',
'low_inventory_alert' => 'Има :count артикул, който е под минималния праг за наличност или скоро ще се изчерпа.| Има :count артикула, които са под минималния праг за наличност или скоро ще се изчерпат.',
'min_QTY' => 'Минимално количество',
'name' => 'Име',
'new_item_checked' => 'Нов артикул беше изписан под вашето име, детайлите са отдолу.',
'new_item_checked_with_acceptance' => 'A new item has been checked out under your name that requires acceptance, details are below.',
'new_item_checked_location' => 'A new item has been checked out to :location, details are below.',
'new_item_checked' => 'A new item has been checked out under your name, details are below.|:count new items have been checked out under your name, details are below.',
'new_item_checked_with_acceptance' => 'A new item has been checked out under your name that requires acceptance, details are below.|:count new items have been checked out under your name that requires acceptance, details are below.',
'new_item_checked_location' => 'A new item has been checked out to :location, details are below.|:count new items have been checked out to :location, details are below.',
'recent_item_checked' => 'An item was recently checked out under your name that requires acceptance, details are below.',
'notes' => 'Бележки',
'password' => 'Парола',
@@ -5,7 +5,7 @@ return [
'manage' => 'Manage',
'field' => 'Field',
'about_fieldsets_title' => 'About Fieldsets',
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used for specific asset model types.',
'custom_format' => 'Custom Regex format...',
'encrypt_field' => 'Encrypt the value of this field in the database',
'encrypt_field_help' => 'WARNING: Encrypting a field makes it unsearchable.',
@@ -2,7 +2,7 @@
return [
'about_asset_depreciations' => 'About Asset Depreciations',
'about_depreciations' => 'You can set up asset depreciations to depreciate assets based on straight-line depreciation.',
'about_depreciations' => 'You can set up asset depreciations to depreciate assets based on linear (straight-line), Half Year applied with condition, or Half Year always applied.',
'asset_depreciations' => 'Asset Depreciations',
'create' => 'Create Depreciation',
'depreciation_name' => 'Depreciation Name',
@@ -44,6 +44,8 @@ return [
'redirect_to_checked_out_to' => 'Go to Checked Out to',
'select_statustype' => 'Select Status Type',
'serial' => 'Serial',
'serial_required' => 'Asset :number requires a serial number',
'serial_required_post_model_update' => ':asset_model have been updated to require a serial number. Please add a serial number for this asset.',
'status' => 'Status',
'tag' => 'Etiqueta de Recurs',
'update' => 'Asset Update',
@@ -22,6 +22,8 @@ return [
'requested' => 'Requested',
'not_requestable' => 'Not Requestable',
'requestable_status_warning' => 'Do not change requestable status',
'require_serial' => 'Require Serial Number',
'require_serial_help' => 'A serial number will be required when creating a new asset of this model.',
'restore' => 'Restore Asset',
'pending' => 'Pending',
'undeployable' => 'Undeployable',
@@ -46,11 +46,12 @@ return array(
'not_enough_seats' => 'Not enough license seats available for checkout',
'mismatch' => 'The license seat provided does not match the license',
'unavailable' => 'This seat is not available for checkout.',
'license_is_inactive' => 'This license is expired or terminated.',
),
'checkin' => array(
'error' => 'There was an issue checking in the license. Please try again.',
'not_reassignable' => 'License not reassignable',
'not_reassignable' => 'Seat has been used',
'success' => 'The license was checked in successfully'
),
@@ -3,12 +3,13 @@
return array(
'does_not_exist' => 'Location does not exist.',
'assoc_users' => 'This location is not currently deletable because it is the location of record for at least one asset or user, has assets assigned to it, or is the parent location of another location. Please update your records to no longer reference this location and try again ',
'assoc_users' => 'This location is not currently deletable because it is the location of record for at least one item or user, has assets assigned to it, or is the parent location of another location. Please update your records to no longer reference this location and try again ',
'assoc_assets' => 'This location is currently associated with at least one asset and cannot be deleted. Please update your assets to no longer reference this location and try again. ',
'assoc_child_loc' => 'This location is currently the parent of at least one child location and cannot be deleted. Please update your locations to no longer reference this location and try again. ',
'assigned_assets' => 'Assigned Assets',
'current_location' => 'Current Location',
'open_map' => 'Open in :map_provider_icon Maps',
'deleted_warning' => 'This location has been deleted. Please restore it before attempting to make any changes.',
'create' => array(
@@ -12,7 +12,8 @@ return [
'create' => 'Create Location',
'update' => 'Update Location',
'print_assigned' => 'Print Assigned',
'print_all_assigned' => 'Print All Assigned',
'print_inventory' => 'Print Inventory',
'print_all_assigned' => 'Print Inventory and Assigned',
'name' => 'Location Name',
'address' => 'Adreça',
'address2' => 'Address Line 2',
+2 -3
View File
@@ -11,7 +11,6 @@ return array(
'title' => 'Models de Recurs',
'update' => 'Update Asset Model',
'view' => 'View Asset Model',
'update' => 'Update Asset Model',
'clone' => 'Clone Model',
'edit' => 'Edit Model',
'clone' => 'Clone Model',
'edit' => 'Edit Model',
);
@@ -24,7 +24,6 @@ return [
'auto_assign_label' => 'Include this user when auto-assigning eligible licenses',
'auto_assign_help' => 'Skip this user in auto assignment of licenses',
'software_user' => 'Software Checked out to :name',
'send_email_help' => 'You must provide an email address for this user to send them credentials. Emailing credentials can only be done on user creation. Passwords are stored in a one-way hash and cannot be retrieved once saved.',
'view_user' => 'View User :name',
'usercsv' => 'CSV file',
'two_factor_admin_optin_help' => 'Your current admin settings allow selective enforcement of two-factor authentication. ',

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