Integrations/develop into master (#7352)

* Fixes #6204 - added email alerts and web/API access to assets due for audits (#6992)

* Added upcoming audit report

TODO: Fid diff/threshold math

* Added route to list overdue / upcoming assets via API

* Controller/API methods for due/overdue audits

We could probably skip this and just handle it via view in the routes…

* Added query scopes for due and overdue audits

* Added audit due console command to kernel

* Added ability to pass audit specs to main API asset search method

* Added audit presenter

* Added bootstrap-tables presenter formatter to display an audit button

* Added gated sidenav items to left nav

* Added audit due/overdue blades

* Cleanup on audit due/overdue console command

* Added language strings for audit views

* Fixed :threshold placeholder

* Removed unused setting variable

* Fixed next audit date math

* Added scope for both overdue and upcoming

* Derp. Wrong version

* Bumped version

(I will release this version officially tomorrow)

* Leave the activated state for users alone in normal LDAP synchronisation. (#6988)

* Fixed #7003 - crash when warranty months or purchase date is null

* Fixed #6956 - viewKeys policy inconsistent  (#7009)

* Fixed #6956 - Added additional gates show showing/hiding license keys

* Modified gate to allow user to see licenses if they can create or edit the license as well

* Added API middleware to API routes to enable throttling

TODO: Figure out how to make this costumizable without touching the code

* Import locations from CSV via command line (#7021)

* Added import locations command

* Small fixes to location importer

* Added country, LDAP OU

* Cleaned up comments, added more clarification to what the script does

* Added ability to update groups via API

Fixes [ch9139]

* Bumped version

* Fixed #6883 - remove escaping of fields on LDAP import

* Fixed #6880 - correctly encrypt encrypted fields via the API

* Fixes #5054: LDAP users deactivated for none-ad (#7032)

When using none-AD ldap, users are automatically deactivated every LDAP
sync.  This commit changes the behaviour so that if the active flag isn't set,
the users are enabled.

Fixed #5054, at least for 4.X

* Updated packages

  - Updating erusev/parsedown (v1.7.2 => 1.7.3): Downloading (100%)
  - Updating squizlabs/php_codesniffer (3.4.1 => 3.4.2): Downloading (100%)
  - Updating symfony/polyfill-mbstring (v1.10.0 => v1.11.0): Downloading (100%)
  - Updating symfony/var-dumper (v3.4.23 => v3.4.27): Downloading (100%)
  - Updating league/flysystem (1.0.50 => 1.0.51): Downloading (100%)
  - Updating symfony/translation (v3.4.23 => v3.4.27): Downloading (100%)
  - Updating nesbot/carbon (1.36.2 => 1.37.1): Downloading (100%)
  - Updating symfony/debug (v3.4.23 => v3.4.27): Downloading (100%)
  - Updating symfony/console (v3.4.23 => v3.4.27): Downloading (100%)
  - Updating symfony/finder (v3.4.23 => v3.4.27): Downloading (100%)
  - Updating symfony/polyfill-ctype (v1.10.0 => v1.11.0): Downloading (100%)
  - Updating symfony/polyfill-php70 (v1.10.0 => v1.11.0): Downloading (100%)
  - Updating symfony/http-foundation (v3.4.23 => v3.4.27): Downloading (100%)
  - Updating symfony/event-dispatcher (v3.4.23 => v3.4.27): Downloading (100%)
  - Updating symfony/http-kernel (v3.4.23 => v3.4.27): Downloading (100%)
  - Updating symfony/process (v3.4.23 => v3.4.27): Downloading (100%)
  - Updating symfony/routing (v3.4.23 => v3.4.27): Downloading (100%)
  - Updating symfony/polyfill-util (v1.10.0 => v1.11.0): Downloading (100%)
  - Updating symfony/polyfill-php56 (v1.10.0 => v1.11.0): Downloading (100%)
  - Updating symfony/psr-http-message-bridge (v1.1.1 => v1.1.2): Downloading (failed)
Downloading (100%)
  - Updating rollbar/rollbar (v1.7.5 => v1.8.1): Downloading (100%)
  - Updating symfony/yaml (v3.4.23 => v3.4.27): Downloading (100%)
  - Updating symfony/browser-kit (v3.4.23 => v3.4.27): Downloading (100%)

* Fixed #7044 - API update deleted custom fields if they are not re-presented

* Fixed XSS vulnerability when creating a new categories, etc via modal on create

Same fix as before, because of the weird select2 post-parsing ajax behavior

* Updated email strings

* Fixed #7046 - added user website url back into UI

* Updated language strings

* Bumped version

* Updated packages

* New backups config for spatie

* Removed debugbar service provider (autodiscovery)

* Use laravel v5.5 withCount manual aliases

* Added spatie language files

* Removed old laravel backups config

This config file was renamed in a newer version of spatie laravel-backup

* Set the serialization

* Added the command loader to console kernel

* Renamed fire() to handle()

* Updated withCount to use manual naming

* Updated backup path in backup admin

* Updated travis with new php versions

* Bumped laravel version in readme

* Fixed custom field edit screen

* Fixed baseUrl is undefined error

I literally cannot figure out how this ever worked before.

* Fix for included files in backup

* Bumped version

* Switch has() to filled()

* Change ->has() to ->filled()

* Removed cosole log

* Bumped packages

* Use getReader instead of fetchAssoc for CSV parser

https://csv.thephpleague.com/9.0/upgrading/

* Handle JSON validation errors like 5.4

* Handle JSON validation errors like 5.4

* Handle JSON validation errors like 5.4

* Trying to fix ajax asset validation

This I think gets us closer, but still not handling the validation on the asset properly.

When I do a print_r of the validation in the other items, its looking for an error bag that looks something like this:

```
Illuminate\Support\MessageBag Object
(
    [messages:protected] => Array
        (
            [name] => Array
                (
                    [0] => The name field is required.
                )

            [seats] => Array
                (
                    [0] => The seats field is required.
                )

            [category_id] => Array
                (
                    [0] => The category id field is required.
                )

        )

    [format:protected] => :message
)
```

Currently the Assets ajax returns:

```
[2019-05-24 06:52:06] develop.ERROR: array (
  'messages' =>
  array (
    'model_id' =>
    array (
      0 => 'The model id field is required.',
    ),
    'status_id' =>
    array (
      0 => 'The status id field is required.',
    ),
    'asset_tag' =>
    array (
      0 => 'The asset tag field is required.',
    ),
  ),
)
```

So not sure why it’s not working.

* Fixed missing asset validation

* Check that a model exists before trying to fiddle with fieldsets

* Tidied up license check

* Removed extra escaping on checkin

* Updated importer to work with newer CSV Reader::getRecords() method

* Fixed field mapping

* Small fix for reordering fields

Fixes Illuminate\Database\QueryException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'order' cannot be null (SQL: insert into `custom_field_custom_fieldset` (`custom_field_id`, `custom_fieldset_id`, `order`, `required`) values (12, 7, , 0)) [ch1151]

This needs revisiting for a more solid fix, especially for data that was already entered bad.

* Fixed bug where sorting by company name in Users API did not work

Fixes [ch9200]

* Removed custom fields from AssignedSearch to prevent confusing data in selectlist

Fixes [ch9193]

* Removed alert-danger from tests

* Fixed missed consumables_count withCount() statement

* Fixed Undefined variable user in $backto if checked out to a non-user

Fixes [ch9194]

* Check for valid model before attempting to access fieldsets

Fixes [ch1249]

* Only build the log upload destination path if there is a matching record

Fixes [ch1232]

* Fixed free_seats_count variable name

(I forgot that Laravel switched camel case to snake case for their old 5.4 withCount variables)

* Only gtry to delete the file if a record is found in the log

* Only try to get fieldset if model is valid

* Fixed more camel-casing -> snake-casing

* Only display the file if the log record can be found

* Fixed casing in sync command

* Updated README

* Derp - typo

* Added link to Atlassian plugin

* More Atlassian clarifications

* Show accessory image on view page

* Increased image size to 800px, added lightboxes

* Fixed #7083 - Removed user_exists constraint on department save

If the user has been deleted, this prevented the department from being successfully saved on edit

* Updated branch in version file

* Dockerfile update to bring us up to php v7.1 for Laravel 5.5 (#7084)

* bump up to php7.1

& change deprecated MAINTAINER to a LABEL so it is visible with `docker inspect`

* AND modapache ><

* 2 updates required to get software-properties+ppa

* Bumped version

* Bumped release again :(

* Missed one

* Fixed #7098 - updated backup config for deleteFile() method

* Fixed #7092 -  handle weird port forwarding/port numbers for baseUrl

* Bumped version

* Fixed #7099 - set email to null by default for backup notifications

* Removed old comments

* Fixed #7100 - Check if $user isset on checkin

* Increased throttle to 120 requests per minute

* Added Filipino, corrected order for Spanish variations

* Update language strings

* Bumped hash

* Changed has to filled to fix bulk asset editing

* Bumped point version

* Small fixes for phpleague CSB reader v9

* Improved error checking in locations importer

* Fixed #7145 - rename groups table to permissions_group for mysql 8 reserved word compatibility

* Reduce minimum group name length to 2 (from 3)

eg: IT

* Back in time fix FOR #7145 for new installs on MySQL 8+

* Fixed permission insert

//TODO

Handle this via model

* Possible fix for reporting/admin migration back in time

* Fixed #7164 - change table name to permission_groups

* Fixed LDAP password blanking on save

* fixing previous commit's actual wiping of password (#7183)

replaced Input::fille('ldap_pword') with _filled_.   Should be good to go.  

https://github.com/snipe/snipe-it/issues/7179

https://github.com/snipe/snipe-it/issues/7169

* Bumped version

* Downgrading rollbar for Laravel 5.5

* Spelling Correction (#7206)

Fixed Spelling for the word reqrite, to be rewrite.

* Fix #6910: Add logic to manipulate the eloquent query. (#7006)

* Added company_id to consumables_users table

* Added logic to manage when a pivot table doesn't have the column company_id trough a join with users

* Remove a migration that tries to fix this problem, but is not longer necessary

* Addresses #7238 - add PWA code to layout

Needs additional UX testing

* Better log message for bad LDAP connection

* Fixed #7186 - has vs filled in User’s API blanking out groups if no group_ids are passed

* Comment clarification on #7186

* Check for valid seat on hardware view

* Added space between footer and custom message

* Cap warranty months to three characters

Filles rollbar 209

* Cap warranty months to 3 on the frontend blade

* Fixed countable() strings on user destroy

* Check that the user has assets and that the aset model is valid

* Bumped hash

* Caps asset warranty to 20 years

* Command to fix custom field unicode conversion differences between PHP versions (#7263)

* Fixes #7252 form request changes (#7272)

* Fixes for #7252 - custom fields not validating / no validaton messages in API w/form requests

* Removed debug info

* More fixes for #7252

This is mostly working as intended, if not yet the way Laravel wants us to do it.

Right now, the API returns correctly, and the form UI will return highlighted errors, with the input filled in ~sometimes~. I’m not sure why it’s only sometimes yet, but this is potentially progress.

* Removed experimental method

* Check for digits_between:0,240 for warranty

* Removed debug code

* Apply fix from PR #7273 to master

* Bumped hash

* Fixed #7250 - permission issue for API fieldsets and fields endpoints

This applies the change from #7294 to master

* Add @mskrip as a contributor

* Fixed #7270 - Checking-in Assets via API Removes the Item's Asset Name

* CORS for api (#7292)

* Added CORS support to API

* Changed order so CORS will still work if throttle hit

* Added APP_CORS_ALLOWED_ORIGINS env option

* Fixed typo

* Clarified header comments

* More clarification

* DIsable CORS allowed origins by default to replicate existing behavior

* Change variable name to be clearer

* Bumped version

* Added condition to deal with fieldname 'rtd_location' which can be tried to be queried in some places and doesn't exist in database (#7317)

* Added comments to the ByFilter query scope for clarity

* Added accessories checkout/checkin API endpoint

* Fixed CVE-2019-10742

https://nvd.nist.gov/vuln/detail/CVE-2019-10742

* Update README.md (#7334)

Add reference to CSV importer.

* Group related variables in .env

* History importer fixes

* Fixes to history importer
This commit is contained in:
snipe 2019-08-14 21:48:14 -07:00 committed by GitHub
parent 1608dba7dd
commit 441ae69f5c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
129 changed files with 1791 additions and 807 deletions

View file

@ -1839,6 +1839,15 @@
"contributions": [ "contributions": [
"code" "code"
] ]
},
{
"login": "mskrip",
"name": "Marián Skrip",
"avatar_url": "https://avatars0.githubusercontent.com/u/17459600?v=4",
"profile": "https://github.com/mskrip",
"contributions": [
"code"
]
} }
] ]
} }

View file

@ -43,6 +43,7 @@ MAIL_FROM_ADDR=you@example.com
MAIL_FROM_NAME='Snipe-IT' MAIL_FROM_NAME='Snipe-IT'
MAIL_REPLYTO_ADDR=you@example.com MAIL_REPLYTO_ADDR=you@example.com
MAIL_REPLYTO_NAME='Snipe-IT' MAIL_REPLYTO_NAME='Snipe-IT'
MAIL_BACKUP_NOTIFICATION_ADDRESS=you@example.com
MAIL_AUTO_EMBED=true MAIL_AUTO_EMBED=true
MAIL_AUTO_EMBED_METHOD=base64 MAIL_AUTO_EMBED_METHOD=base64
@ -66,8 +67,11 @@ SESSION_PATH=null
# -------------------------------------------- # --------------------------------------------
# OPTIONAL: SECURITY HEADER SETTINGS # OPTIONAL: SECURITY HEADER SETTINGS
# -------------------------------------------- # --------------------------------------------
APP_TRUSTED_PROXIES=192.168.1.1,10.0.0.1
ALLOW_IFRAMING=false
REFERRER_POLICY=same-origin REFERRER_POLICY=same-origin
ENABLE_CSP=false ENABLE_CSP=false
CORS_ALLOWED_ORIGINS=null
# -------------------------------------------- # --------------------------------------------
# OPTIONAL: CACHE SETTINGS # OPTIONAL: CACHE SETTINGS
@ -113,8 +117,6 @@ APP_LOG=single
APP_LOG_MAX_FILES=10 APP_LOG_MAX_FILES=10
APP_LOG_LEVEL=debug APP_LOG_LEVEL=debug
FILESYSTEM_DISK=local FILESYSTEM_DISK=local
APP_TRUSTED_PROXIES=192.168.1.1,10.0.0.1
ALLOW_IFRAMING=false
APP_CIPHER=AES-256-CBC APP_CIPHER=AES-256-CBC
GOOGLE_MAPS_API= GOOGLE_MAPS_API=
BACKUP_ENV=true BACKUP_ENV=true

View file

@ -1,14 +1,14 @@
[![Build Status](https://travis-ci.org/snipe/snipe-it.svg?branch=master)](https://travis-ci.org/snipe/snipe-it) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.svg)](https://crowdin.com/project/snipe-it) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/snipe/snipe-it?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeitapp.svg?style=social)](https://twitter.com/snipeitapp) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=snipe/snipe-it&amp;utm_campaign=Badge_Grade) [![Build Status](https://travis-ci.org/snipe/snipe-it.svg?branch=master)](https://travis-ci.org/snipe/snipe-it) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.svg)](https://crowdin.com/project/snipe-it) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/snipe/snipe-it?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeitapp.svg?style=social)](https://twitter.com/snipeitapp) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=snipe/snipe-it&amp;utm_campaign=Badge_Grade)
[![All Contributors](https://img.shields.io/badge/all_contributors-180-orange.svg?style=flat-square)](#contributors) [![Open Source Helpers](https://www.codetriage.com/snipe/snipe-it/badges/users.svg)](https://www.codetriage.com/snipe/snipe-it) [![All Contributors](https://img.shields.io/badge/all_contributors-182-orange.svg?style=flat-square)](#contributors) [![Open Source Helpers](https://www.codetriage.com/snipe/snipe-it/badges/users.svg)](https://www.codetriage.com/snipe/snipe-it)
## Snipe-IT - Open Source Asset Management System ## Snipe-IT - Open Source Asset Management System
This is a FOSS project for asset management in IT Operations. Knowing who has which laptop, when it was purchased in order to depreciate it correctly, handling software licenses, etc. This is a FOSS project for asset management in IT Operations. Knowing who has which laptop, when it was purchased in order to depreciate it correctly, handling software licenses, etc.
It is built on [Laravel 5.4](http://laravel.com). It is built on [Laravel 5.5](http://laravel.com).
Snipe-IT is actively developed and we're [releasing quite frequently](https://github.com/snipe/snipe-it/releases). ([Check out the live demo here](https://snipeitapp.com/demo/).) Snipe-IT is actively developed and we [release quite frequently](https://github.com/snipe/snipe-it/releases). ([Check out the live demo here](https://snipeitapp.com/demo/).)
__This is web-based software__. This means there is no executable file (aka no .exe files), and it must be run on a web server and accessed through a web browser. It runs on any Mac OSX, flavor of Linux, as well as Windows, and we have a [Docker image](https://snipe-it.readme.io/docs/docker) available if that's what you're into. __This is web-based software__. This means there is no executable file (aka no .exe files), and it must be run on a web server and accessed through a web browser. It runs on any Mac OSX, flavor of Linux, as well as Windows, and we have a [Docker image](https://snipe-it.readme.io/docs/docker) available if that's what you're into.
@ -58,8 +58,10 @@ Since the release of the JSON REST API, several third-party developers have been
- [SnipeSharp - .NET module in C#](https://github.com/barrycarey/SnipeSharp) by [@barrycarey](https://github.com/barrycarey) - [SnipeSharp - .NET module in C#](https://github.com/barrycarey/SnipeSharp) by [@barrycarey](https://github.com/barrycarey)
- [InQRy](https://github.com/Microsoft/InQRy) by [@Microsoft](https://github.com/Microsoft) - [InQRy](https://github.com/Microsoft/InQRy) by [@Microsoft](https://github.com/Microsoft)
- [SnipeitPS](https://github.com/snazy2000/SnipeitPS) by [@snazy2000](https://github.com/snazy2000) - Powershell API Wrapper for Snipe-it - [SnipeitPS](https://github.com/snazy2000/SnipeitPS) by [@snazy2000](https://github.com/snazy2000) - Powershell API Wrapper for Snipe-it
- [jamf2snipe](https://github.com/ParadoxGuitarist/jamf2snipe) by [@ParadoxGuitarist](https://github.com/ParadoxGuitarist) - Python script to sync assets between a JAMFPro instance and a Snipe-II instance - [jamf2snipe](https://github.com/ParadoxGuitarist/jamf2snipe) by [@ParadoxGuitarist](https://github.com/ParadoxGuitarist) - Python script to sync assets between a JAMFPro instance and a Snipe-IT instance
- [Marksman](https://github.com/Scope-IT/marksman) - A Windows agent for Snipe-IT - [Marksman](https://github.com/Scope-IT/marksman) - A Windows agent for Snipe-IT
- [Snipe-IT plugin for Jira Service Desk (beta)](https://marketplace.atlassian.com/apps/1220379/snipe-it-for-jira-service-desk-beta?hosting=cloud&tab=overview) - for the upcoming Snipe-IT v5 only
- [Python 3 CSV importer](https://github.com/gastamper/snipeit-csvimporter) - allows importing assets into Snipe-IT based on Item Name rather than Asset Tag.
As these were created by third-parties, Snipe-IT cannot provide support for these project, and you should contact the developers directly if you need assistance. Additionally, Snipe-IT makes no guarantees as to the reliability, accuracy or maintainability of these libraries. Use at your own risk. :) As these were created by third-parties, Snipe-IT cannot provide support for these project, and you should contact the developers directly if you need assistance. Additionally, Snipe-IT makes no guarantees as to the reliability, accuracy or maintainability of these libraries. Use at your own risk. :)

View file

@ -0,0 +1,160 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use League\Csv\Reader;
use App\Models\Location;
class ImportLocations extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'snipeit:import-locations {filename}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Import locations and their parents';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
if (!ini_get("auto_detect_line_endings")) {
ini_set("auto_detect_line_endings", '1');
}
$filename = $this->argument('filename');
$csv = Reader::createFromPath(storage_path('private_uploads/imports/').$filename, 'r');
$this->info('Attempting to process: '.storage_path('private_uploads/imports/').$filename);
$csv->setHeaderOffset(0); //because we don't want to insert the header
$results = $csv->getRecords();
// Import parent location names first if they don't exist
foreach ($results as $parent_index => $parent_row) {
if (array_key_exists('Parent Name', $parent_row)) {
$parent_name = trim($parent_row['Parent Name']);
if (array_key_exists('Name', $parent_row)) {
$this->info('- Parent: ' . $parent_name . ' in row as: ' . trim($parent_row['Parent Name']));
}
// Save parent location name
// This creates a sort of name-stub that we'll update later on in this script
$parent_location = Location::firstOrCreate(array('name' => $parent_name));
if (array_key_exists('Name', $parent_row)) {
$this->info('Parent for ' . $parent_row['Name'] . ' is ' . $parent_name . '. Attempting to save ' . $parent_name . '.');
}
// Check if the record was updated or created.
// This is mostly for clearer debugging.
if ($parent_location->exists) {
$this->info('- Parent location '.$parent_name.' already exists.');
} else {
$this->info('- Parent location '.$parent_name.' was created.');
}
} else {
$this->info('- No Parent Name provided, so no parent location will be created.');
}
}
$this->info('----- Parents Created.... backfilling additional details... --------');
// Loop through ALL records and add/update them if there are additional fields
// besides name
foreach ($results as $index => $row) {
if (array_key_exists('Parent Name', $row)) {
$parent_name = trim($row['Parent Name']);
}
// Set the location attributes to save
if (array_key_exists('Name', $row)) {
$location = Location::firstOrNew(array('name' => trim($row['Name'])));
$location->name = trim($row['Name']);
$this->info('Checking location: '.$location->name);
} else {
$this->error('Location name is required and is missing from at least one row in this dataset. Check your CSV for extra trailing rows and try again.');
return false;
}
if (array_key_exists('Currency', $row)) {
$location->currency = trim($row['Currency']);
}
if (array_key_exists('Address 1', $row)) {
$location->address = trim($row['Address 1']);
}
if (array_key_exists('Address 2', $row)) {
$location->address2 = trim($row['Address 2']);
}
if (array_key_exists('City', $row)) {
$location->city = trim($row['City']);
}
if (array_key_exists('State', $row)) {
$location->state = trim($row['State']);
}
if (array_key_exists('Zip', $row)) {
$location->zip = trim($row['Zip']);
}
if (array_key_exists('Country', $row)) {
$location->country = trim($row['Country']);
}
if (array_key_exists('Country', $row)) {
$location->ldap_ou = trim($row['OU']);
}
// If a parent name is provided, we created it earlier in the script,
// so let's grab that ID
if ($parent_name) {
$this->info('-- Searching for Parent Name: '.$parent_name);
$parent = Location::where('name', '=', $parent_name)->first();
$location->parent_id = $parent->id;
$this->info('Parent: '.$parent_name.' - ID: '.$parent->id);
}
// Make sure the more advanced (non-name) fields pass validation
if (($location->isValid()) && ($location->save())) {
// Check if the record was updated or created.
// This is mostly for clearer debugging.
if ($location->exists) {
$this->info('Location ' . $location->name . ' already exists. Updating...');
} else {
$this->info('- Location '.$location->name.' was created. ');
}
// If there's a validation error, display that
} else {
$this->error('- Non-parent Location '.$location->name.' could not be created: '.$location->getErrors() );
}
}
}
}

View file

@ -30,7 +30,7 @@ class Purge extends Command
* *
* @var string * @var string
*/ */
protected $description = 'Purge all soft-deleted deleted records in the database. This will rewrite history for items that have been edited, or checked in or out. It will also reqrite history for users associated with deleted items.'; protected $description = 'Purge all soft-deleted deleted records in the database. This will rewrite history for items that have been edited, or checked in or out. It will also rewrite history for users associated with deleted items.';
/** /**
* Create a new command instance. * Create a new command instance.

View file

@ -0,0 +1,126 @@
<?php
namespace App\Console\Commands;
use App\Models\CustomField;
use Illuminate\Console\Command;
class ReEncodeCustomFieldNames extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'snipeit:regenerate-fieldnames';
/**
* The console command description.
*
* @var string
*/
protected $description = 'This utility will regenerate the column names for custom fields. It should typically only be needed when a PHP upgrade changed the behavior of the unicode conversion between versions.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* All three of these things must match for the custom fields system to work as expected:
*
* - what the system thinks the output of $field->convertUnicodeDbSlug() is
* - the actual db_column name in the customfields table
* - the physical column name that was created on the assets table
*
* For some people who upgraded their version of PHP, the unicode converter now behaves
* differently in than it did when their custom fields were first created, specifically as it
* relates to handling slashes, ampersands, etc. This can result in the field names no longer
* matching up, as an older version of the PHP extension simply dropped slashes, etc, while the
* newer version of the PHP extension will convert them to underscores.
*
* @return mixed
*/
public function handle()
{
if ($this->confirm('This will regenerate all of the custom field database fieldnames in your database. THIS WILL CHANGE YOUR SCHEMA AND SHOULD NOT BE DONE WITHOUT MAKING A BACKUP FIRST. Do you wish to continue?'))
{
/** Get all of the custom fields */
$fields = CustomField::get();
$asset_columns = \DB::getSchemaBuilder()->getColumnListing('assets');
$custom_field_columns = array();
/** Loop through the columns on the assets table */
foreach ($asset_columns as $asset_column) {
/** Add ones that start with _snipeit_ to an array for handling */
if (strpos($asset_column, '_snipeit_') === 0) {
/**
* Get the ID of the custom field based on the fieldname.
* For example, in _snipeit_mac_address_1, we grab the 1 because we know
* that's the ID of the custom field that created the column.
* Then use that ID as the array key for use comparing the actual assets field name
* and the db_column value from the custom fields table.
*/
$last_part = substr(strrchr($asset_column, "_snipeit_"), 1);
$custom_field_columns[$last_part] = $asset_column;
}
}
foreach ($fields as $field) {
$this->info($field->name .' ('.$field->id.') column should be '. $field->convertUnicodeDbSlug().'');
/** The assets table has the column it should have, all is well */
if (\Schema::hasColumn('assets', $field->convertUnicodeDbSlug()))
{
$this->info('-- ✓ This field exists - all good');
/**
* There is a mismatch between the fieldname on the assets table and
* what $field->convertUnicodeDbSlug() is *now* expecting.
*/
} else {
$this->warn('-- X Field mismatch: updating... ');
/** Make sure the custom_field_columns array has the ID */
if (array_key_exists($field->id, $custom_field_columns)) {
/**
* Update the asset schema to the corrected fieldname that will be recognized by the
* system elsewhere that we use $field->convertUnicodeDbSlug()
*/
\Schema::table('assets', function($table) use ($custom_field_columns, $field) {
$table->renameColumn($custom_field_columns[$field->id], $field->convertUnicodeDbSlug());
});
$this->warn('-- ✓ Field updated from '.$custom_field_columns[$field->id].' to '.$field->convertUnicodeDbSlug());
} else {
$this->warn('-- X WARNING: There is no field on the assets table ending in '.$field->id.'. This may require more in-depth investigation and may mean the schema was altered manually.');
}
}
/** Update the db_column property in the custom fields table, just in case it doesn't match the other
* things.
*/
$field->db_column = $field->convertUnicodeDbSlug();
$field->save();
}
}
}
}

View file

@ -62,7 +62,7 @@ class SyncAssetLocations extends Command
$output['info'][] = 'There are '.$assigned_user_assets->count().' assets checked out to users.'; $output['info'][] = 'There are '.$assigned_user_assets->count().' assets checked out to users.';
foreach ($assigned_user_assets as $assigned_user_asset) { foreach ($assigned_user_assets as $assigned_user_asset) {
if (($assigned_user_asset->assignedTo) && ($assigned_user_asset->assignedTo->userLoc)) { if (($assigned_user_asset->assignedTo) && ($assigned_user_asset->assignedTo->userLoc)) {
$new_location=$assigned_user_asset->assignedTo->userloc->id; $new_location = $assigned_user_asset->assignedTo->userLoc->id;
$output['info'][] ='Setting User Asset ' . $assigned_user_asset->id . ' ('.$assigned_user_asset->asset_tag.') to ' . $assigned_user_asset->assignedTo->userLoc->name . ' which is id: ' . $new_location; $output['info'][] ='Setting User Asset ' . $assigned_user_asset->id . ' ('.$assigned_user_asset->asset_tag.') to ' . $assigned_user_asset->assignedTo->userLoc->name . ' which is id: ' . $new_location;
} else { } else {
$output['warn'][] ='Asset ' . $assigned_user_asset->id . ' ('.$assigned_user_asset->asset_tag.') still has no location! '; $output['warn'][] ='Asset ' . $assigned_user_asset->id . ' ('.$assigned_user_asset->asset_tag.') still has no location! ';

View file

@ -2,7 +2,6 @@
namespace App\Console; namespace App\Console;
use App\Console\Commands\RestoreDeletedUsers;
use Illuminate\Console\Scheduling\Schedule; use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel; use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
@ -35,6 +34,8 @@ class Kernel extends ConsoleKernel
Commands\SendCurrentInventoryToUsers::class, Commands\SendCurrentInventoryToUsers::class,
Commands\MoveUploadsToNewDisk::class, Commands\MoveUploadsToNewDisk::class,
Commands\SendUpcomingAuditReport::class, Commands\SendUpcomingAuditReport::class,
Commands\ImportLocations::class,
Commands\ReEncodeCustomFieldNames::class,
]; ];
/** /**
@ -60,5 +61,6 @@ class Kernel extends ConsoleKernel
protected function commands() protected function commands()
{ {
require base_path('routes/console.php'); require base_path('routes/console.php');
$this->load(__DIR__.'/Commands');
} }
} }

View file

@ -22,6 +22,7 @@ class Handler extends ExceptionHandler
\Illuminate\Database\Eloquent\ModelNotFoundException::class, \Illuminate\Database\Eloquent\ModelNotFoundException::class,
\Illuminate\Session\TokenMismatchException::class, \Illuminate\Session\TokenMismatchException::class,
\Illuminate\Validation\ValidationException::class, \Illuminate\Validation\ValidationException::class,
\Intervention\Image\Exception\NotSupportedException::class,
]; ];
/** /**
@ -65,10 +66,6 @@ class Handler extends ExceptionHandler
return response()->json(Helper::formatStandardApiResponse('error', null, $className . ' not found'), 200); return response()->json(Helper::formatStandardApiResponse('error', null, $className . ' not found'), 200);
} }
if ($e instanceof \Illuminate\Validation\ValidationException) {
return response()->json(Helper::formatStandardApiResponse('error', null, $e->response['messages'], 400));
}
if ($this->isHttpException($e)) { if ($this->isHttpException($e)) {
$statusCode = $e->getStatusCode(); $statusCode = $e->getStatusCode();
@ -83,11 +80,6 @@ class Handler extends ExceptionHandler
} }
} }
// Try to parse 500 Errors in a bit nicer way when debug is enabled.
if (config('app.debug')) {
return response()->json(Helper::formatStandardApiResponse('error', null, "An Error has occured! " . $e->getMessage()), 500);
}
} }
@ -116,4 +108,16 @@ class Handler extends ExceptionHandler
return redirect()->guest('login'); return redirect()->guest('login');
} }
/**
* Convert a validation exception into a JSON response.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Validation\ValidationException $exception
* @return \Illuminate\Http\JsonResponse
*/
protected function invalidJson($request, ValidationException $exception)
{
return response()->json(Helper::formatStandardApiResponse('error', null, $exception->errors(), 400));
}
} }

View file

@ -8,6 +8,10 @@ use App\Http\Transformers\AccessoriesTransformer;
use App\Http\Transformers\SelectlistTransformer; use App\Http\Transformers\SelectlistTransformer;
use App\Models\Accessory; use App\Models\Accessory;
use App\Models\Company; use App\Models\Company;
use App\Models\User;
use Carbon\Carbon;
use Auth;
use DB;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class AccessoriesController extends Controller class AccessoriesController extends Controller
@ -210,7 +214,96 @@ class AccessoriesController extends Controller
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/accessories/message.delete.success'))); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/accessories/message.delete.success')));
} }
/**
* Save the Accessory checkout information.
*
* If Slack is enabled and/or asset acceptance is enabled, it will also
* trigger a Slack message and send an email.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $accessoryId
* @return Redirect
*/
public function checkout(Request $request, $accessoryId)
{
// Check if the accessory exists
if (is_null($accessory = Accessory::find($accessoryId))) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/accessories/message.does_not_exist')));
}
$this->authorize('checkout', $accessory);
if ($accessory->numRemaining() > 0) {
if (!$user = User::find($request->input('assigned_to'))) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/accessories/message.checkout.user_does_not_exist')));
}
// Update the accessory data
$accessory->assigned_to = $request->input('assigned_to');
$accessory->users()->attach($accessory->id, [
'accessory_id' => $accessory->id,
'created_at' => Carbon::now(),
'user_id' => Auth::id(),
'assigned_to' => $request->get('assigned_to')
]);
$accessory->logCheckout($request->input('note'), $user);
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/accessories/message.checkout.success')));
}
return response()->json(Helper::formatStandardApiResponse('error', null, 'No accessories remaining'));
}
/**
* Check in the item so that it can be checked out again to someone else
*
* @uses Accessory::checkin_email() to determine if an email can and should be sent
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param Request $request
* @param integer $accessoryUserId
* @param string $backto
* @return Redirect
* @internal param int $accessoryId
*/
public function checkin(Request $request, $accessoryUserId = null)
{
if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/accessories/message.does_not_exist')));
}
$accessory = Accessory::find($accessory_user->accessory_id);
$this->authorize('checkin', $accessory);
$logaction = $accessory->logCheckin(User::find($accessoryUserId), $request->input('note'));
// Was the accessory updated?
if (DB::table('accessories_users')->where('id', '=', $accessory_user->id)->delete()) {
if (!is_null($accessory_user->assigned_to)) {
$user = User::find($accessory_user->assigned_to);
}
$data['log_id'] = $logaction->id;
$data['first_name'] = $user->first_name;
$data['last_name'] = $user->last_name;
$data['item_name'] = $accessory->name;
$data['checkin_date'] = $logaction->created_at;
$data['item_tag'] = '';
$data['note'] = $logaction->note;
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/accessories/message.checkin.success')));
}
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/accessories/message.checkin.error')));
}
/** /**
* Gets a paginated collection for the select2 menus * Gets a paginated collection for the select2 menus
* *
@ -234,4 +327,7 @@ class AccessoriesController extends Controller
return (new SelectlistTransformer)->transformSelectlist($accessories); return (new SelectlistTransformer)->transformSelectlist($accessories);
} }
} }

View file

@ -464,7 +464,13 @@ class AssetsController extends Controller
$model = AssetModel::find($request->get('model_id')); $model = AssetModel::find($request->get('model_id'));
if (($model) && ($model->fieldset)) { if (($model) && ($model->fieldset)) {
foreach ($model->fieldset->fields as $field) { foreach ($model->fieldset->fields as $field) {
$asset->{$field->convertUnicodeDbSlug()} = e($request->input($field->convertUnicodeDbSlug(), null)); if ($field->field_encrypted=='1') {
if (Gate::allows('admin')) {
$asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt($request->input($field->convertUnicodeDbSlug()));
}
} else {
$asset->{$field->convertUnicodeDbSlug()} = $request->input($field->convertUnicodeDbSlug());
}
} }
} }
@ -514,7 +520,7 @@ class AssetsController extends Controller
($request->filled('company_id')) ? ($request->filled('company_id')) ?
$asset->company_id = Company::getIdForCurrentUser($request->get('company_id')) : ''; $asset->company_id = Company::getIdForCurrentUser($request->get('company_id')) : '';
if ($request->has('image_source')) { if ($request->filled('image_source')) {
if ($request->input('image_source') == "") { if ($request->input('image_source') == "") {
$asset->image = null; $asset->image = null;
} else { } else {
@ -537,8 +543,14 @@ class AssetsController extends Controller
// Update custom fields // Update custom fields
if (($model = AssetModel::find($asset->model_id)) && (isset($model->fieldset))) { if (($model = AssetModel::find($asset->model_id)) && (isset($model->fieldset))) {
foreach ($model->fieldset->fields as $field) { foreach ($model->fieldset->fields as $field) {
if ($request->filled($field->convertUnicodeDbSlug())) { if ($request->has($field->convertUnicodeDbSlug())) {
$asset->{$field->convertUnicodeDbSlug()} = e($request->input($field->convertUnicodeDbSlug())); if ($field->field_encrypted=='1') {
if (Gate::allows('admin')) {
$asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt($request->input($field->convertUnicodeDbSlug()));
}
} else {
$asset->{$field->convertUnicodeDbSlug()} = $request->input($field->convertUnicodeDbSlug());
}
} }
} }
} }
@ -706,7 +718,11 @@ class AssetsController extends Controller
$asset->assigned_to = null; $asset->assigned_to = null;
$asset->assignedTo()->disassociate($asset); $asset->assignedTo()->disassociate($asset);
$asset->accepted = null; $asset->accepted = null;
$asset->name = Input::get('name');
if ($request->filled('name')) {
$asset->name = $request->input('name');
}
$asset->location_id = $asset->rtd_location_id; $asset->location_id = $asset->rtd_location_id;
if ($request->filled('location_id')) { if ($request->filled('location_id')) {

View file

@ -166,7 +166,7 @@ class ConsumablesController extends Controller
{ {
$consumable = Consumable::with(array('consumableAssignments'=> $consumable = Consumable::with(array('consumableAssignments'=>
function ($query) { function ($query) {
$query->orderBy('created_at', 'DESC'); $query->orderBy($query->getModel()->getTable().'.created_at', 'DESC');
}, },
'consumableAssignments.admin'=> function ($query) { 'consumableAssignments.admin'=> function ($query) {
}, },

View file

@ -124,9 +124,9 @@ class LocationsController extends Controller
'locations.image', 'locations.image',
'locations.currency' 'locations.currency'
]) ])
->withCount('assignedAssets') ->withCount('assignedAssets as assigned_assets_count')
->withCount('assets') ->withCount('assets as assets_count')
->withCount('users')->findOrFail($id); ->withCount('users as users_count')->findOrFail($id);
return (new LocationsTransformer)->transformLocation($location); return (new LocationsTransformer)->transformLocation($location);
} }

View file

@ -83,7 +83,7 @@ class ManufacturersController extends Controller
public function show($id) public function show($id)
{ {
$this->authorize('view', Manufacturer::class); $this->authorize('view', Manufacturer::class);
$manufacturer = Manufacturer::withCount('assets as assets_count', 'licenses as licenses_count', 'consumables as consumables_count', 'accessories as accessories_count', 'models as models_count' )->findOrFail($id); $manufacturer = Manufacturer::withCount('assets as assets_count')->withCount('licenses as licenses_count')->withCount('consumables as consumables_count')->withCount('accessories as accessories_count')->findOrFail($id);
return (new ManufacturersTransformer)->transformManufacturer($manufacturer); return (new ManufacturersTransformer)->transformManufacturer($manufacturer);
} }

View file

@ -25,7 +25,7 @@ class SuppliersController extends Controller
$allowed_columns = ['id','name','address','phone','contact','fax','email','image','assets_count','licenses_count', 'accessories_count','url']; $allowed_columns = ['id','name','address','phone','contact','fax','email','image','assets_count','licenses_count', 'accessories_count','url'];
$suppliers = Supplier::select( $suppliers = Supplier::select(
array('id','name','address','address2','city','state','country','fax', 'phone','email','contact','created_at','updated_at','deleted_at','image','notes', 'url') array('id','name','address','address2','city','state','country','fax', 'phone','email','contact','created_at','updated_at','deleted_at','image','notes')
)->withCount('assets as assets_count')->withCount('licenses as licenses_count')->withCount('accessories as accessories_count'); )->withCount('assets as assets_count')->withCount('licenses as licenses_count')->withCount('accessories as accessories_count');

View file

@ -60,12 +60,12 @@ class UsersController extends Controller
'users.zip', 'users.zip',
])->with('manager', 'groups', 'userloc', 'company', 'department','assets','licenses','accessories','consumables') ])->with('manager', 'groups', 'userloc', 'company', 'department','assets','licenses','accessories','consumables')
->withCount('assets as assets_count','licenses as licneses_count','accessories as accessories_count','consumables as consumables_count'); ->withCount('assets as assets_count','licenses as licenses_count','accessories as accessories_count','consumables as consumables_count');
$users = Company::scopeCompanyables($users); $users = Company::scopeCompanyables($users);
if (($request->filled('deleted')) && ($request->input('deleted')=='true')) { if (($request->filled('deleted')) && ($request->input('deleted')=='true')) {
$users = $users->onlyTrashed(); $users = $users->GetDeleted();
} }
if ($request->filled('company_id')) { if ($request->filled('company_id')) {
@ -102,6 +102,9 @@ class UsersController extends Controller
case 'department': case 'department':
$users = $users->OrderDepartment($order); $users = $users->OrderDepartment($order);
break; break;
case 'company':
$users = $users->OrderCompany($order);
break;
default: default:
$allowed_columns = $allowed_columns =
[ [
@ -204,7 +207,7 @@ class UsersController extends Controller
if ($user->save()) { if ($user->save()) {
if ($request->has('groups')) { if ($request->filled('groups')) {
$user->groups()->sync($request->input('groups')); $user->groups()->sync($request->input('groups'));
} else { } else {
$user->groups()->sync(array()); $user->groups()->sync(array());
@ -269,9 +272,22 @@ class UsersController extends Controller
->where('assigned_to', $user->id)->update(['location_id' => $request->input('location_id', null)]); ->where('assigned_to', $user->id)->update(['location_id' => $request->input('location_id', null)]);
if ($user->save()) { if ($user->save()) {
// Sync group memberships:
// This was changed in Snipe-IT v4.6.x to 4.7, since we upgraded to Laravel 5.5
// which changes the behavior of has vs filled.
// The $request->has method will now return true even if the input value is an empty string or null.
// A new $request->filled method has was added that provides the previous behavior of the has method.
// Check if the request has groups passed and has a value
if ($request->filled('groups')) { if ($request->filled('groups')) {
$user->groups()->sync($request->input('groups')); $user->groups()->sync($request->input('groups'));
// The groups field has been passed but it is null, so we should blank it out
} elseif ($request->has('groups')) {
$user->groups()->sync(array());
} }
return response()->json(Helper::formatStandardApiResponse('success', (new UsersTransformer)->transformUser($user), trans('admin/users/message.success.update'))); return response()->json(Helper::formatStandardApiResponse('success', (new UsersTransformer)->transformUser($user), trans('admin/users/message.success.update')));
} }
@ -293,20 +309,32 @@ class UsersController extends Controller
$this->authorize('delete', $user); $this->authorize('delete', $user);
if ($user->assets()->count() > 0) { if (($user->assets) && ($user->assets->count() > 0)) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete_has_assets'))); return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete_has_assets')));
} }
// Remove the user's avatar if they have one if (($user->licenses) && ($user->licenses->count() > 0)) {
if (Storage::disk('public')->exists('avatars/'.$user->avatar)) { return response()->json(Helper::formatStandardApiResponse('error', null, 'This user still has ' . $user->licenses->count() . ' license(s) associated with them and cannot be deleted.'));
try { }
Storage::disk('public')->delete('avatars/'.$user->avatar);
} catch (\Exception $e) { if (($user->accessories) && ($user->accessories->count() > 0)) {
\Log::debug($e); return response()->json(Helper::formatStandardApiResponse('error', null, 'This user still has ' . $user->accessories->count() . ' accessories associated with them.'));
} }
if (($user->managedLocations()) && ($user->managedLocations()->count() > 0)) {
return response()->json(Helper::formatStandardApiResponse('error', null, 'This user still has ' . $user->managedLocations()->count() . ' locations that they manage.'));
} }
if ($user->delete()) { if ($user->delete()) {
// Remove the user's avatar if they have one
if (Storage::disk('public')->exists('avatars/'.$user->avatar)) {
try {
Storage::disk('public')->delete('avatars/'.$user->avatar);
} catch (\Exception $e) {
\Log::debug($e);
}
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/users/message.success.delete'))); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/users/message.success.delete')));
} }
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete'))); return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete')));

View file

@ -292,6 +292,145 @@ class AssetModelsController extends Controller
} }
/**
* Returns a view that allows the user to bulk edit model attrbutes
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.7]
* @return \Illuminate\Contracts\View\View
*/
public function postBulkEdit(Request $request)
{
$models_raw_array = Input::get('ids');
// Make sure some IDs have been selected
if ((is_array($models_raw_array)) && (count($models_raw_array) > 0)) {
$models = AssetModel::whereIn('id', $models_raw_array)->withCount('assets as assets_count')->orderBy('assets_count', 'ASC')->get();
// If deleting....
if ($request->input('bulk_actions')=='delete') {
$valid_count = 0;
foreach ($models as $model) {
if ($model->assets_count == 0) {
$valid_count++;
}
}
return view('models/bulk-delete', compact('models'))->with('valid_count', $valid_count);
// Otherwise display the bulk edit screen
} else {
$nochange = ['NC' => 'No Change'];
$fieldset_list = $nochange + Helper::customFieldsetList();
$depreciation_list = $nochange + Helper::depreciationList();
return view('models/bulk-edit', compact('models'))
->with('fieldset_list', $fieldset_list)
->with('depreciation_list', $depreciation_list);
}
}
return redirect()->route('models.index')
->with('error', 'You must select at least one model to edit.');
}
/**
* Returns a view that allows the user to bulk edit model attrbutes
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.7]
* @return \Illuminate\Contracts\View\View
*/
public function postBulkEditSave(Request $request)
{
$models_raw_array = Input::get('ids');
$update_array = array();
if (($request->filled('manufacturer_id') && ($request->input('manufacturer_id')!='NC'))) {
$update_array['manufacturer_id'] = $request->input('manufacturer_id');
}
if (($request->filled('category_id') && ($request->input('category_id')!='NC'))) {
$update_array['category_id'] = $request->input('category_id');
}
if ($request->input('fieldset_id')!='NC') {
$update_array['fieldset_id'] = $request->input('fieldset_id');
}
if ($request->input('depreciation_id')!='NC') {
$update_array['depreciation_id'] = $request->input('depreciation_id');
}
if (count($update_array) > 0) {
AssetModel::whereIn('id', $models_raw_array)->update($update_array);
return redirect()->route('models.index')
->with('success', trans('admin/models/message.bulkedit.success'));
}
return redirect()->route('models.index')
->with('warning', trans('admin/models/message.bulkedit.error'));
}
/**
* Validate and delete the given Asset Models. An Asset Model
* cannot be deleted if there are associated assets.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @param int $modelId
* @return Redirect
*/
public function postBulkDelete(Request $request)
{
$models_raw_array = Input::get('ids');
if ((is_array($models_raw_array)) && (count($models_raw_array) > 0)) {
$models = AssetModel::whereIn('id', $models_raw_array)->withCount('assets as assets_count')->get();
$del_error_count = 0;
$del_count = 0;
foreach ($models as $model) {
\Log::debug($model->id);
if ($model->assets_count > 0) {
$del_error_count++;
} else {
$model->delete();
$del_count++;
}
}
\Log::debug($del_count);
\Log::debug($del_error_count);
if ($del_error_count == 0) {
return redirect()->route('models.index')
->with('success', trans('admin/models/message.bulkdelete.success',['success_count'=> $del_count] ));
}
return redirect()->route('models.index')
->with('warning', trans('admin/models/message.bulkdelete.success_partial', ['fail_count'=>$del_error_count, 'success_count'=> $del_count]));
}
return redirect()->route('models.index')
->with('error', trans('admin/models/message.bulkdelete.error'));
}
/** /**
* Returns true if a fieldset is set, 'add default values' is ticked and if * Returns true if a fieldset is set, 'add default values' is ticked and if
* any default values were entered into the form. * any default values were entered into the form.

View file

@ -70,7 +70,7 @@ class AssetCheckinController extends Controller
$asset->assignedTo()->disassociate($asset); $asset->assignedTo()->disassociate($asset);
$asset->assigned_type = null; $asset->assigned_type = null;
$asset->accepted = null; $asset->accepted = null;
$asset->name = e($request->get('name')); $asset->name = $request->get('name');
if ($request->filled('status_id')) { if ($request->filled('status_id')) {
$asset->status_id = e($request->get('status_id')); $asset->status_id = e($request->get('status_id'));
@ -92,7 +92,7 @@ class AssetCheckinController extends Controller
event(new CheckoutableCheckedIn($asset, $target, Auth::user(), $request->input('note'), $checkin_at)); event(new CheckoutableCheckedIn($asset, $target, Auth::user(), $request->input('note'), $checkin_at));
if ($backto=='user') { if ((isset($user)) && ($backto =='user')) {
return redirect()->route("users.show", $user->id)->with('success', trans('admin/hardware/message.checkin.success')); return redirect()->route("users.show", $user->id)->with('success', trans('admin/hardware/message.checkin.success'));
} }
return redirect()->route("hardware.index")->with('success', trans('admin/hardware/message.checkin.success')); return redirect()->route("hardware.index")->with('success', trans('admin/hardware/message.checkin.success'));

View file

@ -27,7 +27,6 @@ class AssetCheckoutController extends Controller
{ {
// Check if the asset exists // Check if the asset exists
if (is_null($asset = Asset::find(e($assetId)))) { if (is_null($asset = Asset::find(e($assetId)))) {
// Redirect to the asset management page with error
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
} }
@ -38,7 +37,6 @@ class AssetCheckoutController extends Controller
} }
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkout.not_available')); return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkout.not_available'));
// Get the dropdown of users and then pass it to the checkout view
} }

View file

@ -144,11 +144,9 @@ class AssetsController extends Controller
$asset->location_id = $request->input('rtd_location_id', null); $asset->location_id = $request->input('rtd_location_id', null);
} }
$asset->asset_tag = $asset_tags[$a]; // Create the image (if one was chosen.)
if ($request->has('image')) {
// Create the image (if one was chosen.) $image = $request->input('image');
if ($request->hasFile('image')) {
$image = $request->input('image');
$asset = $request->handleImages($asset); $asset = $request->handleImages($asset);
} }
@ -157,17 +155,17 @@ class AssetsController extends Controller
// Validation for these fields is handled through the AssetRequest form request // Validation for these fields is handled through the AssetRequest form request
$model = AssetModel::find($request->get('model_id')); $model = AssetModel::find($request->get('model_id'));
if (($model) && ($model->fieldset)) { if ($model->fieldset) {
foreach ($model->fieldset->fields as $field) { foreach ($model->fieldset->fields as $field) {
if ($field->field_encrypted=='1') { if ($field->field_encrypted=='1') {
if (Gate::allows('admin')) { if (Gate::allows('admin')) {
$asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt($request->input($field->convertUnicodeDbSlug())); $asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt($request->input($field->convertUnicodeDbSlug()));
}
} else {
$asset->{$field->convertUnicodeDbSlug()} = $request->input($field->convertUnicodeDbSlug());
} }
} else {
$asset->{$field->convertUnicodeDbSlug()} = $request->input($field->convertUnicodeDbSlug());
} }
} }
}
// Validate the asset before saving // Validate the asset before saving
if ($asset->isValid() && $asset->save()) { if ($asset->isValid() && $asset->save()) {
@ -333,7 +331,7 @@ class AssetsController extends Controller
// FIXME: No idea why this is returning a Builder error on db_column_name. // FIXME: No idea why this is returning a Builder error on db_column_name.
// Need to investigate and fix. Using static method for now. // Need to investigate and fix. Using static method for now.
$model = AssetModel::find($request->get('model_id')); $model = AssetModel::find($request->get('model_id'));
if ($model->fieldset) { if (($model) && ($model->fieldset)) {
foreach ($model->fieldset->fields as $field) { foreach ($model->fieldset->fields as $field) {
if ($field->field_encrypted=='1') { if ($field->field_encrypted=='1') {
if (Gate::allows('admin')) { if (Gate::allows('admin')) {
@ -530,6 +528,11 @@ class AssetsController extends Controller
*/ */
public function postImportHistory(Request $request) public function postImportHistory(Request $request)
{ {
if (!$request->hasFile('user_import_csv')) {
return back()->with('error', 'No file provided. Please select a file for import and try again. ');
}
if (!ini_get("auto_detect_line_endings")) { if (!ini_get("auto_detect_line_endings")) {
ini_set("auto_detect_line_endings", '1'); ini_set("auto_detect_line_endings", '1');
} }
@ -558,49 +561,105 @@ class AssetsController extends Controller
foreach ($results as $record) { foreach ($results as $record) {
$asset_tag = $record['Asset Tag']; foreach ($results as $row) {
if (is_array($row)) {
try { $row = array_change_key_case($row, CASE_LOWER);
$checkoutdate = Carbon::parse($record['Checkout Date'])->format('Y-m-d H:i:s'); $asset_tag = Helper::array_smart_fetch($row, "asset tag");
$checkindate = Carbon::parse($record['Checkin Date'])->format('Y-m-d H:i:s'); if (!array_key_exists($asset_tag, $item)) {
} $item[$asset_tag] = array();
catch (\Exception $err) {
$status['error'][]['asset'][$asset_tag]['msg'] = 'Your dates are screwed up. Format needs to be Y-m-d H:i:s';
continue;
}
if($asset = Cache::remember('asset:' . $asset_tag, $cachetime, function () use( &$asset_tag) {
$tocache = Asset::where('asset_tag', '=', $asset_tag)->value('id');
return is_null($tocache) ? false : $tocache;}))
{
//we've found our asset, now lets look for a user
if($base_username != User::generateFormattedNameFromFullName($record['Full Name'], Setting::getSettings()->username_format)) {
$base_username = User::generateFormattedNameFromFullName($record['Full Name'], Setting::getSettings()->username_format);
if(!$user = Cache::remember('user:' . $base_username['username'], $cachetime, function () use( &$base_username) {
$tocache = User::where('username', '=', $base_username['username'])->value('id');
return is_null($tocache) ? false : $tocache;}))
{
$status['error'][]['asset'][$asset_tag]['msg'] = 'Asset was found but user (' . $record['Full Name'] . ') not matched';
$base_username = null;
continue;
}
} }
$batch_counter = count($item[$asset_tag]);
if($checkoutdate < $checkindate) { $item[$asset_tag][$batch_counter]['checkout_date'] = Carbon::parse(Helper::array_smart_fetch($row, "checkout date"))->format('Y-m-d H:i:s');
$item[$asset_tag][$batch_counter]['checkin_date'] = Carbon::parse(Helper::array_smart_fetch($row, "checkin date"))->format('Y-m-d H:i:s');
\Log::debug($item[$asset_tag][$batch_counter]['checkin_date']);
$item[$asset_tag][$batch_counter]['asset_tag'] = Helper::array_smart_fetch($row, "asset tag");
$item[$asset_tag][$batch_counter]['name'] = Helper::array_smart_fetch($row, "name");
$item[$asset_tag][$batch_counter]['email'] = Helper::array_smart_fetch($row, "email");
if ($asset = Asset::where('asset_tag', '=', $asset_tag)->first()) {
$item[$asset_tag][$batch_counter]['asset_id'] = $asset->id;
$base_username = User::generateFormattedNameFromFullName(Setting::getSettings()->username_format, $item[$asset_tag][$batch_counter]['name']);
$user = User::where('username', '=', $base_username['username']);
$user_query = ' on username '.$base_username['username'];
if ($request->input('match_firstnamelastname')=='1') {
$firstnamedotlastname = User::generateFormattedNameFromFullName('firstname.lastname', $item[$asset_tag][$batch_counter]['name']);
$item[$asset_tag][$batch_counter]['username'][] = $firstnamedotlastname['username'];
$user->orWhere('username', '=', $firstnamedotlastname['username']);
$user_query .= ', or on username '.$firstnamedotlastname['username'];
}
if ($request->input('match_flastname')=='1') {
$flastname = User::generateFormattedNameFromFullName('filastname', $item[$asset_tag][$batch_counter]['name']);
$item[$asset_tag][$batch_counter]['username'][] = $flastname['username'];
$user->orWhere('username', '=', $flastname['username']);
$user_query .= ', or on username '.$flastname['username'];
}
if ($request->input('match_firstname')=='1') {
$firstname = User::generateFormattedNameFromFullName('firstname', $item[$asset_tag][$batch_counter]['name']);
$item[$asset_tag][$batch_counter]['username'][] = $firstname['username'];
$user->orWhere('username', '=', $firstname['username']);
$user_query .= ', or on username '.$firstname['username'];
}
if ($request->input('match_email')=='1') {
if ($item[$asset_tag][$batch_counter]['email']=='') {
$item[$asset_tag][$batch_counter]['username'][] = $user_email = User::generateEmailFromFullName($item[$asset_tag][$batch_counter]['name']);
$user->orWhere('username', '=', $user_email);
$user_query .= ', or on username '.$user_email;
}
}
// A matching user was found
if ($user = $user->first()) {
$item[$asset_tag][$batch_counter]['checkedout_to'] = $user->id;
$item[$asset_tag][$batch_counter]['user_id'] = $user->id;
Actionlog::firstOrCreate(array( Actionlog::firstOrCreate(array(
'item_id' => $asset, 'item_id' => $asset->id,
'item_type' => Asset::class, 'item_type' => Asset::class,
'user_id' => Auth::user()->id, 'user_id' => Auth::user()->id,
'note' => 'Historical record added by ' . Auth::user()->present()->fullName(), 'note' => 'Checkout imported by '.Auth::user()->present()->fullName().' from history importer',
'target_id' => $user, 'target_id' => $item[$asset_tag][$batch_counter]['user_id'],
'target_type' => User::class, 'target_type' => User::class,
'created_at' => $checkoutdate, 'created_at' => $item[$asset_tag][$batch_counter]['checkout_date'],
'action_type' => 'checkout', 'action_type' => 'checkout',
)); ));
$asset->assigned_to = $user->id;
if ($asset->save()) {
$status['success'][]['asset'][$asset_tag]['msg'] = 'Asset successfully matched for '.Helper::array_smart_fetch($row, "name").$user_query.' on '.$item[$asset_tag][$batch_counter]['checkout_date'];
} else {
$status['error'][]['asset'][$asset_tag]['msg'] = 'Asset and user was matched but could not be saved.';
}
} else {
$item[$asset_tag][$batch_counter]['checkedout_to'] = null;
$status['error'][]['user'][Helper::array_smart_fetch($row, "name")]['msg'] = 'User does not exist so no checkin log was created.';
}
} else {
$item[$asset_tag][$batch_counter]['asset_id'] = null;
$status['error'][]['asset'][$asset_tag]['msg'] = 'Asset does not exist so no match was attempted.';
}
}
}
// Loop through and backfill the checkins
foreach ($item as $key => $asset_batch) {
$total_in_batch = count($asset_batch);
for ($x = 0; $x < $total_in_batch; $x++) {
$next = $x + 1;
// Only do this if a matching user was found
if ((array_key_exists('checkedout_to', $asset_batch[$x])) && ($asset_batch[$x]['checkedout_to']!='')) {
if (($total_in_batch > 1) && ($x < $total_in_batch) && (array_key_exists($next, $asset_batch))) {
$checkin_date = Carbon::parse($asset_batch[$next]['checkin_date'])->format('Y-m-d H:i:s');
$asset_batch[$x]['real_checkin'] = $checkin_date;
\Log::debug($asset_batch[$next]['checkin_date']);
\Log::debug($checkin_date);
Actionlog::firstOrCreate(array( Actionlog::firstOrCreate(array(
'item_id' => $asset, 'item_id' => $asset,
'item_type' => Asset::class, 'item_type' => Asset::class,
@ -678,11 +737,6 @@ class AssetsController extends Controller
return view('hardware/audit')->with('asset', $asset)->with('next_audit_date', $dt)->with('locations_list'); return view('hardware/audit')->with('asset', $asset)->with('next_audit_date', $dt)->with('locations_list');
} }
public function dueForAudit()
{
$this->authorize('audit', Asset::class);
return view('hardware/audit-due');
}
public function overdueForAudit() public function overdueForAudit()
{ {

View file

@ -179,8 +179,8 @@ class LoginController extends Controller
} }
if ($user = Auth::user()) { if ($user = Auth::user()) {
$user->last_login = Carbon::now(); $user->last_login = \Carbon::now();
Log::debug('Last login:'.$user->last_login); \Log::debug('Last login:'.$user->last_login);
$user->save(); $user->save();
} }
// Redirect to the users page // Redirect to the users page
@ -277,7 +277,7 @@ class LoginController extends Controller
return redirect()->route('login')->with('error', trans('auth/general.login_prompt')); return redirect()->route('login')->with('error', trans('auth/general.login_prompt'));
} }
if (!$request->has('two_factor_secret')) { if (!$request->filled('two_factor_secret')) {
return redirect()->route('two-factor')->with('error', trans('auth/message.two_factor.code_required')); return redirect()->route('two-factor')->with('error', trans('auth/message.two_factor.code_required'));
} }
@ -320,7 +320,7 @@ class LoginController extends Controller
return redirect()->away($customLogoutUrl); return redirect()->away($customLogoutUrl);
} }
return redirect()->route('login')->with('success', trans('auth/general.logout.success')); return redirect()->route('login')->with('success', trans('auth/message.logout.success'));
} }

View file

@ -44,19 +44,18 @@ class CustomFieldsetsController extends Controller
$maxid = 0; $maxid = 0;
foreach ($cfset->fields() as $field) { foreach ($cfset->fields as $field) {
if ($field->pivot->order > $maxid) {
if ($field) { $maxid=$field->pivot->order;
if ($field->pivot->order > $maxid) { }
$maxid=$field->pivot->order; if (isset($custom_fields_list[$field->id])) {
} unset($custom_fields_list[$field->id]);
if (isset($custom_fields_list[$field->id])) {
unset($custom_fields_list[$field->id]);
}
} }
} }
return view("custom_fields.fieldsets.view")->with("custom_fieldset", $cfset)->with("maxid", $maxid+1)->with("custom_fields_list", $custom_fields_list);
}
return view("custom_fields.fieldsets.view") return view("custom_fields.fieldsets.view")
->with("custom_fieldset", $cfset) ->with("custom_fieldset", $cfset)
->with("maxid", $maxid+1) ->with("maxid", $maxid+1)
@ -176,14 +175,13 @@ class CustomFieldsetsController extends Controller
/** /**
* Associate the custom field with a custom fieldset. * Associate the custom field with a custom fieldset.
* *
* @author [Brady Wetherington] [<uberbrady@gmail.com>] * @author [Brady Wetherington] [<uberbrady@gmail.com>]
* @since [v1.8] * @since [v1.8]
* @return View * @return View
* @throws \Illuminate\Auth\Access\AuthorizationException */
*/ public function associate(Request $request, $id)
public function associate($id)
{ {
$set = CustomFieldset::find($id); $set = CustomFieldset::find($id);
@ -191,12 +189,12 @@ class CustomFieldsetsController extends Controller
$this->authorize('update', $set); $this->authorize('update', $set);
foreach ($set->fields as $field) { foreach ($set->fields as $field) {
if ($field->id == Input::get('field_id')) { if ($field->id == $request->input('field_id')) {
return redirect()->route("fieldsets.show", [$id])->withInput()->withErrors(['field_id' => trans('admin/custom_fields/message.field.already_added')]); return redirect()->route("fieldsets.show", [$id])->withInput()->withErrors(['field_id' => trans('admin/custom_fields/message.field.already_added')]);
} }
} }
$results=$set->fields()->attach(Input::get('field_id'), ["required" => (Input::get('required') == "on"),"order" => Input::get('order')]); $results = $set->fields()->attach(Input::get('field_id'), ["required" => ($request->input('required') == "on"),"order" => $request->input('order', 1)]);
return redirect()->route("fieldsets.show", [$id])->with("success", trans('admin/custom_fields/message.field.create.assoc_success')); return redirect()->route("fieldsets.show", [$id])->with("success", trans('admin/custom_fields/message.field.create.assoc_success'));
} }

View file

@ -52,8 +52,8 @@ class DepartmentsController extends Controller
$this->authorize('create', Department::class); $this->authorize('create', Department::class);
$department = new Department; $department = new Department;
$department->fill($request->all()); $department->fill($request->all());
$department->user_id = Auth::id(); $department->user_id = Auth::user()->id;
$department->manager_id = $request->input('manager_id', null); $department->manager_id = ($request->has('manager_id' ) ? $request->input('manager_id') : null);
$department = $request->handleImages($department); $department = $request->handleImages($department);

View file

@ -320,7 +320,8 @@ class SettingsController extends Controller
$setting->modellist_displays = ''; $setting->modellist_displays = '';
if (($request->filled('show_in_model_list')) && (count($request->input('show_in_model_list')) > 0)) { if (($request->has('show_in_model_list')) && (count($request->input('show_in_model_list')) > 0))
{
$setting->modellist_displays = implode(',', $request->input('show_in_model_list')); $setting->modellist_displays = implode(',', $request->input('show_in_model_list'));
} }
@ -577,8 +578,9 @@ class SettingsController extends Controller
$setting->pwd_secure_min = (int) $request->input('pwd_secure_min'); $setting->pwd_secure_min = (int) $request->input('pwd_secure_min');
$setting->pwd_secure_complexity = ''; $setting->pwd_secure_complexity = '';
if ($request->filled('pwd_secure_complexity')) {
$setting->pwd_secure_complexity = implode('|', $request->input('pwd_secure_complexity')); if ($request->has('pwd_secure_complexity')) {
$setting->pwd_secure_complexity = implode('|', $request->input('pwd_secure_complexity'));
} }
if ($setting->save()) { if ($setting->save()) {
@ -884,7 +886,9 @@ class SettingsController extends Controller
$setting->labels_pageheight = $request->input('labels_pageheight'); $setting->labels_pageheight = $request->input('labels_pageheight');
$setting->labels_display_company_name = $request->input('labels_display_company_name', '0'); $setting->labels_display_company_name = $request->input('labels_display_company_name', '0');
if ($request->filled('labels_display_name')) {
if ($request->has('labels_display_name')) {
$setting->labels_display_name = 1; $setting->labels_display_name = 1;
} else { } else {
$setting->labels_display_name = 0; $setting->labels_display_name = 0;
@ -900,13 +904,8 @@ class SettingsController extends Controller
$setting->labels_display_tag = 1; $setting->labels_display_tag = 1;
} else { } else {
$setting->labels_display_tag = 0; $setting->labels_display_tag = 0;
} }
if ($request->filled('labels_display_tag')) {
$setting->labels_display_tag = 1;
} else {
$setting->labels_display_tag = 0;
}
if ($request->filled('labels_display_model')) { if ($request->filled('labels_display_model')) {
$setting->labels_display_model = 1; $setting->labels_display_model = 1;

View file

@ -36,13 +36,19 @@ class ViewAssetsController extends Controller
'licenses', 'licenses',
'userloc', 'userloc',
'userlog' 'userlog'
)->withTrashed()->find(Auth::id()); )->withTrashed()->find(Auth::user()->id);
$userlog = $user->userlog->load('item', 'user', 'target'); $userlog = $user->userlog->load('item', 'user', 'target');
if (isset($user->id)) { if (isset($user->id)) {
return view('account/view-assets', compact('user', 'userlog')); return view('account/view-assets', compact('user', 'userlog'));
} else {
// Prepare the error message
$error = trans('admin/users/message.user_not_found', compact('id'));
// Redirect to the user management page
return redirect()->route('users.index')->with('error', $error);
} }
// Redirect to the user management page // Redirect to the user management page
return redirect()->route('users.index') return redirect()->route('users.index')
@ -117,15 +123,17 @@ class ViewAssetsController extends Controller
return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')); return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled'));
} } else {
$item->request(); $item->request();
if (($settings->alert_email!='') && ($settings->alerts_enabled=='1') && (!config('app.lock_passwords'))) { if (($settings->alert_email!='') && ($settings->alerts_enabled=='1') && (!config('app.lock_passwords'))) {
$logaction->logaction('requested'); $logaction->logaction('requested');
$settings->notify(new RequestAssetNotification($data)); $settings->notify(new RequestAssetNotification($data));
} }
return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success'));
return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success'));
}
} }
@ -197,6 +205,124 @@ class ViewAssetsController extends Controller
// Get the acceptance screen // Get the acceptance screen
public function getAcceptAsset($logID = null) public function getAcceptAsset($logID = null)
{ {
return redirect()->route('account.accept');
$findlog = Actionlog::where('id', $logID)->first();
if (!$findlog) {
return redirect()->to('account/view-assets')->with('error', 'No matching record.');
}
if ($findlog->accepted_id!='') {
return redirect()->to('account/view-assets')->with('error', trans('admin/users/message.error.asset_already_accepted'));
}
$user = Auth::user();
// TODO - Fix this for non-assets
if (($findlog->item_type==Asset::class) && ($user->id != $findlog->item->assigned_to)) {
return redirect()->to('account/view-assets')->with('error', trans('admin/users/message.error.incorrect_user_accepted'));
}
$item = $findlog->item;
// Check if the asset exists
if (is_null($item)) {
// Redirect to the asset management page
return redirect()->to('account')->with('error', trans('admin/hardware/message.does_not_exist'));
} elseif (!Company::isCurrentUserHasAccess($item)) {
return redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions'));
} else {
return view('account/accept-asset', compact('item'))->with('findlog', $findlog)->with('item', $item);
}
}
// Save the acceptance
public function postAcceptAsset(Request $request, $logID = null)
{
// Check if the asset exists
if (is_null($findlog = Actionlog::where('id', $logID)->first())) {
// Redirect to the asset management page
return redirect()->to('account/view-assets')->with('error', trans('admin/hardware/message.does_not_exist'));
}
if ($findlog->accepted_id!='') {
// Redirect to the asset management page
return redirect()->to('account/view-assets')->with('error', trans('admin/users/message.error.asset_already_accepted'));
}
if (!Input::has('asset_acceptance')) {
return redirect()->back()->with('error', trans('admin/users/message.error.accept_or_decline'));
}
$user = Auth::user();
if (($findlog->item_type==Asset::class) && ($user->id != $findlog->item->assigned_to)) {
return redirect()->to('account/view-assets')->with('error', trans('admin/users/message.error.incorrect_user_accepted'));
}
if ($request->filled('signature_output')) {
$path = config('app.private_uploads').'/signatures';
$sig_filename = "siglog-".$findlog->id.'-'.date('Y-m-d-his').".png";
$data_uri = e($request->get('signature_output'));
$encoded_image = explode(",", $data_uri);
$decoded_image = base64_decode($encoded_image[1]);
file_put_contents($path."/".$sig_filename, $decoded_image);
}
$logaction = new Actionlog();
if (Input::get('asset_acceptance')=='accepted') {
$logaction_msg = 'accepted';
$accepted="accepted";
$return_msg = trans('admin/users/message.accepted');
} else {
$logaction_msg = 'declined';
$accepted="rejected";
$return_msg = trans('admin/users/message.declined');
}
$logaction->item_id = $findlog->item_id;
$logaction->item_type = $findlog->item_type;
// Asset
if (($findlog->item_id!='') && ($findlog->item_type==Asset::class)) {
if (Input::get('asset_acceptance')!='accepted') {
DB::table('assets')
->where('id', $findlog->item_id)
->update(array('assigned_to' => null));
}
}
$logaction->target_id = $findlog->target_id;
$logaction->target_type = User::class;
$logaction->note = e(Input::get('note'));
$logaction->updated_at = date("Y-m-d H:i:s");
if (isset($sig_filename)) {
$logaction->accept_signature = $sig_filename;
}
$log = $logaction->logaction($logaction_msg);
$update_checkout = DB::table('action_logs')
->where('id', $findlog->id)
->update(array('accepted_id' => $logaction->id));
if (($findlog->item_id!='') && ($findlog->item_type==Asset::class)) {
$affected_asset = $logaction->item;
$affected_asset->accepted = $accepted;
$affected_asset->save();
}
if ($update_checkout) {
return redirect()->to('account/view-assets')->with('success', $return_msg);
} else {
return redirect()->to('account/view-assets')->with('error', 'Something went wrong ');
}
} }
} }

View file

@ -44,7 +44,8 @@ class Kernel extends HttpKernel
], ],
'api' => [ 'api' => [
'throttle:60,1', \Barryvdh\Cors\HandleCors::class,
'throttle:120,1',
'auth:api', 'auth:api',
], ],
]; ];

View file

@ -18,4 +18,13 @@ class EncryptCookies extends BaseEncrypter
protected $except = [ protected $except = [
// //
]; ];
/**
* Indicates if cookies should be serialized.
*
* @var bool
*/
protected static $serialize = true;
} }

View file

@ -3,8 +3,11 @@
namespace App\Http\Requests; namespace App\Http\Requests;
use App\Models\Setting; use App\Models\Setting;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
class SaveUserRequest extends Request class SaveUserRequest extends FormRequest
{ {
/** /**
* Determine if the user is authorized to make this request. * Determine if the user is authorized to make this request.
@ -61,4 +64,5 @@ class SaveUserRequest extends Request
return $rules; return $rules;
} }
} }

View file

@ -34,6 +34,7 @@ class UsersTransformer
] : null, ] : null,
'jobtitle' => ($user->jobtitle) ? e($user->jobtitle) : null, 'jobtitle' => ($user->jobtitle) ? e($user->jobtitle) : null,
'phone' => ($user->phone) ? e($user->phone) : null, 'phone' => ($user->phone) ? e($user->phone) : null,
'website' => ($user->website) ? e($user->website) : null,
'address' => ($user->address) ? e($user->address) : null, 'address' => ($user->address) ? e($user->address) : null,
'city' => ($user->city) ? e($user->city) : null, 'city' => ($user->city) ? e($user->city) : null,
'state' => ($user->state) ? e($user->state) : null, 'state' => ($user->state) ? e($user->state) : null,

View file

@ -5,6 +5,7 @@ use App\Models\CustomField;
use App\Models\Department; use App\Models\Department;
use App\Models\Setting; use App\Models\Setting;
use App\Models\User; use App\Models\User;
use Illuminate\Support\Facades\Auth;
use ForceUTF8\Encoding; use ForceUTF8\Encoding;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
@ -126,8 +127,8 @@ abstract class Importer
public function import() public function import()
{ {
$headerRow = $this->csv->fetchOne(); $headerRow = $this->csv->fetchOne();
$this->csv->setHeaderOffset(0); $this->csv->setHeaderOffset(0); //explicitly sets the CSV document header record
$results = $this->normalizeInputArray($this->csv->getRecords()); $results = $this->normalizeInputArray($this->csv->getRecords($headerRow));
$this->populateCustomFields($headerRow); $this->populateCustomFields($headerRow);

View file

@ -82,7 +82,7 @@ class Asset extends Depreciable
'model_id' => 'required|integer|exists:models,id', 'model_id' => 'required|integer|exists:models,id',
'status_id' => 'required|integer|exists:status_labels,id', 'status_id' => 'required|integer|exists:status_labels,id',
'company_id' => 'integer|nullable', 'company_id' => 'integer|nullable',
'warranty_months' => 'numeric|nullable', 'warranty_months' => 'numeric|nullable|digits_between:0,240',
'physical' => 'numeric|max:1|nullable', 'physical' => 'numeric|max:1|nullable',
'checkout_date' => 'date|max:10|min:10|nullable', 'checkout_date' => 'date|max:10|min:10|nullable',
'checkin_date' => 'date|max:10|min:10|nullable', 'checkin_date' => 'date|max:10|min:10|nullable',
@ -1069,7 +1069,7 @@ class Asset extends Depreciable
public function scopeDueOrOverdueForAudit($query, $settings) public function scopeDueOrOverdueForAudit($query, $settings)
{ {
$interval = $settings->audit_warning_days ?? 0; $interval = $settings->audit_warning_days ?? 0;
return $query->whereNotNull('assets.next_audit_date') return $query->whereNotNull('assets.next_audit_date')
->whereRaw("DATE_SUB(assets.next_audit_date, INTERVAL $interval DAY) <= '".Carbon::now()."'") ->whereRaw("DATE_SUB(assets.next_audit_date, INTERVAL $interval DAY) <= '".Carbon::now()."'")
->where('assets.archived', '=', 0) ->where('assets.archived', '=', 0)
@ -1388,7 +1388,7 @@ class Asset extends Depreciable
* *
* In short, this set of statements tells the query builder to ONLY query against an * In short, this set of statements tells the query builder to ONLY query against an
* actual field that's being passed if it doesn't meet known relational fields. This * actual field that's being passed if it doesn't meet known relational fields. This
* allows us to query custom fields directly in the assets table * allows us to query custom fields directly in the assetsv table
* (regardless of their name) and *skip* any fields that we already know can only be * (regardless of their name) and *skip* any fields that we already know can only be
* searched through relational searches that we do earlier in this method. * searched through relational searches that we do earlier in this method.
* *
@ -1397,10 +1397,9 @@ class Asset extends Depreciable
* assets.location would fail, as that field doesn't exist -- plus we're already searching * assets.location would fail, as that field doesn't exist -- plus we're already searching
* against those relationships earlier in this method. * against those relationships earlier in this method.
* *
* - snipe * - snipe
* *
*/ */
if (($fieldname!='category') && ($fieldname!='model_number') && ($fieldname!='rtd_location') && ($fieldname!='location') && ($fieldname!='supplier') if (($fieldname!='category') && ($fieldname!='model_number') && ($fieldname!='rtd_location') && ($fieldname!='location') && ($fieldname!='supplier')
&& ($fieldname!='status_label') && ($fieldname!='model') && ($fieldname!='company') && ($fieldname!='manufacturer')) { && ($fieldname!='status_label') && ($fieldname!='model') && ($fieldname!='company') && ($fieldname!='manufacturer')) {
$query->orWhere('assets.'.$fieldname, 'LIKE', '%' . $search_val . '%'); $query->orWhere('assets.'.$fieldname, 'LIKE', '%' . $search_val . '%');

View file

@ -78,7 +78,13 @@ final class Company extends SnipeModel
} }
$table = ($table_name) ? DB::getTablePrefix().$table_name."." : ''; $table = ($table_name) ? DB::getTablePrefix().$table_name."." : '';
return $query->where($table.$column, '=', $company_id);
if(\Schema::hasColumn($query->getModel()->getTable(), $column)){
return $query->where($table.$column, '=', $company_id);
} else {
return $query->join('users as users_comp', 'users_comp.id', 'user_id')->where('users_comp.company_id', '=', $company_id);
}
} }
public static function getIdFromInput($unescaped_input) public static function getIdFromInput($unescaped_input)

View file

@ -21,7 +21,6 @@ class Department extends SnipeModel
protected $rules = [ protected $rules = [
'name' => 'required|max:255', 'name' => 'required|max:255',
'user_id' => 'nullable|exists:users,id',
'location_id' => 'numeric|nullable', 'location_id' => 'numeric|nullable',
'company_id' => 'numeric|nullable', 'company_id' => 'numeric|nullable',
'manager_id' => 'numeric|nullable', 'manager_id' => 'numeric|nullable',

View file

@ -6,10 +6,10 @@ use Watson\Validating\ValidatingTrait;
class Group extends SnipeModel class Group extends SnipeModel
{ {
protected $table = 'groups'; protected $table = 'permission_groups';
public $rules = array( public $rules = array(
'name' => 'required|min:3|max:255', 'name' => 'required|min:2|max:255',
); );
/** /**

View file

@ -70,7 +70,6 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo
'email' => 'email|nullable', 'email' => 'email|nullable',
'password' => 'required|min:6', 'password' => 'required|min:6',
'locale' => 'max:10|nullable', 'locale' => 'max:10|nullable',
'manager_id' => 'exists:users,id|nullable'
]; ];
use Searchable; use Searchable;
@ -635,7 +634,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo
*/ */
public function scopeByGroup($query, $id) { public function scopeByGroup($query, $id) {
return $query->whereHas('groups', function ($query) use ($id) { return $query->whereHas('groups', function ($query) use ($id) {
$query->where('groups.id', '=', $id); $query->where('permission_groups.id', '=', $id);
}); });
} }
@ -681,7 +680,22 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo
return $query->leftJoin('departments as departments_users', 'users.department_id', '=', 'departments_users.id')->orderBy('departments_users.name', $order); return $query->leftJoin('departments as departments_users', 'users.department_id', '=', 'departments_users.id')->orderBy('departments_users.name', $order);
} }
/**
* Query builder scope to order on company
*
* @param Illuminate\Database\Query\Builder $query Query builder instance
* @param text $order Order
*
* @return Illuminate\Database\Query\Builder Modified query builder
*/
public function scopeOrderCompany($query, $order)
{
return $query->leftJoin('companies as companies_user', 'users.company_id', '=', 'companies_user.id')->orderBy('companies_user.name', $order);
}
public function preferredLocale(){ public function preferredLocale(){
return $this->locale; return $this->locale;
} }
} }

View file

@ -12,16 +12,27 @@ class LicensePolicy extends CheckoutablePermissionsPolicy
return 'licenses'; return 'licenses';
} }
/** /**
* Determine whether the user can view license keys * Determine whether the user can view license keys.
* * This gets a little tricky, UX/logic-wise. If a user has the ability
* @param \App\Models\User $user * to create a license (which requires a product key), shouldn't they
* @param \App\Models\License $license * have the ability to see the product key as well?
* @return mixed *
*/ * Example: I create the license, realize I need to change
* something (maybe I got the product key wrong), and now I can never
* see/edit that product key.
*
* @see https://github.com/snipe/snipe-it/issues/6956
* @param \App\Models\User $user
* @param \App\Models\License $license
* @return mixed
*/
public function viewKeys(User $user, License $license = null) public function viewKeys(User $user, License $license = null)
{ {
return $user->hasAccess('licenses.keys'); if ($user->hasAccess('licenses.keys') || $user->hasAccess('licenses.create') || $user->hasAccess('licenses.edit')) {
return true;
}
return false;
} }
} }

View file

@ -492,9 +492,13 @@ class AssetPresenter extends Presenter
*/ */
public function warrantee_expires() public function warrantee_expires()
{ {
$date = date_create($this->purchase_date); if (($this->purchase_date) && ($this->warranty_months)) {
date_add($date, date_interval_create_from_date_string($this->warranty_months . ' months')); $date = date_create($this->purchase_date);
return date_format($date, 'Y-m-d'); date_add($date, date_interval_create_from_date_string($this->warranty_months . ' months'));
return date_format($date, 'Y-m-d');
}
return false;
} }
/** /**

View file

@ -118,6 +118,34 @@ class SettingsServiceProvider extends ServiceProvider
return 'storage/public_uploads/companies/'; return 'storage/public_uploads/companies/';
}); });
// Accessories paths and URLs
\App::singleton('accessories_upload_path', function(){
return public_path('/uploads/accessories/');
});
\App::singleton('accessories_upload_url', function(){
return url('/').'/uploads/accessories/';
});
// Consumables paths and URLs
\App::singleton('consumables_upload_path', function(){
return public_path('/uploads/consumables/');
});
\App::singleton('consumables_upload_url', function(){
return url('/').'/uploads/consumables/';
});
// Components paths and URLs
\App::singleton('components_upload_path', function(){
return public_path('/uploads/components/');
});
\App::singleton('components_upload_url', function(){
return url('/').'/uploads/components/';
});
// Set the monetary locale to the configured locale to make helper::parseFloat work. // Set the monetary locale to the configured locale to make helper::parseFloat work.

View file

@ -13,49 +13,50 @@
"ext-pdo": "*", "ext-pdo": "*",
"adldap2/adldap2": "^9.1", "adldap2/adldap2": "^9.1",
"bacon/bacon-qr-code": "^1.0", "bacon/bacon-qr-code": "^1.0",
"doctrine/cache": "^1.6", "barryvdh/laravel-cors": "^0.11.3",
"doctrine/common": "^2.7", "barryvdh/laravel-debugbar": "^3.2",
"doctrine/dbal": "^2.8.0", "doctrine/cache": "^1.8",
"doctrine/common": "^2.10",
"doctrine/dbal": "^2.9.0",
"doctrine/inflector": "1.3.*", "doctrine/inflector": "1.3.*",
"doctrine/instantiator": "1.1.*", "doctrine/instantiator": "^1.2",
"eduardokum/laravel-mail-auto-embed": "^1.0", "eduardokum/laravel-mail-auto-embed": "^1.0",
"erusev/parsedown": "^1.6", "erusev/parsedown": "^1.7",
"fideloper/proxy": "~4.0", "fideloper/proxy": "^4.1",
"intervention/image": "^2.3", "guzzlehttp/guzzle": "^6.3",
"intervention/image": "^2.4",
"javiereguiluz/easyslugger": "^1.0", "javiereguiluz/easyslugger": "^1.0",
"laravel/framework": "5.7.*", "laravel/framework": "5.7.*",
"laravel/passport": "~6.0", "laravel/passport": ~6.0",
"laravel/tinker": "^1.0", "laravel/tinker": "^1.0",
"laravelcollective/html": "^5.3", "laravelcollective/html": "^5.5",
"league/csv": "^9.0", "league/csv": "^9.2",
"league/flysystem-aws-s3-v3": "~1.0", "league/flysystem-aws-s3-v3": "~1.0",
"league/flysystem-cached-adapter": "^1.0", "league/flysystem-cached-adapter": "^1.0",
"league/flysystem-rackspace": "^1.0", "league/flysystem-rackspace": "^1.0",
"league/flysystem-sftp": "~1.0", "league/flysystem-sftp": "~1.0",
"maknz/slack": "^1.7", "maknz/slack": "^1.7",
"neitanod/forceutf8": "^2.0", "neitanod/forceutf8": "^2.0",
"paragonie/constant_time_encoding": "^1.0", "paragonie/constant_time_encoding": "^1.0",
"patchwork/utf8": "~1.2", "patchwork/utf8": "^1.3",
"phpdocumentor/reflection-docblock": "3.2.2", "phpdocumentor/reflection-docblock": "3.2.2",
"phpspec/prophecy": "1.7.5", "phpspec/prophecy": "^1.8",
"pragmarx/google2fa": "^5.0", "pragmarx/google2fa": "^5.0",
"pragmarx/google2fa-laravel": "^0.3.0", "pragmarx/google2fa-laravel": "^1.0",
"predis/predis": "^1.1", "predis/predis": "^1.1",
"rollbar/rollbar-laravel": "^4.0", "rollbar/rollbar-laravel": "^4.0",
"schuppo/password-strength": "~1.5", "schuppo/password-strength": "~1.5",
"spatie/laravel-backup": "^5.6", "spatie/laravel-backup": "^5.12",,
"tecnickcom/tc-lib-barcode": "^1.15", "tecnickcom/tc-lib-barcode": "^1.15",
"tightenco/ziggy": "^0.6.3", "tightenco/ziggy": "^0.7.1",
"unicodeveloper/laravel-password": "^1.0", "unicodeveloper/laravel-password": "^1.0",
"watson/validating": "3.1.7" "watson/validating": "3.1.7"
}, },
"require-dev": { "require-dev": {
"barryvdh/laravel-debugbar": "^3.2",
"barryvdh/laravel-ide-helper": "^2.6",
"codeception/codeception": "^2.4", "codeception/codeception": "^2.4",
"filp/whoops": "~2.0",
"fzaninotto/faker": "~1.4", "fzaninotto/faker": "~1.4",
"roave/security-advisories": "dev-master", "phpunit/php-token-stream": "1.4.11",
"phpunit/phpunit": "~6.0",
"squizlabs/php_codesniffer": "*", "squizlabs/php_codesniffer": "*",
"symfony/css-selector": "4.0.*", "symfony/css-selector": "4.0.*",
"symfony/dom-crawler": "4.0.*" "symfony/dom-crawler": "4.0.*"
@ -100,6 +101,7 @@
"preferred-install": "dist", "preferred-install": "dist",
"sort-packages": true, "sort-packages": true,
"optimize-autoloader": true, "optimize-autoloader": true,
"process-timeout":3000,
"platform": { "platform": {
"php": "7.1.3" "php": "7.1.3"
} }

View file

@ -117,6 +117,54 @@ return [
'cipher' => env('APP_CIPHER', 'AES-256-CBC'), 'cipher' => env('APP_CIPHER', 'AES-256-CBC'),
/*
|--------------------------------------------------------------------------
| Logging Configuration
|--------------------------------------------------------------------------
|
| Here you may configure the log settings for your application. Out of
| the box, Laravel uses the Monolog PHP logging library. This gives
| you a variety of powerful log handlers / formatters to utilize.
|
| Available Settings: "single", "daily", "syslog", "errorlog"
|
*/
'log' => env('APP_LOG', 'single'),
/*
|--------------------------------------------------------------------------
| Logging Max Files
|--------------------------------------------------------------------------
|
| When using the daily log mode, Laravel will only retain 5
| days of log files by default.
|
| To change this, set the APP_LOG_MAX_FILES option in your .env.
|
*/
'log_max_files' => env('APP_LOG_MAX_FILES', 5),
/*
|--------------------------------------------------------------------------
| Logging Detail
|--------------------------------------------------------------------------
|
| By default, Laravel writes all log levels to storage. However, in your
| production environment, you may wish to configure the minimum severity that
| should be logged by editing your APP_LOG_LEVEL env config.
|
| Laravel will log all levels greater than or equal to the specified severity.
| For example, a default log_level of error will log error, critical, alert,
| and emergency messages.
|
| APP_LOG_LEVEL options are:
| "debug", "info", "notice", "warning", "error", "critical", "alert", "emergency"
|
*/
'log_level' => env('APP_LOG_LEVEL', 'error'),
/* /*
@ -250,7 +298,7 @@ return [
* Package Service Providers... * Package Service Providers...
*/ */
// Barryvdh\Debugbar\ServiceProvider::class, // should be auto-discovered Barryvdh\Debugbar\ServiceProvider::class,
Intervention\Image\ImageServiceProvider::class, Intervention\Image\ImageServiceProvider::class,
Collective\Html\HtmlServiceProvider::class, Collective\Html\HtmlServiceProvider::class,
Spatie\Backup\BackupServiceProvider::class, Spatie\Backup\BackupServiceProvider::class,

View file

@ -9,12 +9,27 @@
*/ */
// This is janky, but necessary to figure out whether to include the .env in the backup
$included_dirs = [
base_path('public/uploads'),
base_path('config'),
base_path('storage/private_uploads'),
base_path('storage/oauth-private.key'),
base_path('storage/oauth-public.key'),
];
if (env('BACKUP_ENV')=='true') {
$included_dirs[] = base_path('.env');
}
return [ return [
'backup' => [ 'backup' => [
/* /*
* I don't know why they call it name - it's used in the path for uploads * The name of this application. You can use this name to monitor
* the backups.
*/ */
'name' => 'backups', 'name' => 'backups',
@ -25,12 +40,7 @@ return [
/* /*
* The list of directories and files that will be included in the backup. * The list of directories and files that will be included in the backup.
*/ */
'include' => [ 'include' => $included_dirs,
storage_path('oauth-private.key'),
storage_path('oauth-public.key'),
(env('BACKUP_ENV')=='true') ? base_path('.env') : base_path('.env.example'),
],
/* /*
* These directories and files will be excluded from the backup. * These directories and files will be excluded from the backup.
@ -38,8 +48,8 @@ return [
* Directories used by the backup process will automatically be excluded. * Directories used by the backup process will automatically be excluded.
*/ */
'exclude' => [ 'exclude' => [
// base_path('vendor'), base_path('vendor'),
// base_path('node_modules'), base_path('node_modules'),
], ],
/* /*
@ -51,6 +61,21 @@ return [
/* /*
* The names of the connections to the databases that should be backed up * The names of the connections to the databases that should be backed up
* MySQL, PostgreSQL, SQLite and Mongo databases are supported. * MySQL, PostgreSQL, SQLite and Mongo databases are supported.
*
* The content of the database dump may be customized for each connection
* by adding a 'dump' key to the connection settings in config/database.php.
* E.g.
* 'mysql' => [
* ...
* 'dump' => [
* 'excludeTables' => [
* 'table_to_exclude_from_backup',
* 'another_table_to_exclude'
* ]
* ]
* ],
*
* For a complete list of available customization options, see https://github.com/spatie/db-dumper
*/ */
'databases' => [ 'databases' => [
'mysql', 'mysql',
@ -58,24 +83,37 @@ return [
], ],
/* /*
* The database dump can be gzipped to decrease diskspace usage. * The database dump can be compressed to decrease diskspace usage.
*
* Out of the box Laravel-backup supplies
* Spatie\DbDumper\Compressors\GzipCompressor::class.
*
* You can also create custom compressor. More info on that here:
* https://github.com/spatie/db-dumper#using-compression
*
* If you do not want any compressor at all, set it to null.
*/ */
'gzip_database_dump' => true, 'database_dump_compressor' => null,
'destination' => [ 'destination' => [
/* /*
* The filename prefix used for the backup zip file. * The filename prefix used for the backup zip file.
*/ */
'filename_prefix' => 'snipe-it-backup-', 'filename_prefix' => 'snipe-it-',
/* /*
* The disk names on which the backups will be stored. * The disk names on which the backups will be stored.
*/ */
'disks' => [ 'disks' => [
env('FILESYSTEM_DISK'), 'local',
], ],
], ],
/*
* The directory where the temporary files will be stored.
*/
'temporary_directory' => storage_path('app/backup-temp'),
], ],
/* /*
@ -103,7 +141,7 @@ return [
'notifiable' => \Spatie\Backup\Notifications\Notifiable::class, 'notifiable' => \Spatie\Backup\Notifications\Notifiable::class,
'mail' => [ 'mail' => [
'to' => null, 'to' => env('MAIL_BACKUP_NOTIFICATION_ADDRESS', null),
], ],
'slack' => [ 'slack' => [
@ -113,6 +151,11 @@ return [
* If this is set to null the default channel of the webhook will be used. * If this is set to null the default channel of the webhook will be used.
*/ */
'channel' => null, 'channel' => null,
'username' => null,
'icon' => null,
], ],
], ],
@ -123,7 +166,7 @@ return [
*/ */
'monitorBackups' => [ 'monitorBackups' => [
[ [
'name' => env('APP_NAME'), 'name' => config('app.name'),
'disks' => ['local'], 'disks' => ['local'],
'newestBackupsShouldNotBeOlderThanDays' => 1, 'newestBackupsShouldNotBeOlderThanDays' => 1,
'storageUsedMayNotBeHigherThanMegabytes' => 5000, 'storageUsedMayNotBeHigherThanMegabytes' => 5000,
@ -186,4 +229,3 @@ return [
], ],
], ],
]; ];

48
config/cors.php Normal file
View file

@ -0,0 +1,48 @@
<?php
/**
* ---------------------------------------------------------------------
* THIS IS $allowed_origins code IS NOT PART OF THE ORIGINAL CORS PACKAGE.
* IT IS A MODIFICATION BY SNIPE-IT TO ALLOW ADDING ALLOWED ORIGINS VIA THE ENV.
* ---------------------------------------------------------------------
*
* Since we don't really want people editing config files (lest they get
* overwritten later), this enables the person managing the Snipe-IT
* installation to modify these values without modifying the code.
*
* If APP_CORS_ALLOWED_ORIGINS is not set in the .env (for example if no one added it
* after an upgrade from a previous version that didn't include it in the .env.example) or is null,
* set it to * to allow all. If there is a value, either a single url or a comma-delimited
* list of urls, explode that out into an array to whitelist just those urls.
*/
$allowed_origins = env('CORS_ALLOWED_ORIGINS') !== null ?
explode(',', env('CORS_ALLOWED_ORIGINS')) : [];
/**
* Original Laravel CORS package config file modifications end here
*
*/
return [
/*
|--------------------------------------------------------------------------
| Laravel CORS
|--------------------------------------------------------------------------
|
| allowedOrigins, allowedHeaders and allowedMethods can be set to array('*')
| to accept any value.
|
*/
'supportsCredentials' => false,
'allowedOrigins' => $allowed_origins,
'allowedOriginsPatterns' => [],
'allowedHeaders' => ['*'],
'allowedMethods' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],
'exposedHeaders' => [],
'maxAge' => 0,
];

View file

@ -29,7 +29,7 @@ class MigrationCartalystSentryInstallGroups extends Migration {
*/ */
public function up() public function up()
{ {
Schema::create('groups', function($table) Schema::create('permission_groups', function($table)
{ {
$table->increments('id'); $table->increments('id');
$table->string('name'); $table->string('name');
@ -46,7 +46,7 @@ class MigrationCartalystSentryInstallGroups extends Migration {
*/ */
public function down() public function down()
{ {
Schema::drop('groups'); Schema::drop('permission_groups');
} }
} }

View file

@ -2,39 +2,44 @@
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use App\Models\Group;
class UpdateGroupFieldForReporting extends Migration { class UpdateGroupFieldForReporting extends Migration {
/** /**
* Run the migrations. * Run the migrations.
* *
* @return void * @return void
*/ */
public function up() public function up()
{ {
//
// Schema::table('groups', function(Blueprint $table)
// {
// //
// });
DB::update('update '.DB::getTablePrefix().'groups set permissions = ? where id = ?', ['{"admin":1,"users":1,"reports":1}', 1]); // This is janky because we had to do a back in time change to handle a MySQL 8+
// compatibility issue.
DB::update('update '.DB::getTablePrefix().'groups set permissions = ? where id = ?', ['{"users":1,"reports":1}', 2]); // Ideally we'd be using the model here, but since we can't really know whether this is an upgrade
// or a fresh install, we have to check which table is being used.
if (Schema::hasTable('permission_groups')) {
// DB::statement('UPDATE '.$prefix.'groups SET permissions="{\"admin\":1,\"users\":1,\"reports\":1}" where id=1'); Group::where('id', 1)->update(['permissions' => '{"users-poop":1,"reports":1}']);
// DB::statement('UPDATE '.$prefix.'groups SET permissions="{\"users\":1,\"reports\":1}" where id=2'); Group::where('id', 2)->update(['permissions' => '{"users-pop":1,"reports":1}']);
} } elseif (Schema::hasTable('groups')) {
DB::update('update '.DB::getTablePrefix().'groups set permissions = ? where id = ?', ['{"admin-farts":1,"users":1,"reports":1}', 1]);
DB::update('update '.DB::getTablePrefix().'groups set permissions = ? where id = ?', ['{"users-farts":1,"reports":1}', 2]);
}
/** }
* Reverse the migrations.
* /**
* @return void * Reverse the migrations.
*/ *
public function down() * @return void
{ */
// public function down()
} {
//
}
} }

View file

@ -0,0 +1,44 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class RenameGroupsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// We check to see if this table exists before attempting the migration since
// upgraded installs would have this table, but new installs wouldn't.
// We had to change the name of the table in the older migrations
// to handle a MySQl 8+ compatibility issue related to reserved words.
// Without going back in time in migrations, this would fail since the groups table
// would never be allowed to be created in the first place on MySql 8+.
//
// So... if an upgrade, let's rename that table.
// If a new install, the migration was already changed, so the table isn't
// called that anymore and we can skip this migration.
if (Schema::hasTable('groups')) {
Schema::rename('groups', 'permission_groups');
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
if (Schema::hasTable('permission_groups')) {
Schema::rename('permission_groups', 'groups');
}
}
}

View file

@ -10,7 +10,7 @@
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js " "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js "
}, },
"devDependencies": { "devDependencies": {
"axios": "^0.16.2", "axios": ">=0.18.1",
"babel-preset-latest": "^6.24.1", "babel-preset-latest": "^6.24.1",
"cross-env": "^5.0.5", "cross-env": "^5.0.5",
"jquery": "^3.1.1", "jquery": "^3.1.1",

Binary file not shown.

BIN
public/js/dist/all.js vendored

Binary file not shown.

View file

@ -1,17 +1,14 @@
{ {
"/js/app.js": "/js/app.js?id=fe7b07afde38e7f94c81", "/js/build/vue.js": "/js/build/vue.js?id=96f90510b797ac27a94b",
"/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=f7a5d783fef321018f4c", "/css/AdminLTE.css": "/css/AdminLTE.css?id=5e72463a66acbcc740d5",
"/css/build/app.css": "/css/build/app.css?id=0dfc05b0fe1dcc9b6e3d", "/css/app.css": "/css/app.css?id=407edb63cc6b6dc62405",
"/css/all.css": "/css/all.css?id=9399418f7ce5805e3571", "/css/overrides.css": "/css/overrides.css?id=2d81c3704393bac77011",
"/css/blue.png": "/css/blue.png?id=4c85d6a97173123bd14a", "/js/build/vue.js.map": "/js/build/vue.js.map?id=423f16f63b86abd6b196",
"/css/blue@2x.png": "/css/blue@2x.png?id=62c67c6a822439e8a4ac", "/css/AdminLTE.css.map": "/css/AdminLTE.css.map?id=0be7790b84909dca6a0a",
"/css/skins/skin-green-dark.min.css": "/css/skins/skin-green-dark.min.css?id=1039ae0e198a7f3d8da7", "/css/app.css.map": "/css/app.css.map?id=96b5c985e860716e6a16",
"/css/skins/skin-orange-dark.min.css": "/css/skins/skin-orange-dark.min.css?id=9a461970f7ab07f40847", "/css/overrides.css.map": "/css/overrides.css.map?id=f7ce9ca49027594ac402",
"/css/skins/skin-red-dark.min.css": "/css/skins/skin-red-dark.min.css?id=99f90bbd653d7db10795", "/css/dist/all.css": "/css/dist/all.css?id=98db4e9b7650453c8b00",
"/css/signature-pad.css": "/css/signature-pad.css?id=6a89d3cd901305e66ced", "/js/dist/all.js": "/js/dist/all.js?id=114f1025a1b3e8975476",
"/css/signature-pad.min.css": "/css/signature-pad.min.css?id=6a89d3cd901305e66ced", "/css/build/all.css": "/css/build/all.css?id=98db4e9b7650453c8b00",
"/js/vendor.js": "/js/vendor.js?id=8bf903b80600aa42a9cb", "/js/build/all.js": "/js/build/all.js?id=114f1025a1b3e8975476"
"/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=bc5e33610f678021cc48",
"/js/dist/bootstrap-table-simple-view.js": "/js/dist/bootstrap-table-simple-view.js?id=3926b8f4aaad6ca20d31",
"/css/dist/bootstrap-table.css": "/css/dist/bootstrap-table.css?id=6b4ccfd094c065f065ae"
} }

View file

@ -73,7 +73,7 @@ pieOptions = {
//- END PIE CHART - //- END PIE CHART -
//----------------- //-----------------
var baseUrl = $('meta[name="baseUrl"]').attr('content');
(function($, settings) { (function($, settings) {
var Components = {}; var Components = {};
@ -126,7 +126,6 @@ $(document).ready(function () {
* Slideout help menu * Slideout help menu
*/ */
$('.slideout-menu-toggle').on('click', function(event){ $('.slideout-menu-toggle').on('click', function(event){
console.log('clicked');
event.preventDefault(); event.preventDefault();
// create menu variables // create menu variables
var slideoutMenu = $('.slideout-menu'); var slideoutMenu = $('.slideout-menu');

View file

@ -179,5 +179,8 @@ function formatDatalist (datalist) {
} }
function formatDataSelection (datalist) { function formatDataSelection (datalist) {
return datalist.text; return datalist.text.replace(/>/g, '&gt;')
.replace(/</g, '&lt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#039;');
} }

View file

@ -18,12 +18,12 @@ return array(
'click_to_confirm' => 'Please click on the following link to confirm your :web account:', 'click_to_confirm' => 'Please click on the following link to confirm your :web account:',
'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.', 'click_on_the_link_accessory' => 'Please click on the link at the bottom to confirm that you have received the accessory.',
'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.', 'click_on_the_link_asset' => 'Please click on the link at the bottom to confirm that you have received the asset.',
'Confirm_Asset_Checkin' => 'Confirm Asset Checkin.', 'Confirm_Asset_Checkin' => 'Asset checkin confirmation',
'Confirm_Accessory_Checkin' => 'Confirm Accessory Checkin.', 'Confirm_Accessory_Checkin' => 'Accessory checkin confirmation',
'Confirm_accessory_delivery' => 'Confirm accessory delivery.', 'Confirm_accessory_delivery' => 'Accessory delivery confirmation',
'Confirm_license_delivery' => 'Confirm license delivery.', 'Confirm_license_delivery' => 'License delivery confirmation',
'Confirm_asset_delivery' => 'Confirm asset delivery.', 'Confirm_asset_delivery' => 'Asset delivery confirmation',
'Confirm_consumable_delivery' => 'Confirm consumable delivery.', 'Confirm_consumable_delivery' => 'Consumable delivery confirmation',
'current_QTY' => 'Current QTY', 'current_QTY' => 'Current QTY',
'Days' => 'Days', 'Days' => 'Days',
'days' => 'Days', 'days' => 'Days',

View file

@ -86,10 +86,10 @@ return array(
'login_common_disabled_text' => 'Deshabilitar otros mecanismos de autenticación', 'login_common_disabled_text' => 'Deshabilitar otros mecanismos de autenticación',
'login_common_disabled_help' => 'Esta opción desactiva otros mecanismos de autenticación. Simplemente habilite esta opción si está seguro de que su inicio de sesión REMOTE_USER ya está funcionando', 'login_common_disabled_help' => 'Esta opción desactiva otros mecanismos de autenticación. Simplemente habilite esta opción si está seguro de que su inicio de sesión REMOTE_USER ya está funcionando',
'login_remote_user_custom_logout_url_text' => 'URL de cierre de sesión personalizado', 'login_remote_user_custom_logout_url_text' => 'URL de cierre de sesión personalizado',
'login_remote_user_custom_logout_url_help' => 'Si se proporciona una url aquí, los usuarios serán redirigidos a esta URL después de que el usuario cierre la sesión de Snipe-IT. Esto es útil para cerrar correctamente las sesiones de usuario de su proveedor de autenticación.', 'login_remote_user_custom_logout_url_help' => 'Sí se especifica un URL, los usuarios serán redireccionados a este URL una vez que cierren sesión en Snipe-TI. Esto es útil para cerrar sesiones de usuario de su Authentication Provider de forma correcta.',
'logo' => 'Logo', 'logo' => 'Logo',
'logo_print_assets' => 'Utilizar en impresión', 'logo_print_assets' => 'Usar en Impresión',
'logo_print_assets_help' => 'Utilice la marca en las listas de activos imprimibles ', 'logo_print_assets_help' => 'Usar marca en la lista imprimible de equipos',
'full_multiple_companies_support_help_text' => 'Usuarios restringidos (incluidos administradores) asignados a compañías de sus bienes de compañía.', 'full_multiple_companies_support_help_text' => 'Usuarios restringidos (incluidos administradores) asignados a compañías de sus bienes de compañía.',
'full_multiple_companies_support_text' => 'Soporte completo múltiple de compañías', 'full_multiple_companies_support_text' => 'Soporte completo múltiple de compañías',
'show_in_model_list' => 'Mostrar en Desplegado de Modelos', 'show_in_model_list' => 'Mostrar en Desplegado de Modelos',
@ -124,8 +124,8 @@ return array(
'snipe_version' => 'Version de Snipe-IT', 'snipe_version' => 'Version de Snipe-IT',
'support_footer' => 'Enlaces de Soporte de Pie de Página ', 'support_footer' => 'Enlaces de Soporte de Pie de Página ',
'support_footer_help' => 'Especifica quien ve los enlaces de información de Soporte y Manual de Usuarios de Snipe-IT', 'support_footer_help' => 'Especifica quien ve los enlaces de información de Soporte y Manual de Usuarios de Snipe-IT',
'version_footer' => 'Version in Footer ', 'version_footer' => 'Versión en pie de página ',
'version_footer_help' => 'Specify who sees the Snipe-IT version and build number.', 'version_footer_help' => 'Especificar quién ve la versión Snipe-IT y el número de compilación.',
'system' => 'Información del Sistema', 'system' => 'Información del Sistema',
'update' => 'Actualizar Parámetros', 'update' => 'Actualizar Parámetros',
'value' => 'Valor', 'value' => 'Valor',
@ -181,7 +181,7 @@ return array(
'bottom' => 'fondo', 'bottom' => 'fondo',
'vertical' => 'vertical', 'vertical' => 'vertical',
'horizontal' => 'horizontal', 'horizontal' => 'horizontal',
'unique_serial' => 'Unique serial numbers', 'unique_serial' => 'Números de serie únicos',
'unique_serial_help_text' => 'Checking this box will enforce a uniqueness constraint on asset serials', 'unique_serial_help_text' => 'Al marcar esta casilla se aplicará una restricción única en los seriales de los equipos',
'zerofill_count' => 'Longitud de etiquetas de activos, incluyendo relleno de ceros', 'zerofill_count' => 'Longitud de etiquetas de activos, incluyendo relleno de ceros',
); );

View file

@ -2,8 +2,8 @@
return array( return array(
'activated_help_text' => 'Este usuario puede ingresar', 'activated_help_text' => 'Este usuario puede iniciar sesión',
'activated_disabled_help_text' => 'No puedes editar el estado de activación de tu propia cuenta.', 'activated_disabled_help_text' => 'No puedes editar el estado de activación para tu propia cuenta.',
'assets_user' => 'Equipos asignados a :name', 'assets_user' => 'Equipos asignados a :name',
'bulk_update_warn' => 'Estás a punto de modificar las propiedades de :user_count usuarios. Por favor, ten en cuenta que no puedes modificar las propiedades de tu propio usuario con este formulario, y debes realizar las modificaciones a tu propio usuario de forma individual.', 'bulk_update_warn' => 'Estás a punto de modificar las propiedades de :user_count usuarios. Por favor, ten en cuenta que no puedes modificar las propiedades de tu propio usuario con este formulario, y debes realizar las modificaciones a tu propio usuario de forma individual.',
'bulk_update_help' => 'Este formulario permite actualizar múltiples usuarios simultáneamente. Rellena únicamente los campos que necesites cambiar. Cualquier campo que quede en blanco no se actualizará.', 'bulk_update_help' => 'Este formulario permite actualizar múltiples usuarios simultáneamente. Rellena únicamente los campos que necesites cambiar. Cualquier campo que quede en blanco no se actualizará.',

View file

@ -206,7 +206,7 @@
'unknown_admin' => 'Admin Desconocido', 'unknown_admin' => 'Admin Desconocido',
'username_format' => 'Formato del nombre de usuario', 'username_format' => 'Formato del nombre de usuario',
'update' => 'Actualizar', 'update' => 'Actualizar',
'upload_filetypes_help' => 'Algunos tipos de archivos permitidos son png, gif, jpg, jpeg, doc, docx, pdf, xls, txt, lic, zip, rtf y rar. Tamaño máximo permitido: :size.', 'upload_filetypes_help' => 'Tipos de archivo permitidos son png, gif, jpg, jpeg, doc, docx, pdf, xls, txt, lic, zip y rar. Tamaño máximo de carga permitido es: tamaño.',
'uploaded' => 'Subido', 'uploaded' => 'Subido',
'user' => 'Usuario', 'user' => 'Usuario',
'accepted' => 'aceptado', 'accepted' => 'aceptado',

View file

@ -58,8 +58,8 @@ return array(
'test_email' => 'Email de prueba de Snipe-IT', 'test_email' => 'Email de prueba de Snipe-IT',
'test_mail_text' => 'Esto es una prueba desde el sistema de gestión de activos de Snipe-IT. Si tienes esto, correo está funcionando :)', 'test_mail_text' => 'Esto es una prueba desde el sistema de gestión de activos de Snipe-IT. Si tienes esto, correo está funcionando :)',
'the_following_item' => 'El siguiente artículo ha sido devuelto: ', 'the_following_item' => 'El siguiente artículo ha sido devuelto: ',
'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.', 'low_inventory_alert' => 'Hay :count item por debajo del inventario mínimo o próximo a bajar.|Hay are :count elementos por debajo del inventario mínimo o próximos a bajar.',
'assets_warrantee_alert' => 'There is :count asset with a warrantee expiring in the next :threshold days.|There are :count assets with warrantees expiring in the next :threshold days.', 'assets_warrantee_alert' => 'Hay :count asiento de licencia que expira en los próximos :threshold días. | Hay :count asientos de licencias que expiran en los próximos :threshold días.',
'license_expiring_alert' => 'Hay :count licencia que expira en los próximos :threshold días. | Hay :count licencias que expiran en los próximos :threshold días.', 'license_expiring_alert' => 'Hay :count licencia que expira en los próximos :threshold días. | Hay :count licencias que expiran en los próximos :threshold días.',
'to_reset' => 'Para restaurar tu contraseña de :web, rellena este formulario:', 'to_reset' => 'Para restaurar tu contraseña de :web, rellena este formulario:',
'type' => 'Tipo', 'type' => 'Tipo',

View file

@ -5,8 +5,8 @@ return array(
'about_categories' => 'دستهها به شما کمک می کنند که موارد خود را سازماندهی کنید. بعضی از دسته های مثال ممکن است &quot;Desktops&quot;، &quot;Laptops&quot;، &quot; تلفنهای موبایل&quot;، &quot;Tablets&quot; و غیره باشد، اما شما می توانید از هر نوع دسته ای استفاده کنید که برای شما مناسب است.', 'about_categories' => 'دستهها به شما کمک می کنند که موارد خود را سازماندهی کنید. بعضی از دسته های مثال ممکن است &quot;Desktops&quot;، &quot;Laptops&quot;، &quot; تلفنهای موبایل&quot;، &quot;Tablets&quot; و غیره باشد، اما شما می توانید از هر نوع دسته ای استفاده کنید که برای شما مناسب است.',
'asset_categories' => 'دسته بندی های دارایی', 'asset_categories' => 'دسته بندی های دارایی',
'category_name' => 'نام دسته بندی', 'category_name' => 'نام دسته بندی',
'checkin_email' => 'Send email to user on checkin/checkout.', 'checkin_email' => 'ارسال ایمیل به کاربر در تحویل و استرداد.',
'checkin_email_notification' => 'This user will be sent an email on checkin/checkout.', 'checkin_email_notification' => 'به این کاربر در تحویل و استرداد ایمیل ارسال خواهد شد.',
'clone' => 'دسته بندی کلون', 'clone' => 'دسته بندی کلون',
'create' => 'ایجاد دسته جدید', 'create' => 'ایجاد دسته جدید',
'edit' => 'ویرایش دسته‌ بندی', 'edit' => 'ویرایش دسته‌ بندی',

View file

@ -5,7 +5,7 @@ return array(
'about_assets_text' => 'دارایی ها مواردی هستند که توسط شماره سریال یا برچسب دارایی دنبال می شوند. آنها تمایل دارند که مقادیر ارزش بیشتری داشته باشند که در آن شناسایی یک مورد خاص موردنیاز باشد.', 'about_assets_text' => 'دارایی ها مواردی هستند که توسط شماره سریال یا برچسب دارایی دنبال می شوند. آنها تمایل دارند که مقادیر ارزش بیشتری داشته باشند که در آن شناسایی یک مورد خاص موردنیاز باشد.',
'archived' => 'بایگانی شد', 'archived' => 'بایگانی شد',
'asset' => 'دارایی', 'asset' => 'دارایی',
'bulk_checkout' => 'Checkout Assets', 'bulk_checkout' => 'خروج دارایی ها',
'checkin' => 'دارایی checkin', 'checkin' => 'دارایی checkin',
'checkout' => 'دارایی پرداخت', 'checkout' => 'دارایی پرداخت',
'clone' => 'دارایی شگرف', 'clone' => 'دارایی شگرف',

View file

@ -62,7 +62,7 @@ return array(
'success' => 'دارایی را بررسی کنید موفقیت.', 'success' => 'دارایی را بررسی کنید موفقیت.',
'user_does_not_exist' => 'کاربر نامعتبر است لطفا دوباره امتحان کنید.', 'user_does_not_exist' => 'کاربر نامعتبر است لطفا دوباره امتحان کنید.',
'not_available' => 'این دارایی برای پرداخت در دسترس نیست!', 'not_available' => 'این دارایی برای پرداخت در دسترس نیست!',
'no_assets_selected' => 'You must select at least one asset from the list' 'no_assets_selected' => 'شما حداقل باید یک دارایی از لیست انتخاب کنید'
), ),
'checkin' => array( 'checkin' => array(

View file

@ -21,7 +21,7 @@ return array(
'Confirm_Asset_Checkin' => 'تأیید بازرسی دارایی', 'Confirm_Asset_Checkin' => 'تأیید بازرسی دارایی',
'Confirm_Accessory_Checkin' => 'تأیید تأیید تأیید', 'Confirm_Accessory_Checkin' => 'تأیید تأیید تأیید',
'Confirm_accessory_delivery' => 'تأیید تحویل کالا', 'Confirm_accessory_delivery' => 'تأیید تحویل کالا',
'Confirm_license_delivery' => 'Confirm license delivery.', 'Confirm_license_delivery' => 'تأیید تحویل سریال.',
'Confirm_asset_delivery' => 'تأیید تحویل دارایی', 'Confirm_asset_delivery' => 'تأیید تحویل دارایی',
'Confirm_consumable_delivery' => 'تأیید تحویل قابل مصرف', 'Confirm_consumable_delivery' => 'تأیید تحویل قابل مصرف',
'current_QTY' => 'QTY فعلی', 'current_QTY' => 'QTY فعلی',
@ -52,7 +52,7 @@ return array(
'requested' => 'درخواست شده:', 'requested' => 'درخواست شده:',
'reset_link' => 'رمز عبور خود را بازنشانی کنید', 'reset_link' => 'رمز عبور خود را بازنشانی کنید',
'reset_password' => 'برای تغییر رمز عبور اینجا کلیک کنید:', 'reset_password' => 'برای تغییر رمز عبور اینجا کلیک کنید:',
'serial' => 'Serial', 'serial' => 'سریال',
'supplier' => 'تامین کننده', 'supplier' => 'تامین کننده',
'tag' => 'برچسب', 'tag' => 'برچسب',
'test_email' => 'ایمیل تست از Snipe-IT', 'test_email' => 'ایمیل تست از Snipe-IT',
@ -63,8 +63,8 @@ return array(
'license_expiring_alert' => 'There is :count license expiring in the next :threshold days.|There are :count licenses expiring in the next :threshold days.', 'license_expiring_alert' => 'There is :count license expiring in the next :threshold days.|There are :count licenses expiring in the next :threshold days.',
'to_reset' => 'برای بازنشانی: رمز عبور وب، این فرم را تکمیل کنید:', 'to_reset' => 'برای بازنشانی: رمز عبور وب، این فرم را تکمیل کنید:',
'type' => 'تایپ کنید', 'type' => 'تایپ کنید',
'user' => 'User', 'user' => 'کاربر',
'username' => 'Username', 'username' => 'نام کاربری',
'welcome' => 'خوش آمدید نام', 'welcome' => 'خوش آمدید نام',
'welcome_to' => 'به وب سایت خوش آمدید', 'welcome_to' => 'به وب سایت خوش آمدید',
'your_credentials' => 'مدارک Snipe-IT شما', 'your_credentials' => 'مدارک Snipe-IT شما',

View file

@ -2,6 +2,6 @@
return [ return [
'sent' => 'لینک رمز عبور شما ارسال شده است!', 'sent' => 'لینک رمز عبور شما ارسال شده است!',
'user' => 'No matching active user found with that email.', 'user' => 'هیچ کاربر فعالی با این آدرس ایمیل یافت نشد.',
]; ];

View file

@ -5,8 +5,8 @@ return array(
'about_categories' => 'Les catégories vous aident à organiser vos items. Des exemples de catégories peuvent être "Ordinateurs de bureau", "Ordinateurs portables", "Téléphones portables", "Tablettes", etc..., mais vous pouvez utiliser les catégories comme cela vous convient.', 'about_categories' => 'Les catégories vous aident à organiser vos items. Des exemples de catégories peuvent être "Ordinateurs de bureau", "Ordinateurs portables", "Téléphones portables", "Tablettes", etc..., mais vous pouvez utiliser les catégories comme cela vous convient.',
'asset_categories' => 'Catégories', 'asset_categories' => 'Catégories',
'category_name' => 'Catégorie', 'category_name' => 'Catégorie',
'checkin_email' => 'Send email to user on checkin/checkout.', 'checkin_email' => 'Envoyer un courriel à l\'utilisateur lors de l\'association/dissociation.',
'checkin_email_notification' => 'This user will be sent an email on checkin/checkout.', 'checkin_email_notification' => 'Un courriel sera envoyé à l\'utilisateur lors de l\'association/dissociation.',
'clone' => 'Cloner la catégorie', 'clone' => 'Cloner la catégorie',
'create' => 'Créer Catégorie', 'create' => 'Créer Catégorie',
'edit' => 'Modifier la catégorie', 'edit' => 'Modifier la catégorie',

View file

@ -5,7 +5,7 @@ return array(
'ad_domain' => 'Domaine du service d\'annuaire', 'ad_domain' => 'Domaine du service d\'annuaire',
'ad_domain_help' => 'C\'est parfois le même que votre domaine d\'e-mail, mais pas toujours.', 'ad_domain_help' => 'C\'est parfois le même que votre domaine d\'e-mail, mais pas toujours.',
'admin_cc_email' => 'CC Email', 'admin_cc_email' => 'CC Email',
'admin_cc_email_help' => 'If you would like to send a copy of checkin/checkout emails that are sent to users to an additional email account, enter it here. Otherwise leave this field blank.', 'admin_cc_email_help' => 'Si vous souhaitez envoyer une copie des courriels d\'association/dissociation qui sont envoyés aux utilisateurs à un compte de messagerie supplémentaire, entrez-le ici. Sinon, laissez ce champ vide.',
'is_ad' => 'C\'est un serveur Active Directory', 'is_ad' => 'C\'est un serveur Active Directory',
'alert_email' => 'Envoyer les alertes à', 'alert_email' => 'Envoyer les alertes à',
'alerts_enabled' => 'Alertes activées', 'alerts_enabled' => 'Alertes activées',
@ -26,9 +26,9 @@ return array(
'custom_css' => 'CSS personnalisé', 'custom_css' => 'CSS personnalisé',
'custom_css_help' => 'Entrez les codes CSS personnalisé que vous souhaitez utiliser . Ne pas inclure les balises &lt;style&gt;&lt;/style&gt;.', 'custom_css_help' => 'Entrez les codes CSS personnalisé que vous souhaitez utiliser . Ne pas inclure les balises &lt;style&gt;&lt;/style&gt;.',
'custom_forgot_pass_url' => 'URL personnalisé de réinitialisation du mot de passe', 'custom_forgot_pass_url' => 'URL personnalisé de réinitialisation du mot de passe',
'custom_forgot_pass_url_help' => 'This replaces the built-in forgotten password URL on the login screen, useful to direct people to internal or hosted LDAP password reset functionality. It will effectively disable local user forgotten password functionality.', 'custom_forgot_pass_url_help' => 'Ceci remplace l\'URL de mot de passe intégré oublié sur la page d\'accueil, utile pour rediriger les utilisateurs vers la fonctionnalité de réinitialisation de mot de passe interne ou de serveur LDAP. Cela va désactiver la fonctionnalité du mot de passe oublié au niveau local.',
'dashboard_message' => 'Message du tableau de bord', 'dashboard_message' => 'Message du tableau de bord',
'dashboard_message_help' => 'This text will appear on the dashboard for anyone with permission to view the dashboard.', 'dashboard_message_help' => 'Ce texte apparaît sur le tableau de bord pour toute personne ayant le droit de le voir.',
'default_currency' => 'Devise par défaut', 'default_currency' => 'Devise par défaut',
'default_eula_text' => 'Licence d\'utilisation par défaut', 'default_eula_text' => 'Licence d\'utilisation par défaut',
'default_language' => 'Langue par défaut', 'default_language' => 'Langue par défaut',
@ -43,7 +43,7 @@ return array(
'eula_settings' => 'Configuration pour les licences d\'utilisation', 'eula_settings' => 'Configuration pour les licences d\'utilisation',
'eula_markdown' => 'Cette licence d\'utilisation permet l\'utilisation des <a href="https://help.github.com/articles/github-flavored-markdown/">"Github flavored markdown"</a>.', 'eula_markdown' => 'Cette licence d\'utilisation permet l\'utilisation des <a href="https://help.github.com/articles/github-flavored-markdown/">"Github flavored markdown"</a>.',
'footer_text' => 'Texte supplémentaire en pied de page ', 'footer_text' => 'Texte supplémentaire en pied de page ',
'footer_text_help' => 'This text will appear in the right-side footer. Links are allowed using <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>. Line breaks, headers, images, etc may result in unpredictable results.', 'footer_text_help' => 'Ce texte apparaîtra dans le pied de page de droitre. Les liens sont autorisés en utilisant <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>. Les sauts de ligne, les en-têtes, les images, etc. peuvent entraîner des résultats imprévisibles.',
'general_settings' => 'Configuration générale', 'general_settings' => 'Configuration générale',
'generate_backup' => 'Générer une sauvegarde', 'generate_backup' => 'Générer une sauvegarde',
'header_color' => 'Couleur de l\'en-tête', 'header_color' => 'Couleur de l\'en-tête',
@ -52,8 +52,8 @@ return array(
'ldap_enabled' => 'LDAP activé', 'ldap_enabled' => 'LDAP activé',
'ldap_integration' => 'Intégration LDAP', 'ldap_integration' => 'Intégration LDAP',
'ldap_settings' => 'Paramètres LDAP', 'ldap_settings' => 'Paramètres LDAP',
'ldap_login_test_help' => 'Enter a valid LDAP username and password from the base DN you specified above to test whether your LDAP login is configured correctly. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.', 'ldap_login_test_help' => 'Entrez un nom d\'utilisateur et mot de passe LDAP valide depuis la base DN que vous avez spécifié ci-dessus afin de tester si votre configuration LDAP est correcte. VOUS DEVEZ D\'ABORD ENREGISTRER VOS PARAMÈTRES LDAP MIS À JOUR.',
'ldap_login_sync_help' => 'This only tests that LDAP can sync correctly. If your LDAP Authentication query is not correct, users may still not be able to login. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.', 'ldap_login_sync_help' => 'Ceci vérifie uniquement que LDAP se synchronise correctement. Si votre requête d\'authentification LDAP est incorrecte, les utilisateurs peuvent ne pas pouvoir se connecter. VOUS DEVEZ D\'ABORD ENREGISTRER VOS PARAMÈTRES LDAP MIS À JOUR.',
'ldap_server' => 'Serveur LDAP', 'ldap_server' => 'Serveur LDAP',
'ldap_server_help' => 'Ca devrait commencer par ldap:// (non crypté ou TLS) ou ldaps:// (SSL)', 'ldap_server_help' => 'Ca devrait commencer par ldap:// (non crypté ou TLS) ou ldaps:// (SSL)',
'ldap_server_cert' => 'Validation du certificat SSL LDAP', 'ldap_server_cert' => 'Validation du certificat SSL LDAP',
@ -81,18 +81,18 @@ return array(
'login_note' => 'Note de connexion', 'login_note' => 'Note de connexion',
'login_note_help' => 'Ajoutez éventuellement quelques phrases sur votre écran de connexion, par exemple pour aider les personnes ayant trouvé un appareil perdu ou volé. Ce champ accepte <a href="https://help.github.com/articles/github-flavored-markdown/">Github aromatisé markdown</a>', 'login_note_help' => 'Ajoutez éventuellement quelques phrases sur votre écran de connexion, par exemple pour aider les personnes ayant trouvé un appareil perdu ou volé. Ce champ accepte <a href="https://help.github.com/articles/github-flavored-markdown/">Github aromatisé markdown</a>',
'login_remote_user_text' => 'Options de connexion de l\'utilisateur à distance', 'login_remote_user_text' => 'Options de connexion de l\'utilisateur à distance',
'login_remote_user_enabled_text' => 'Enable Login with Remote User Header', 'login_remote_user_enabled_text' => 'Activer la connexion avec l\'en-tête utilisateur distant',
'login_remote_user_enabled_help' => 'This option enables Authentication via the REMOTE_USER header according to the "Common Gateway Interface (rfc3875)"', 'login_remote_user_enabled_help' => 'Cette option active l\'authentification via l\'en-tête REMOTE_USER selon l\'interface "Common Gateway Interface" (rfc3875)"',
'login_common_disabled_text' => 'Disable other authentication mechanisms', 'login_common_disabled_text' => 'Désactiver les autres mécanismes d\'authentification',
'login_common_disabled_help' => 'This option disables other authentication mechanisms. Just enable this option if you are sure that your REMOTE_USER login is already working', 'login_common_disabled_help' => 'Cette option désactive les autres mécanismes d\'authentification. N\'activez cette option que si vous êtes sûr que votre login REMOTE_USER fonctionne déjà',
'login_remote_user_custom_logout_url_text' => 'URL personnalisé de déconnexion', 'login_remote_user_custom_logout_url_text' => 'URL personnalisé de déconnexion',
'login_remote_user_custom_logout_url_help' => 'If a url is provided here, users will get redirected to this URL after the user logs out of Snipe-IT. This is useful to close the user sessions of your Authentication provider correctly.', 'login_remote_user_custom_logout_url_help' => 'Si une URL est spécifiée ici, les utilisateurs seront redirigés vers cette URL après la déconnexion de Snipe-IT. Ceci est utile pour fermer correctement les sessions utilisateur de votre fournisseur d\'authentification.',
'logo' => 'Logo', 'logo' => 'Logo',
'logo_print_assets' => 'Use in Print', 'logo_print_assets' => 'Utiliser dans les impressions',
'logo_print_assets_help' => 'Use branding on printable asset lists ', 'logo_print_assets_help' => 'Utiliser la marque dans les listes imprimables des actifs ',
'full_multiple_companies_support_help_text' => 'Restreindre les utilisateurs (admins compris) assignés à des organisations aux biens de leur propre organisation.', 'full_multiple_companies_support_help_text' => 'Restreindre les utilisateurs (admins compris) assignés à des organisations aux biens de leur propre organisation.',
'full_multiple_companies_support_text' => 'Support complet des organisations multiples', 'full_multiple_companies_support_text' => 'Support complet des organisations multiples',
'show_in_model_list' => 'Show in Model Dropdowns', 'show_in_model_list' => 'Afficher dans la liste déroulante des modèles',
'optional' => 'facultatif', 'optional' => 'facultatif',
'per_page' => 'Résultats par page', 'per_page' => 'Résultats par page',
'php' => 'Version de PHP', 'php' => 'Version de PHP',
@ -108,24 +108,24 @@ return array(
'qr_text' => 'Texte du QR Code', 'qr_text' => 'Texte du QR Code',
'setting' => 'Paramètre', 'setting' => 'Paramètre',
'settings' => 'Paramètres', 'settings' => 'Paramètres',
'show_alerts_in_menu' => 'Show alerts in top menu', 'show_alerts_in_menu' => 'Afficher les alertes dans le menu du haut',
'show_archived_in_list' => 'Archived Assets', 'show_archived_in_list' => 'Actifs archivés',
'show_archived_in_list_text' => 'Show archived assets in the "all assets" listing', 'show_archived_in_list_text' => 'Afficher les actifs archivés dans la liste "Tous les actifs"',
'show_images_in_email' => 'Show images in emails', 'show_images_in_email' => 'Afficher les images dans les courriels',
'show_images_in_email_help' => 'Uncheck this box if your Snipe-IT installation is behind a VPN or closed network and users outside the network will not be able to load images served from this installation in their emails.', 'show_images_in_email_help' => 'Décocher cette case si votre installation de Snipe-IT est derrière un VPN ou un réseau fermé et que les utilisateurs en dehors du réseau ne peuvent pas charger les images servies depuis cette installation dans leurs courriels.',
'site_name' => 'Nom du site', 'site_name' => 'Nom du site',
'slack_botname' => 'Slack Botname', 'slack_botname' => 'Slack Botname',
'slack_channel' => 'Slack Channel', 'slack_channel' => 'Slack Channel',
'slack_endpoint' => 'Slack Endpoint', 'slack_endpoint' => 'Slack Endpoint',
'slack_integration' => 'Configuration "Slack"', 'slack_integration' => 'Configuration "Slack"',
'slack_integration_help' => 'L\'intégration de Slack est facultative, mai le "endpoint" et le "channel" sont nécessaires pour son utilisation. Pour configurer l\'intégration Slack, vous devez d\'abord <a href=":slack_link" target="_new">créer un "incoming webhook"</a> dans votre compte Slack.', 'slack_integration_help' => 'L\'intégration de Slack est facultative, mai le "endpoint" et le "channel" sont nécessaires pour son utilisation. Pour configurer l\'intégration Slack, vous devez d\'abord <a href=":slack_link" target="_new">créer un "incoming webhook"</a> dans votre compte Slack.',
'slack_integration_help_button' => 'Once you have saved your Slack information, a test button will appear.', 'slack_integration_help_button' => 'Une fois que vous avez enregistré vos informations Slack, un bouton de test apparaîtra.',
'slack_test_help' => 'Test whether your Slack integration is configured correctly. YOU MUST SAVE YOUR UPDATED SLACK SETTINGS FIRST.', 'slack_test_help' => 'Testez si votre intégration Slack est correctement configurée. VOUS DEVEZ D\'ABORD ENREGISTRER LES PARAMÈTRES DE SLACK MIS À JOUR.',
'snipe_version' => 'Version de Snipe-IT', 'snipe_version' => 'Version de Snipe-IT',
'support_footer' => 'Support Footer Links ', 'support_footer' => 'Support des liens de pied de page ',
'support_footer_help' => 'Specify who sees the links to the Snipe-IT Support info and Users Manual', 'support_footer_help' => 'Spécifiez qui voit les liens vers les manuels de support utilisateur Snipe-IT',
'version_footer' => 'Version in Footer ', 'version_footer' => 'Version en pied de page ',
'version_footer_help' => 'Specify who sees the Snipe-IT version and build number.', 'version_footer_help' => 'Spécifiez qui peut voir la version de Snipe-IT.',
'system' => 'Information du système', 'system' => 'Information du système',
'update' => 'Mettre à jour les paramètres', 'update' => 'Mettre à jour les paramètres',
'value' => 'Valeur', 'value' => 'Valeur',
@ -136,9 +136,9 @@ return array(
'label_dimensions' => 'Dimensions de l\'étiquette (en pouces)', 'label_dimensions' => 'Dimensions de l\'étiquette (en pouces)',
'next_auto_tag_base' => 'Incrément automatique suivant', 'next_auto_tag_base' => 'Incrément automatique suivant',
'page_padding' => 'Marges de la page (en pouces)', 'page_padding' => 'Marges de la page (en pouces)',
'privacy_policy_link' => 'Link to Privacy Policy', 'privacy_policy_link' => 'Lien vers la politique de confidentialité',
'privacy_policy' => 'Privacy Policy', 'privacy_policy' => 'Politique de confidentialité',
'privacy_policy_link_help' => 'If a url is included here, a link to your privacy policy will be included in the app footer and in any emails that the system sends out, in compliance with GDPR. ', 'privacy_policy_link_help' => 'Si une url est incluse ici, un lien vers votre politique de confidentialité sera inclus dans le pied de page de l\'application et dans tous les courriels que le système envoie, conformément au RGPD. ',
'purge' => 'Purger les enregistrements supprimés', 'purge' => 'Purger les enregistrements supprimés',
'labels_display_bgutter' => 'Etiquette de la gouttière du bas', 'labels_display_bgutter' => 'Etiquette de la gouttière du bas',
'labels_display_sgutter' => 'Etiquette de la gouttière latérale', 'labels_display_sgutter' => 'Etiquette de la gouttière latérale',
@ -181,7 +181,7 @@ return array(
'bottom' => 'bas', 'bottom' => 'bas',
'vertical' => 'veritcal', 'vertical' => 'veritcal',
'horizontal' => 'horizontal', 'horizontal' => 'horizontal',
'unique_serial' => 'Unique serial numbers', 'unique_serial' => 'Numéros de série uniques',
'unique_serial_help_text' => 'Checking this box will enforce a uniqueness constraint on asset serials', 'unique_serial_help_text' => 'Cocher cette case forcera une contrainte d\'unicité sur les identifiants d\'actif',
'zerofill_count' => 'Longueur des étiquettes de bien, incluant le remplissage de zéros', 'zerofill_count' => 'Longueur des étiquettes de bien, incluant le remplissage de zéros',
); );

View file

@ -6,7 +6,7 @@ return array(
'create' => 'Créé une étiquette de statut', 'create' => 'Créé une étiquette de statut',
'color' => 'Couleur du graphique', 'color' => 'Couleur du graphique',
'default_label' => 'Libellé par défaut', 'default_label' => 'Libellé par défaut',
'default_label_help' => 'This is used to ensure your most commonly used status labels appear at the top of the select box when creating/editing assets.', 'default_label_help' => 'Ceci est utilisé pour s\'assurer que vos étiquettes de statut les plus couramment utilisées apparaissent en haut de la case de sélection lors de la création/l\'édition des actifs.',
'deployable' => 'Déployable', 'deployable' => 'Déployable',
'info' => 'Les étiquettes d\'état sont utilisés pour décrire les différents états de vos actifs. Ils peuvent être pour réparation , perdu / volé , etc. Vous pouvez créer de nouvelles étiquettes d\'état pour déployable , en attente et actifs retirés.', 'info' => 'Les étiquettes d\'état sont utilisés pour décrire les différents états de vos actifs. Ils peuvent être pour réparation , perdu / volé , etc. Vous pouvez créer de nouvelles étiquettes d\'état pour déployable , en attente et actifs retirés.',
'name' => 'Nom du statut', 'name' => 'Nom du statut',

View file

@ -39,8 +39,8 @@
'checkin' => 'Dissocier', 'checkin' => 'Dissocier',
'checkin_from' => 'Dissocier de', 'checkin_from' => 'Dissocier de',
'checkout' => 'Associer', 'checkout' => 'Associer',
'checkouts_count' => 'Checkouts', 'checkouts_count' => 'Associations',
'checkins_count' => 'Checkins', 'checkins_count' => 'Dissociations',
'user_requests_count' => 'Demandes', 'user_requests_count' => 'Demandes',
'city' => 'Ville', 'city' => 'Ville',
'click_here' => 'Cliquez ici', 'click_here' => 'Cliquez ici',
@ -94,7 +94,7 @@
'file_name' => 'Fichier', 'file_name' => 'Fichier',
'file_uploads' => 'Uploads de fichiers', 'file_uploads' => 'Uploads de fichiers',
'generate' => 'Générer', 'generate' => 'Générer',
'github_markdown' => 'This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.', 'github_markdown' => 'Ce champ accepte <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
'groups' => 'Groupes', 'groups' => 'Groupes',
'gravatar_email' => 'E-mail adresse Gravatar', 'gravatar_email' => 'E-mail adresse Gravatar',
'history' => 'Historique', 'history' => 'Historique',
@ -103,7 +103,7 @@
'image' => 'Image', 'image' => 'Image',
'image_delete' => 'Supprimer l\'image', 'image_delete' => 'Supprimer l\'image',
'image_upload' => 'Charger une image', 'image_upload' => 'Charger une image',
'image_filetypes_help' => 'Accepted filetypes are jpg, png, gif, and svg. Max upload size allowed is :size.', 'image_filetypes_help' => 'Les types de fichiers acceptés sont jpg, png, gif et svg. La taille maximale autorisée est :size.',
'import' => 'Importer', 'import' => 'Importer',
'import-history' => 'Importer l\'historique', 'import-history' => 'Importer l\'historique',
'asset_maintenance' => 'Gestion des actifs', 'asset_maintenance' => 'Gestion des actifs',
@ -185,7 +185,7 @@
'show_current' => 'Show Current', 'show_current' => 'Show Current',
'sign_in' => 'Connexion', 'sign_in' => 'Connexion',
'signature' => 'Signature', 'signature' => 'Signature',
'skin' => 'Skin', 'skin' => 'Habillage',
'some_features_disabled' => 'MODE DEMO: Certaines fonctionnalités sont désactivées pour cette installation.', 'some_features_disabled' => 'MODE DEMO: Certaines fonctionnalités sont désactivées pour cette installation.',
'site_name' => 'Nom du Site', 'site_name' => 'Nom du Site',
'state' => 'État', 'state' => 'État',

View file

@ -58,9 +58,9 @@ return array(
'test_email' => 'Email test de Snipe-IT', 'test_email' => 'Email test de Snipe-IT',
'test_mail_text' => 'Il s\'agit d\'un test du système de gestion d\'actifs Snipe-IT. Si vous avez obtenu cela, le courrier fonctionne :)', 'test_mail_text' => 'Il s\'agit d\'un test du système de gestion d\'actifs Snipe-IT. Si vous avez obtenu cela, le courrier fonctionne :)',
'the_following_item' => 'L\'élément suivant a été enregistré : ', 'the_following_item' => 'L\'élément suivant a été enregistré : ',
'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.', 'low_inventory_alert' => 'Il y a :count item qui est en dessous du minimum d\'inventaire ou qui sera bas sous peu.|Il y a :count articles qui sont en dessous du minimum d\'inventaire ou qui seront bas sous peu.',
'assets_warrantee_alert' => 'There is :count asset with a warrantee expiring in the next :threshold days.|There are :count assets with warrantees expiring in the next :threshold days.', 'assets_warrantee_alert' => 'Il y a :count actifs avec une garantie expirant dans les prochains :threshold jours.|Il y a :count actifs avec des garanties expirant dans les prochains :threshold jours.',
'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' => 'Il y a :count licence expirant dans les prochains :threshold jours.|Il y a :count licences expirant dans les prochains :threshold jours.',
'to_reset' => 'Pour réinitialiser votre mot de passe :web, complétez ce formulaire:', 'to_reset' => 'Pour réinitialiser votre mot de passe :web, complétez ce formulaire:',
'type' => 'Type ', 'type' => 'Type ',
'user' => 'Utilisateur', 'user' => 'Utilisateur',

View file

@ -2,6 +2,6 @@
return [ return [
'sent' => 'Le lien vers votre mot de passe a bien été envoyé!', 'sent' => 'Le lien vers votre mot de passe a bien été envoyé!',
'user' => 'No matching active user found with that email.', 'user' => 'Aucun utilisateur actif correspondant trouvé avec ce courriel.',
]; ];

View file

@ -5,8 +5,8 @@ return array(
'about_categories' => 'A kategóriák segítenek rendezni a dolgait. Néhány példa kategória lehet "Desktop-ok", "Laptopok", "Mobiltelefonok", "Tabletek", és így tovább, de bármilyen más kategóriát használhat, ami releváns önnek.', 'about_categories' => 'A kategóriák segítenek rendezni a dolgait. Néhány példa kategória lehet "Desktop-ok", "Laptopok", "Mobiltelefonok", "Tabletek", és így tovább, de bármilyen más kategóriát használhat, ami releváns önnek.',
'asset_categories' => 'Eszköz kategóriák', 'asset_categories' => 'Eszköz kategóriák',
'category_name' => 'Kategória név', 'category_name' => 'Kategória név',
'checkin_email' => 'E-mail küldés a felhasználónak, eszköz kiadás / visszavétel esetén.', 'checkin_email' => 'E-mail küldése a felhasználónak, eszköz kiadás / visszavétel esetén.',
'checkin_email_notification' => 'Ez afelhasználó e-mailben lesz értesítve eszköz kiadás / visszavétel esetén.', 'checkin_email_notification' => 'Ez a felhasználó e-mailben lesz értesítve eszköz kiadás / visszavétel esetén.',
'clone' => 'Kategória klónozása', 'clone' => 'Kategória klónozása',
'create' => 'Kategória létrehozása', 'create' => 'Kategória létrehozása',
'edit' => 'Kategória szerkesztése', 'edit' => 'Kategória szerkesztése',

View file

@ -89,8 +89,8 @@ return array(
'login_remote_user_custom_logout_url_help' => 'ユーザがログアウトした場合、このURLにリダイレクトします。 'login_remote_user_custom_logout_url_help' => 'ユーザがログアウトした場合、このURLにリダイレクトします。
これは認証プロバイダのセッションを正しく終了させる場合に便利です。', これは認証プロバイダのセッションを正しく終了させる場合に便利です。',
'logo' => 'ロゴ', 'logo' => 'ロゴ',
'logo_print_assets' => 'Use in Print', 'logo_print_assets' => '印刷に使用',
'logo_print_assets_help' => 'Use branding on printable asset lists ', 'logo_print_assets_help' => '印刷可能な資産リストにブランドを使用する。 ',
'full_multiple_companies_support_help_text' => 'ユーザー (管理者を含む) に 資産の割り当て を制限します。', 'full_multiple_companies_support_help_text' => 'ユーザー (管理者を含む) に 資産の割り当て を制限します。',
'full_multiple_companies_support_text' => '複数企業をサポートします。', 'full_multiple_companies_support_text' => '複数企業をサポートします。',
'show_in_model_list' => 'モデルのドロップダウンに表示', 'show_in_model_list' => 'モデルのドロップダウンに表示',

View file

@ -5,8 +5,8 @@ return array(
'about_categories' => 'Kategorijos padeda jums tvarkyti savo daiktus. Kai kurių pavyzdžių kategorijos gali būti &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobilieji telefonai&quot;, &quot;Tablets&quot; ir tt, bet jūs galite naudoti kategorijas bet kokiu būdu, kuris jums yra naudingas.', 'about_categories' => 'Kategorijos padeda jums tvarkyti savo daiktus. Kai kurių pavyzdžių kategorijos gali būti &quot;Desktops&quot;, &quot;Laptops&quot;, &quot;Mobilieji telefonai&quot;, &quot;Tablets&quot; ir tt, bet jūs galite naudoti kategorijas bet kokiu būdu, kuris jums yra naudingas.',
'asset_categories' => 'Įrangos kategorijos', 'asset_categories' => 'Įrangos kategorijos',
'category_name' => 'Kategorijos pavadinimas', 'category_name' => 'Kategorijos pavadinimas',
'checkin_email' => 'Send email to user on checkin/checkout.', 'checkin_email' => 'Siųsti el. laišką vartotojui gavus/priskyrus.',
'checkin_email_notification' => 'This user will be sent an email on checkin/checkout.', 'checkin_email_notification' => 'Šis vartotojas gaus el. Laišką registracijos / išrašymo metu (paskyrimas).',
'clone' => 'Kopijuoti kategoriją', 'clone' => 'Kopijuoti kategoriją',
'create' => 'Sukurti kategoriją', 'create' => 'Sukurti kategoriją',
'edit' => 'Keisti kategoriją', 'edit' => 'Keisti kategoriją',

View file

@ -20,7 +20,7 @@ return array(
'field_element_short' => 'Elementas', 'field_element_short' => 'Elementas',
'field_format' => 'Formatas', 'field_format' => 'Formatas',
'field_custom_format' => 'Pritaikomas formatas', 'field_custom_format' => 'Pritaikomas formatas',
'field_custom_format_help' => 'This field allows you to use a regex expression for validation. It should start with "regex:" - for example, to validate that a custom field value contains a valid IMEI (15 numeric digits), you would use <code>regex:/^[0-9]{15}$/</code>.', 'field_custom_format_help' => 'Šis laukelis leidžia Jums naudoti REGEX validaciją. Tai turėtų prasidėti "regax:" - pavyzdžiui norint validuoti pasirinkto laukelio reikšmę IMEI (15 skaičių), privalote naudoti <code>regex:/^[0-9]{15}$/</code>.',
'required' => 'Privalomas', 'required' => 'Privalomas',
'req' => 'Privaloma.', 'req' => 'Privaloma.',
'used_by_models' => 'Naudojama modelių', 'used_by_models' => 'Naudojama modelių',
@ -28,5 +28,5 @@ return array(
'create_fieldset' => 'Nauja laukų grupė', 'create_fieldset' => 'Nauja laukų grupė',
'create_field' => 'Naujas pritaikomas laukelis', 'create_field' => 'Naujas pritaikomas laukelis',
'value_encrypted' => 'Šio lauko vertė yra užkoduota duomenų bazėje. Tik admin vartotojai galės peržiūrėti iššifruotą vertę', 'value_encrypted' => 'Šio lauko vertė yra užkoduota duomenų bazėje. Tik admin vartotojai galės peržiūrėti iššifruotą vertę',
'show_in_email' => 'Include the value of this field in checkout emails sent to the user? Encrypted fields cannot be included in emails.', 'show_in_email' => 'Įterptos šio laukelio išdavimo reikšmės bus siunčiamos vartotojams? Užšifruoti laukai negali būti įterpti į el. laišką.',
); );

View file

@ -38,7 +38,7 @@ return array(
'tag' => 'Įrangos pavadinimas', 'tag' => 'Įrangos pavadinimas',
'update' => 'Įrangos atnaujinimas', 'update' => 'Įrangos atnaujinimas',
'warranty' => 'Garantija', 'warranty' => 'Garantija',
'warranty_expires' => 'Warranty Expires', 'warranty_expires' => 'Garantija baigiasi',
'years' => 'metai', 'years' => 'metai',
) )
; ;

View file

@ -5,7 +5,7 @@ return array(
'about_assets_text' => 'Turtas - tai daiktai, kurie stebimi serijos numeriu arba turinio žyma. Jie dažniausiai būna vertingesni dalykai, kai svarbu nustatyti konkretų elementą.', 'about_assets_text' => 'Turtas - tai daiktai, kurie stebimi serijos numeriu arba turinio žyma. Jie dažniausiai būna vertingesni dalykai, kai svarbu nustatyti konkretų elementą.',
'archived' => 'Archyvuota', 'archived' => 'Archyvuota',
'asset' => 'Įranga', 'asset' => 'Įranga',
'bulk_checkout' => 'Checkout Assets', 'bulk_checkout' => 'Išduota įranga',
'checkin' => 'Išduota įranga', 'checkin' => 'Išduota įranga',
'checkout' => 'Patikros turtas', 'checkout' => 'Patikros turtas',
'clone' => 'Kopijuoti įrangą', 'clone' => 'Kopijuoti įrangą',

View file

@ -62,7 +62,7 @@ return array(
'success' => 'Įranga išduota sėkmingai.', 'success' => 'Įranga išduota sėkmingai.',
'user_does_not_exist' => 'Netinkamas naudotojas. Prašome bandykite dar kartą.', 'user_does_not_exist' => 'Netinkamas naudotojas. Prašome bandykite dar kartą.',
'not_available' => 'Šis turtas negali būti išsiunčiamas!', 'not_available' => 'Šis turtas negali būti išsiunčiamas!',
'no_assets_selected' => 'You must select at least one asset from the list' 'no_assets_selected' => 'Jūs turite pasirinkti bent vieną turtą iš sąrašo'
), ),
'checkin' => array( 'checkin' => array(

View file

@ -16,8 +16,8 @@ return array(
), ),
'restore' => array( 'restore' => array(
'error' => 'Manufacturer was not restored, please try again', 'error' => 'Gamintojas nebuvo atkurtas, prašome bandyti dar kartą',
'success' => 'Manufacturer restored successfully.' 'success' => 'Gamintojas buvo atkurtas sėkmingai.'
), ),
'delete' => array( 'delete' => array(

View file

@ -4,9 +4,9 @@ return array(
'about_models_title' => 'Apie turto modelius', 'about_models_title' => 'Apie turto modelius',
'about_models_text' => 'Turto modeliai yra būdas grupuoti identišką turtą. "MBP 2013", "IPhone 6s" ir kt.', 'about_models_text' => 'Turto modeliai yra būdas grupuoti identišką turtą. "MBP 2013", "IPhone 6s" ir kt.',
'deleted' => 'Šis modelis ištrintas. <a href="/hardware/models/:model_id/restore">Spauskite atkurti modelį čia</a>.', 'deleted' => 'Šis modelis ištrintas. <a href="/hardware/models/:model_id/restore">Spauskite atkurti modelį čia</a>.',
'bulk_delete' => 'Bulk Delete Asset Models', 'bulk_delete' => 'Ištrinti pažymėtus turto modelius',
'bulk_delete_help' => 'Use the checkboxes below to confirm the deletion of the selected asset models. Asset models that have assets associated with them cannot be deleted until the assets are associated with a different model.', 'bulk_delete_help' => '„Pažymėkite žemiau esantį langelį, kad patvirtintumėte pasirinktų turto modelių ištrynimą. Turto modeliai, kuriuose yra su jais susijęs turtas, negali būti ištrinti, išskyrus tuos atvejus, kai tas turtas yra susietas su kitu modeliu.“.',
'bulk_delete_warn' => 'You are about to delete :model_count asset models.', 'bulk_delete_warn' => 'Ketinate ištrinti :model_count turto modelius.',
'restore' => 'Atkurti modelį', 'restore' => 'Atkurti modelį',
'requestable' => 'Naudotojai gali užklausi šį modelį', 'requestable' => 'Naudotojai gali užklausi šį modelį',
'show_mac_address' => 'Rodykite MAC adreso laukelį įrangoje šiam modeliui', 'show_mac_address' => 'Rodykite MAC adreso laukelį įrangoje šiam modeliui',
@ -14,5 +14,5 @@ return array(
'view_models' => 'Peržiūrėti modelius', 'view_models' => 'Peržiūrėti modelius',
'fieldset' => 'Laukų grupė', 'fieldset' => 'Laukų grupė',
'no_custom_field' => 'Nėra pritaikytų laukų', 'no_custom_field' => 'Nėra pritaikytų laukų',
'add_default_values' => 'Add default values', 'add_default_values' => 'Pridėti numatytąją reikšmę',
); );

View file

@ -34,9 +34,9 @@ return array(
), ),
'bulkdelete' => array( 'bulkdelete' => array(
'error' => 'No models were selected, so nothing was deleted.', 'error' => 'Nepasirinktas modelis, nėra ką ištrinti.',
'success' => ':success_count model(s) deleted!', 'success' => ':success_count model(s) ištrinti!',
'success_partial' => ':success_count model(s) were deleted, however :fail_count were unable to be deleted because they still have assets associated with them.' 'success_partial' => ':success_count model(s) buvo ištrinti, bet :fail_count negalima ištrinti todėl, kad turtas vis dar susietas.'
), ),
); );

View file

@ -4,8 +4,8 @@ return array(
'ad' => 'Active Directory', 'ad' => 'Active Directory',
'ad_domain' => '"Active Directory" domenas', 'ad_domain' => '"Active Directory" domenas',
'ad_domain_help' => 'Tai kartais sutampa su jūsų el. Pašto domenu, bet ne visada.', 'ad_domain_help' => 'Tai kartais sutampa su jūsų el. Pašto domenu, bet ne visada.',
'admin_cc_email' => 'CC Email', 'admin_cc_email' => 'CC El. paštas',
'admin_cc_email_help' => 'If you would like to send a copy of checkin/checkout emails that are sent to users to an additional email account, enter it here. Otherwise leave this field blank.', 'admin_cc_email_help' => 'Jeigu Jūs norite siųsti išduoto/neišduoto turto sąrašo kopiją, įveskite čia el. pašto adresą. Kitu atveju palikite laukelį tuščią.',
'is_ad' => 'Tai yra "Active Directory" serveris', 'is_ad' => 'Tai yra "Active Directory" serveris',
'alert_email' => 'Siūsti įspėjimus', 'alert_email' => 'Siūsti įspėjimus',
'alerts_enabled' => 'Perspėjimai įjungti', 'alerts_enabled' => 'Perspėjimai įjungti',
@ -25,9 +25,9 @@ return array(
'confirm_purge_help' => 'Žemiau esančiame laukelyje įveskite tekstą "DELETE", kad išvalykite ištrintus įrašus. Šis veiksmas negali būti panaikintas.', 'confirm_purge_help' => 'Žemiau esančiame laukelyje įveskite tekstą "DELETE", kad išvalykite ištrintus įrašus. Šis veiksmas negali būti panaikintas.',
'custom_css' => 'Užsakytas CSS', 'custom_css' => 'Užsakytas CSS',
'custom_css_help' => 'Įveskite bet kokį užsakytą CSS peržiūrėjimo norėtumėte naudoti. Neįtraukite &lt;style>&lt;/Stilius&gt; žymės.', 'custom_css_help' => 'Įveskite bet kokį užsakytą CSS peržiūrėjimo norėtumėte naudoti. Neįtraukite &lt;style>&lt;/Stilius&gt; žymės.',
'custom_forgot_pass_url' => 'Custom Password Reset URL', 'custom_forgot_pass_url' => 'Pasirinktinio slaptažodžio atkūrimo nuoroda',
'custom_forgot_pass_url_help' => 'This replaces the built-in forgotten password URL on the login screen, useful to direct people to internal or hosted LDAP password reset functionality. It will effectively disable local user forgotten password functionality.', 'custom_forgot_pass_url_help' => 'Tai pakeičia pamiršto slaptažodžio nuorodą prisijungimo lange. Naudinga tiesiogiai nukreipti į LDAP slaptažodžio atkūrimo funkcionalumą. Būtų efektyviau išjungti vietinių vartotojų pamirštų slaptažodžių funkcionalumą.',
'dashboard_message' => 'Dashboard Message', 'dashboard_message' => 'Prietaisų skydelio pranešimai',
'dashboard_message_help' => 'Šis tekstas bus rodomas valdymo skydelyje, kiekvienam turinčiam teisę peržiūrėti valdymo skydelį.', 'dashboard_message_help' => 'Šis tekstas bus rodomas valdymo skydelyje, kiekvienam turinčiam teisę peržiūrėti valdymo skydelį.',
'default_currency' => 'Numatytoji valiuta', 'default_currency' => 'Numatytoji valiuta',
'default_eula_text' => 'Numatytasis EULA', 'default_eula_text' => 'Numatytasis EULA',
@ -42,8 +42,8 @@ return array(
'alt_barcode_type' => '1D barkodo tipas', 'alt_barcode_type' => '1D barkodo tipas',
'eula_settings' => 'EULA nustatymai', 'eula_settings' => 'EULA nustatymai',
'eula_markdown' => 'Šis EULA leidžia <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.', 'eula_markdown' => 'Šis EULA leidžia <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
'footer_text' => 'Additional Footer Text ', 'footer_text' => 'Papildomas poraštė tekstas ',
'footer_text_help' => 'This text will appear in the right-side footer. Links are allowed using <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>. Line breaks, headers, images, etc may result in unpredictable results.', 'footer_text_help' => 'Šis tekstas bus rodomas dešinėje poraštės pusėje. Nuorodos leidžiamos naudojant <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>. Eilutės lūžei, antraštės, paveiksliukai etc gali sukelti nenuspėjamus rezultatus.',
'general_settings' => 'Bendrieji nustatymai', 'general_settings' => 'Bendrieji nustatymai',
'generate_backup' => 'Atsarginė kopija', 'generate_backup' => 'Atsarginė kopija',
'header_color' => 'Atraštės spalva', 'header_color' => 'Atraštės spalva',
@ -52,8 +52,8 @@ return array(
'ldap_enabled' => 'LDAP įjungtas', 'ldap_enabled' => 'LDAP įjungtas',
'ldap_integration' => 'LDAP integracija', 'ldap_integration' => 'LDAP integracija',
'ldap_settings' => 'LDAP nustatymai', 'ldap_settings' => 'LDAP nustatymai',
'ldap_login_test_help' => 'Enter a valid LDAP username and password from the base DN you specified above to test whether your LDAP login is configured correctly. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.', 'ldap_login_test_help' => 'Prašome įvesti tinkamą LDAP vartotojo vardą ir slaptažodį iš bazės DN. Jūs privalote patikrinti ar LDAP prisijungimas sukonfigūruotas tinkamai. PIRMIAUSIA JŪS PRIVALOTE IŠSAUGOTI LDAP NUSTATYMUS.',
'ldap_login_sync_help' => 'This only tests that LDAP can sync correctly. If your LDAP Authentication query is not correct, users may still not be able to login. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.', 'ldap_login_sync_help' => 'Tai patikrina ar LDAP sinchronizacija teisinga. Jeigu Jūsų LADAP autentifikacijos užkalusa nėra teisinga, vartotojai gali negalėti prisijungti. PIRMIAUSIA JŪS PRIVALOTE IŠSAUGOTI LDAP NUSTATYMUS.',
'ldap_server' => 'LDAP serveris', 'ldap_server' => 'LDAP serveris',
'ldap_server_help' => 'Tai turėtų prasidėti su ldap: // (nešifruotam arba TLS) arba ldaps: (jei tai SSL)', 'ldap_server_help' => 'Tai turėtų prasidėti su ldap: // (nešifruotam arba TLS) arba ldaps: (jei tai SSL)',
'ldap_server_cert' => 'LDAP SSL sertifikato patvirtinimas', 'ldap_server_cert' => 'LDAP SSL sertifikato patvirtinimas',
@ -75,24 +75,24 @@ return array(
'ldap_active_flag' => 'LDAP aktyvios vėliavos', 'ldap_active_flag' => 'LDAP aktyvios vėliavos',
'ldap_emp_num' => 'LDAP darbuotojų skaičius', 'ldap_emp_num' => 'LDAP darbuotojų skaičius',
'ldap_email' => 'LDAP el.paštas', 'ldap_email' => 'LDAP el.paštas',
'license' => 'Software License', 'license' => 'Programinės įrangos licenzija',
'load_remote_text' => 'Nuotoliniai skriptai', 'load_remote_text' => 'Nuotoliniai skriptai',
'load_remote_help_text' => 'Šis Snipe-IT įdiegimas gali įtraukti programinius kodus iš interneto.', 'load_remote_help_text' => 'Šis Snipe-IT įdiegimas gali įtraukti programinius kodus iš interneto.',
'login_note' => 'Prisijungimo pastaba', 'login_note' => 'Prisijungimo pastaba',
'login_note_help' => 'Pasirinktinai į savo prisijungimo ekraną įtraukite keletą sakinių, pavyzdžiui, kad padėtumėte žmonėms, kurie rasti pamestą ar pavogtą įrenginį. Šiame lauke pritariama <a href="https://help.github.com/articles/github-flavored-markdown/"> "Github" skonio markdown</a>', 'login_note_help' => 'Pasirinktinai į savo prisijungimo ekraną įtraukite keletą sakinių, pavyzdžiui, kad padėtumėte žmonėms, kurie rasti pamestą ar pavogtą įrenginį. Šiame lauke pritariama <a href="https://help.github.com/articles/github-flavored-markdown/"> "Github" skonio markdown</a>',
'login_remote_user_text' => 'Remote User login options', 'login_remote_user_text' => 'Nuotolinio vartotojo prisijungimo parametrai',
'login_remote_user_enabled_text' => 'Enable Login with Remote User Header', 'login_remote_user_enabled_text' => 'Įjungti nuotolinį prisijungimą naudojant vartotojo antraštę',
'login_remote_user_enabled_help' => 'This option enables Authentication via the REMOTE_USER header according to the "Common Gateway Interface (rfc3875)"', 'login_remote_user_enabled_help' => 'Ši opcija įjungia autentifikaciją "REMOTE_USER" per "Cammon Gateway" vartotojo sąsają (rfc3875)',
'login_common_disabled_text' => 'Disable other authentication mechanisms', 'login_common_disabled_text' => 'Išjungti kitus autentifikacijos mechanizmus',
'login_common_disabled_help' => 'This option disables other authentication mechanisms. Just enable this option if you are sure that your REMOTE_USER login is already working', 'login_common_disabled_help' => 'Ši opcija išjungia kitus autentifikacijos mechanizmus. Šią funkciją įjunkite jeigu esate tikri jog REMOTE_USER prisijungimas veikia',
'login_remote_user_custom_logout_url_text' => 'Custom logout URL', 'login_remote_user_custom_logout_url_text' => 'Pasirinktinė atsijungimo URL',
'login_remote_user_custom_logout_url_help' => 'If a url is provided here, users will get redirected to this URL after the user logs out of Snipe-IT. This is useful to close the user sessions of your Authentication provider correctly.', 'login_remote_user_custom_logout_url_help' => 'Čia įveskite nuorodą į kurią bus nukreipti vartotojai prisijungę prie Snite-IT. Tai naudinga uždarant vartotojo sesiją.',
'logo' => 'Logotipas', 'logo' => 'Logotipas',
'logo_print_assets' => 'Use in Print', 'logo_print_assets' => 'Naudoti spausdinimui',
'logo_print_assets_help' => 'Use branding on printable asset lists ', 'logo_print_assets_help' => 'Naudoti turto sąrašą spausdinimą ',
'full_multiple_companies_support_help_text' => 'Apriboti vartotojai (įskaitant administratorius) priskirtus kompanijoms.', 'full_multiple_companies_support_help_text' => 'Apriboti vartotojai (įskaitant administratorius) priskirtus kompanijoms.',
'full_multiple_companies_support_text' => 'Pilnas kelių kompanijų palaikymas', 'full_multiple_companies_support_text' => 'Pilnas kelių kompanijų palaikymas',
'show_in_model_list' => 'Show in Model Dropdowns', 'show_in_model_list' => 'Rodyti išskleidžiame modelyje',
'optional' => 'pasirinktinai', 'optional' => 'pasirinktinai',
'per_page' => 'Rezultatai puslapyje', 'per_page' => 'Rezultatai puslapyje',
'php' => 'PHP versija', 'php' => 'PHP versija',
@ -109,23 +109,23 @@ return array(
'setting' => 'Nustatymai', 'setting' => 'Nustatymai',
'settings' => 'Nustatymai', 'settings' => 'Nustatymai',
'show_alerts_in_menu' => 'Rodyti įspėjimus viršutiniame meniu', 'show_alerts_in_menu' => 'Rodyti įspėjimus viršutiniame meniu',
'show_archived_in_list' => 'Archived Assets', 'show_archived_in_list' => 'Archyvuotas turtas',
'show_archived_in_list_text' => 'Show archived assets in the "all assets" listing', 'show_archived_in_list_text' => 'Rodyti archyvuotą turtą "visame turto" sąraše',
'show_images_in_email' => 'Show images in emails', 'show_images_in_email' => 'Rodyti nuotraukas el. pašte',
'show_images_in_email_help' => 'Uncheck this box if your Snipe-IT installation is behind a VPN or closed network and users outside the network will not be able to load images served from this installation in their emails.', 'show_images_in_email_help' => 'Nuimkite žymelę jeigu jūsų Snipe-IT instaliacija yra VPN arba uždarame tinkle ir vartotojai esantys už tinklo negalės įkrauti paveikslėlių jų el. paštuose.',
'site_name' => 'Interneto puslapio pavadinimas', 'site_name' => 'Interneto puslapio pavadinimas',
'slack_botname' => 'Slack\'o boto vardas', 'slack_botname' => 'Slack\'o boto vardas',
'slack_channel' => 'Slack\'o kanalas', 'slack_channel' => 'Slack\'o kanalas',
'slack_endpoint' => 'Slack\'o galutinis taškas', 'slack_endpoint' => 'Slack\'o galutinis taškas',
'slack_integration' => 'Slack\'o nustatymai', 'slack_integration' => 'Slack\'o nustatymai',
'slack_integration_help' => 'Slack\'o integravimas yra pasirinktinis, tačiau kanalas ir galutinis taškas reikalingas jie jūs norite juos naudoti su Slack programėle. Norėdami konfigūruoti Slack\'o integraciją pirmiausia privalote <a href=":slack_link" target="_new">sukurti įeinantį priedą</a> savo turimoje Slack\'o paskyroje.', 'slack_integration_help' => 'Slack\'o integravimas yra pasirinktinis, tačiau kanalas ir galutinis taškas reikalingas jie jūs norite juos naudoti su Slack programėle. Norėdami konfigūruoti Slack\'o integraciją pirmiausia privalote <a href=":slack_link" target="_new">sukurti įeinantį priedą</a> savo turimoje Slack\'o paskyroje.',
'slack_integration_help_button' => 'Once you have saved your Slack information, a test button will appear.', 'slack_integration_help_button' => 'Jeigu jūs išsaugosite informaciją, testavimo mygtukas bus rodomas.',
'slack_test_help' => 'Test whether your Slack integration is configured correctly. YOU MUST SAVE YOUR UPDATED SLACK SETTINGS FIRST.', 'slack_test_help' => 'Patikrinkite, ar tinkamai atlikta „Slack“ konfigūracija. Jūs privalote išsaugoti savo "SLACK" nustatymus pirmiausia.',
'snipe_version' => 'Snipe-IT versija', 'snipe_version' => 'Snipe-IT versija',
'support_footer' => 'Support Footer Links ', 'support_footer' => 'Palaikomos poraštė nuorodos ',
'support_footer_help' => 'Specify who sees the links to the Snipe-IT Support info and Users Manual', 'support_footer_help' => 'Nurodykite, kas matys nuorodas į „Snipe-IT“ palaikymo informacijos ir naudotojo vadovą',
'version_footer' => 'Version in Footer ', 'version_footer' => 'Versija poraštėje ',
'version_footer_help' => 'Specify who sees the Snipe-IT version and build number.', 'version_footer_help' => 'Nurodykite kad galės matyti Snipe-IT versijas ir versijos numerius.',
'system' => 'Sistemos informacija', 'system' => 'Sistemos informacija',
'update' => 'Atnaujinti nustatymus', 'update' => 'Atnaujinti nustatymus',
'value' => 'Vertė', 'value' => 'Vertė',
@ -136,9 +136,9 @@ return array(
'label_dimensions' => 'Etiketės išmatavimai (coliais)', 'label_dimensions' => 'Etiketės išmatavimai (coliais)',
'next_auto_tag_base' => 'Kitas automatinis prieaugis', 'next_auto_tag_base' => 'Kitas automatinis prieaugis',
'page_padding' => 'Puslapio maržos (coliais)', 'page_padding' => 'Puslapio maržos (coliais)',
'privacy_policy_link' => 'Link to Privacy Policy', 'privacy_policy_link' => 'Privatumo politikos nuorodos',
'privacy_policy' => 'Privacy Policy', 'privacy_policy' => 'Privatumo politika',
'privacy_policy_link_help' => 'If a url is included here, a link to your privacy policy will be included in the app footer and in any emails that the system sends out, in compliance with GDPR. ', 'privacy_policy_link_help' => 'Jeigu nuorodas įterpsite čia tai nuorodos privatumo politikos bus įterptas poraštėje ir kiekviename siunčiame el. laiške, palaikant GDPR. ',
'purge' => 'Išvalyti ištrintus įrašus', 'purge' => 'Išvalyti ištrintus įrašus',
'labels_display_bgutter' => 'Etiketės apatinis latakai', 'labels_display_bgutter' => 'Etiketės apatinis latakai',
'labels_display_sgutter' => 'Etiketės pusės latakai', 'labels_display_sgutter' => 'Etiketės pusės latakai',
@ -181,7 +181,7 @@ return array(
'bottom' => 'apačioje', 'bottom' => 'apačioje',
'vertical' => 'vertikalus', 'vertical' => 'vertikalus',
'horizontal' => 'horizontalus', 'horizontal' => 'horizontalus',
'unique_serial' => 'Unique serial numbers', 'unique_serial' => 'Unikalus serijinis numeris',
'unique_serial_help_text' => 'Checking this box will enforce a uniqueness constraint on asset serials', 'unique_serial_help_text' => 'Pažymėtas šis langelis reiškia unikalius serijinius kiekvienam turtui',
'zerofill_count' => 'Turto žymų ilgis, įskaitant "zerofill"', 'zerofill_count' => 'Turto žymų ilgis, įskaitant "zerofill"',
); );

View file

@ -5,8 +5,8 @@ return array(
'archived' => 'Archyvuota', 'archived' => 'Archyvuota',
'create' => 'Sukurti būlės kortelę', 'create' => 'Sukurti būlės kortelę',
'color' => 'Diagramos spalva', 'color' => 'Diagramos spalva',
'default_label' => 'Default Label', 'default_label' => 'Numatytoji etikėtė',
'default_label_help' => 'This is used to ensure your most commonly used status labels appear at the top of the select box when creating/editing assets.', 'default_label_help' => 'Tai naudojama norint užtikrinti, kad dažniausiai naudotos būsenos etiketės būtų rodomos lango viršuje kuriant / redaguojant turtą.',
'deployable' => 'Naudojamas', 'deployable' => 'Naudojamas',
'info' => 'Būklės kortelės naudojamos apibūdinti įvairias jūsų įrangos būkles, kuriose ji randasi. Kortelės gali būti nurodančios, kad įranga remontuojama, prarasta, pavota ir t. t. Jūs galite suskurti naują būklės kortelę išduotiems, atnaujinamiems ir kitiems įrenginiams.', 'info' => 'Būklės kortelės naudojamos apibūdinti įvairias jūsų įrangos būkles, kuriose ji randasi. Kortelės gali būti nurodančios, kad įranga remontuojama, prarasta, pavota ir t. t. Jūs galite suskurti naują būklės kortelę išduotiems, atnaujinamiems ir kitiems įrenginiams.',
'name' => 'Būklės pavadinimas', 'name' => 'Būklės pavadinimas',

View file

@ -19,9 +19,9 @@ return array(
'confirm' => 'Ar jūs tikrai norite ištrinti šį tiekėją?', 'confirm' => 'Ar jūs tikrai norite ištrinti šį tiekėją?',
'error' => 'Nepavyko ištrinti tiekėjo. Prašome bandykite dar kartą.', 'error' => 'Nepavyko ištrinti tiekėjo. Prašome bandykite dar kartą.',
'success' => 'Tiekėjas ištrintas sėkmingai.', 'success' => 'Tiekėjas ištrintas sėkmingai.',
'assoc_assets' => 'This supplier is currently associated with :asset_count asset(s) and cannot be deleted. Please update your assets to no longer reference this supplier and try again. ', 'assoc_assets' => 'Šis tiekėjas šiuo metu susietas su bent vienu modeliu ir negali būti ištrintas. Prašome atnaujinkite savo modelius, kad šie nebūtu susieti su šiuo tiekėju ir bandykite dar kartą. ',
'assoc_licenses' => 'This supplier is currently associated with :licenses_count licences(s) and cannot be deleted. Please update your licenses to no longer reference this supplier and try again. ', 'assoc_licenses' => 'Šis tiekėjas šiuo metu susietas su licenzija ir negali būti ištrinti. Prašome atnaujinkite savo modelius, kad šie nebūtų susieti su šiuo tiekėjų ir bandykite dar kartą. ',
'assoc_maintenances' => 'This supplier is currently associated with :asset_maintenances_count asset maintenances(s) and cannot be deleted. Please update your asset maintenances to no longer reference this supplier and try again. ', 'assoc_maintenances' => 'Šis tiekėjas šiuo metu susietas su bent vienu modeliu ir negali būti ištrintas. Prašome atnaujinkite savo modelius, kad šie nebūtu susieti su šiuo tiekėju ir bandykite dar kartą. ',
) )
); );

View file

@ -2,8 +2,8 @@
return array( return array(
'activated_help_text' => 'This user can login', 'activated_help_text' => 'Šis vartotojas gali prisijungti',
'activated_disabled_help_text' => 'You cannot edit activation status for your own account.', 'activated_disabled_help_text' => 'Jūs negalite keisti savosios pąskyros aktyvacijos statuso.',
'assets_user' => 'Priskirta įranga :name', 'assets_user' => 'Priskirta įranga :name',
'bulk_update_warn' => 'Jūs ketinate redaguoti vartotojų: user_count savybes. Atminkite, kad negalėsite pakeisti savo naudotojo atributų naudodami šią formą ir savo pasirinkimą keisti individualiai.', 'bulk_update_warn' => 'Jūs ketinate redaguoti vartotojų: user_count savybes. Atminkite, kad negalėsite pakeisti savo naudotojo atributų naudodami šią formą ir savo pasirinkimą keisti individualiai.',
'bulk_update_help' => 'Ši forma leidžia vienu metu atnaujinti kelis naudotojus. Užpildykite tik tuos laukelius, kuriuos reikia keisti. Visi tušti laukai lieka nepakeisti.', 'bulk_update_help' => 'Ši forma leidžia vienu metu atnaujinti kelis naudotojus. Užpildykite tik tuos laukelius, kuriuos reikia keisti. Visi tušti laukai lieka nepakeisti.',
@ -17,7 +17,7 @@ return array(
'restore_user' => 'Spauskite čia norėdami juos atkurti.', 'restore_user' => 'Spauskite čia norėdami juos atkurti.',
'last_login' => 'Paskutinis prisijungimas', 'last_login' => 'Paskutinis prisijungimas',
'ldap_config_text' => 'LDAP konfigūracijos parametrus galite rasti Administratorius> Nustatymai. Pasirinkta vieta (pasirinktinai) bus nustatyta visiems importuojamiems vartotojams.', 'ldap_config_text' => 'LDAP konfigūracijos parametrus galite rasti Administratorius> Nustatymai. Pasirinkta vieta (pasirinktinai) bus nustatyta visiems importuojamiems vartotojams.',
'print_assigned' => 'Print All Assigned', 'print_assigned' => 'Spausdinti visą turtą',
'software_user' => ':name išduota įranga', 'software_user' => ':name išduota įranga',
'view_user' => 'Peržiūrėti :name vartotoją', 'view_user' => 'Peržiūrėti :name vartotoją',
'usercsv' => 'CSV dokumentas', 'usercsv' => 'CSV dokumentas',

View file

@ -12,5 +12,5 @@ return array(
'submit' => 'Išsaugoti', 'submit' => 'Išsaugoti',
'upload' => 'Įkelti', 'upload' => 'Įkelti',
'select_file' => 'Pasirinkite failą ...', 'select_file' => 'Pasirinkite failą ...',
'select_files' => 'Select Files...', 'select_files' => 'Pasirinkite failą...',
); );

View file

@ -9,7 +9,7 @@
'activity_report' => 'Veiksmų ataskaita', 'activity_report' => 'Veiksmų ataskaita',
'address' => 'Adresas', 'address' => 'Adresas',
'admin' => 'Administratorius', 'admin' => 'Administratorius',
'administrator' => 'Administrator', 'administrator' => 'Administratorius',
'add_seats' => 'Prideta licenzijų', 'add_seats' => 'Prideta licenzijų',
'all_assets' => 'Visa įranga', 'all_assets' => 'Visa įranga',
'all' => 'Viskas', 'all' => 'Viskas',
@ -39,9 +39,9 @@
'checkin' => 'Pridėti', 'checkin' => 'Pridėti',
'checkin_from' => 'Pridėti iš', 'checkin_from' => 'Pridėti iš',
'checkout' => 'Išimti', 'checkout' => 'Išimti',
'checkouts_count' => 'Checkouts', 'checkouts_count' => 'Išduota',
'checkins_count' => 'Checkins', 'checkins_count' => 'Pridėti',
'user_requests_count' => 'Requests', 'user_requests_count' => 'Užklausos',
'city' => 'Miestas', 'city' => 'Miestas',
'click_here' => 'Paspauskite čia', 'click_here' => 'Paspauskite čia',
'clear_selection' => 'Išvalyti pasirinkimą', 'clear_selection' => 'Išvalyti pasirinkimą',
@ -68,14 +68,14 @@
'debug_warning' => 'Įspėjimas!', 'debug_warning' => 'Įspėjimas!',
'debug_warning_text' => 'Ši programa veikia gamybos režimu, įjungus derinimą. Tai gali atskleisti slaptus duomenis, jei jūsų programa yra prieinama išoriniam pasauliui. Išjunkite derinimo režimą nustatydami <code>APP_DEBUG</code> reikšmę savo <code>.env</code> byloje <code>false</code>.', 'debug_warning_text' => 'Ši programa veikia gamybos režimu, įjungus derinimą. Tai gali atskleisti slaptus duomenis, jei jūsų programa yra prieinama išoriniam pasauliui. Išjunkite derinimo režimą nustatydami <code>APP_DEBUG</code> reikšmę savo <code>.env</code> byloje <code>false</code>.',
'delete' => 'Ištrinti', 'delete' => 'Ištrinti',
'delete_confirm' => 'Are you sure you wish to delete :item?', 'delete_confirm' => 'Ar jūs norite tikrai ištrinti?',
'deleted' => 'Ištrinta', 'deleted' => 'Ištrinta',
'delete_seats' => 'Ištrintos licenzijos', 'delete_seats' => 'Ištrintos licenzijos',
'departments' => 'Departamentai', 'departments' => 'Departamentai',
'department' => 'Departamentas', 'department' => 'Departamentas',
'deployed' => 'Naudojama', 'deployed' => 'Naudojama',
'depreciation_report' => 'Nusidėvėjimo ataskaita', 'depreciation_report' => 'Nusidėvėjimo ataskaita',
'details' => 'Details', 'details' => 'Detaliau',
'download' => 'Atsisiųsti', 'download' => 'Atsisiųsti',
'depreciation' => 'Nusidėvėjimas', 'depreciation' => 'Nusidėvėjimas',
'editprofile' => 'Koreguoti profilį', 'editprofile' => 'Koreguoti profilį',
@ -85,16 +85,16 @@
'email_domain_help' => 'Tai naudojama importuojant importuojamus el. Pašto adresus', 'email_domain_help' => 'Tai naudojama importuojant importuojamus el. Pašto adresus',
'filastname_format' => 'V. Pavardė (vpavarde@example.com)', 'filastname_format' => 'V. Pavardė (vpavarde@example.com)',
'firstname_lastname_format' => 'Vardas Pavardė (vpavarde@example.com)', 'firstname_lastname_format' => 'Vardas Pavardė (vpavarde@example.com)',
'firstname_lastname_underscore_format' => 'First Name Last Name (jane_smith@example.com)', 'firstname_lastname_underscore_format' => 'Vardas Pavardė (vpavarde@example.com)',
'lastnamefirstinitial_format' => 'Last Name First Initial (smithj@example.com)', 'lastnamefirstinitial_format' => 'Pavardė, vardo pirmoji raidė (pavardėV@example.com',
'first' => 'Pirmas', 'first' => 'Pirmas',
'first_name' => 'Vardas', 'first_name' => 'Vardas',
'first_name_format' => 'Vardas (vpavarde@example.com)', 'first_name_format' => 'Vardas (vpavarde@example.com)',
'files' => 'Files', 'files' => 'Failas',
'file_name' => 'Failas', 'file_name' => 'Failas',
'file_uploads' => 'Failo Įkėlimas', 'file_uploads' => 'Failo Įkėlimas',
'generate' => 'Sukurti', 'generate' => 'Sukurti',
'github_markdown' => 'This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.', 'github_markdown' => 'Šis laukas leidžia <a href="https://help.github.com/articles/github-flavored-markdown/">Github automatizuota žymėjimą</a>.',
'groups' => 'Grupės', 'groups' => 'Grupės',
'gravatar_email' => 'Gravatar el. paštas', 'gravatar_email' => 'Gravatar el. paštas',
'history' => 'Istorija', 'history' => 'Istorija',
@ -103,7 +103,7 @@
'image' => 'Paveikslėlis', 'image' => 'Paveikslėlis',
'image_delete' => 'Ištrinti nuotrauką', 'image_delete' => 'Ištrinti nuotrauką',
'image_upload' => 'Įkelti nuotrauką', 'image_upload' => 'Įkelti nuotrauką',
'image_filetypes_help' => 'Accepted filetypes are jpg, png, gif, and svg. Max upload size allowed is :size.', 'image_filetypes_help' => 'Priimami failų tipai yra: jpg, png, gif, and svg. Didžiausias leidžiamas įkėlimo dydis :size.',
'import' => 'Įkelti', 'import' => 'Įkelti',
'import-history' => 'Importuoti istoriją', 'import-history' => 'Importuoti istoriją',
'asset_maintenance' => 'Įrangos priežiūra', 'asset_maintenance' => 'Įrangos priežiūra',
@ -127,7 +127,7 @@
'locations' => 'Vietovės', 'locations' => 'Vietovės',
'logout' => 'Atsijungti', 'logout' => 'Atsijungti',
'lookup_by_tag' => 'Paiešką pagal turto žymą', 'lookup_by_tag' => 'Paiešką pagal turto žymą',
'maintenances' => 'Maintenances', 'maintenances' => 'Techninis aptarnavimas',
'manufacturer' => 'Gamintojas', 'manufacturer' => 'Gamintojas',
'manufacturers' => 'Gamintojai', 'manufacturers' => 'Gamintojai',
'markdown' => 'Šis laukas leidžia <a href="https://help.github.com/articles/github-flavored-markdown/">Github skonio markdown</a>.', 'markdown' => 'Šis laukas leidžia <a href="https://help.github.com/articles/github-flavored-markdown/">Github skonio markdown</a>.',
@ -181,11 +181,11 @@
'select_company' => 'Pasirinkite kompaniją', 'select_company' => 'Pasirinkite kompaniją',
'select_asset' => 'Pasirinkite įrangą', 'select_asset' => 'Pasirinkite įrangą',
'settings' => 'Nustatymai', 'settings' => 'Nustatymai',
'show_deleted' => 'Show Deleted', 'show_deleted' => 'Peržiūrėti ištrintus',
'show_current' => 'Show Current', 'show_current' => 'Rodyti dabartinį',
'sign_in' => 'Prisijungti', 'sign_in' => 'Prisijungti',
'signature' => 'Parašas', 'signature' => 'Parašas',
'skin' => 'Skin', 'skin' => 'Išvaizda',
'some_features_disabled' => 'DEMO MODE: kai kurios funkcijos yra išjungtos šio diegimo metu.', 'some_features_disabled' => 'DEMO MODE: kai kurios funkcijos yra išjungtos šio diegimo metu.',
'site_name' => 'Interneto puslapio pavadinimas', 'site_name' => 'Interneto puslapio pavadinimas',
'state' => 'Rajonas', 'state' => 'Rajonas',
@ -206,7 +206,7 @@
'unknown_admin' => 'Nežinomas administratorius', 'unknown_admin' => 'Nežinomas administratorius',
'username_format' => 'Vartotojo vardas Formatas', 'username_format' => 'Vartotojo vardas Formatas',
'update' => 'Atnaujinti', 'update' => 'Atnaujinti',
'upload_filetypes_help' => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, xls, txt, lic, zip, and rar. Max upload size allowed is :size.', 'upload_filetypes_help' => 'Priimami failų tipai yra: png, gif, jpg, jpeg, doc, docx, pdf, xls, txt, lic, zip, and rar.. Didžiausias leidžiamas įkėlimo dydis :size.',
'uploaded' => 'Įkeltas', 'uploaded' => 'Įkeltas',
'user' => 'Naudotojas', 'user' => 'Naudotojas',
'accepted' => 'priimta', 'accepted' => 'priimta',

View file

@ -21,7 +21,7 @@ return array(
'Confirm_Asset_Checkin' => 'Patvirtinkite turto registraciją.', 'Confirm_Asset_Checkin' => 'Patvirtinkite turto registraciją.',
'Confirm_Accessory_Checkin' => 'Patvirtinkite priedų registraciją.', 'Confirm_Accessory_Checkin' => 'Patvirtinkite priedų registraciją.',
'Confirm_accessory_delivery' => 'Patvirtinkite aksesuaro pristatymą.', 'Confirm_accessory_delivery' => 'Patvirtinkite aksesuaro pristatymą.',
'Confirm_license_delivery' => 'Confirm license delivery.', 'Confirm_license_delivery' => 'Patvirtinti licenzijos pristatymą.',
'Confirm_asset_delivery' => 'Patvirtinkite įrangos gavimą.', 'Confirm_asset_delivery' => 'Patvirtinkite įrangos gavimą.',
'Confirm_consumable_delivery' => 'Patvirtinkite vartojimo pristatymą.', 'Confirm_consumable_delivery' => 'Patvirtinkite vartojimo pristatymą.',
'current_QTY' => 'Esamas kiekis', 'current_QTY' => 'Esamas kiekis',
@ -52,19 +52,19 @@ return array(
'requested' => 'Užklausta:', 'requested' => 'Užklausta:',
'reset_link' => 'Jūsų slaptažodžio atstatymo nuoroda', 'reset_link' => 'Jūsų slaptažodžio atstatymo nuoroda',
'reset_password' => 'Paspauskite norėdami pakeisti savo slaptažodį:', 'reset_password' => 'Paspauskite norėdami pakeisti savo slaptažodį:',
'serial' => 'Serial', 'serial' => 'Serija',
'supplier' => 'Tiekėjas', 'supplier' => 'Tiekėjas',
'tag' => 'Žymė', 'tag' => 'Žymė',
'test_email' => 'Išbandykite "Snipe-IT" el. Laišką', 'test_email' => 'Išbandykite "Snipe-IT" el. Laišką',
'test_mail_text' => 'Tai yra "Snipe-IT Asset Management System" testas. Jei tai gavote, paštas dirba :)', 'test_mail_text' => 'Tai yra "Snipe-IT Asset Management System" testas. Jei tai gavote, paštas dirba :)',
'the_following_item' => 'Šis elementas buvo pažymėtas:', 'the_following_item' => 'Šis elementas buvo pažymėtas:',
'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.', 'low_inventory_alert' => 'Tai yra reikšmė minimalaus inventoriaus arba greitai pasibaigiančio.:count | Tai yra reikšmė minimalaus inventoriaus arba greitai pasibaigiančio.:count.',
'assets_warrantee_alert' => 'There is :count asset with a warrantee expiring in the next :threshold days.|There are :count assets with warrantees expiring in the next :threshold days.', 'assets_warrantee_alert' => 'Tiek turto :count kurių garantinis aptarnavimas baigsis už :threshold days.|Tiek turto :count kurių garantinis aptarnavimas baigsis už :threshold days.',
'license_expiring_alert' => 'There is :count license expiring in the next :threshold days.|There are :count licenses expiring in the next :threshold days.', 'license_expiring_alert' => 'Tiek licenzijų :count baigsis už :threshold days.|Tiek licenzijų :count baigsis už :threshold days.',
'to_reset' => 'Jei norite iš naujo nustatyti savo: žiniatinklio slaptažodį, užpildykite šią formą:', 'to_reset' => 'Jei norite iš naujo nustatyti savo: žiniatinklio slaptažodį, užpildykite šią formą:',
'type' => 'Tipas', 'type' => 'Tipas',
'user' => 'User', 'user' => 'Vartotojas',
'username' => 'Username', 'username' => 'Vartotojo vardas',
'welcome' => 'Sveiki :vardas', 'welcome' => 'Sveiki :vardas',
'welcome_to' => 'Sveiki atvykę į: internetą!', 'welcome_to' => 'Sveiki atvykę į: internetą!',
'your_credentials' => 'Jūsų Snipe-IT įgaliojimai', 'your_credentials' => 'Jūsų Snipe-IT įgaliojimai',

View file

@ -2,6 +2,6 @@
return [ return [
'sent' => 'Nuoroda atkurti slaptažodį išsiųsta!', 'sent' => 'Nuoroda atkurti slaptažodį išsiųsta!',
'user' => 'No matching active user found with that email.', 'user' => 'Neaptikta vartotojo su šiuo elektroninio pašto adresu.',
]; ];

View file

@ -67,7 +67,7 @@ return array(
'not_in' => 'Pasirinktas :attribute neteisingas.', 'not_in' => 'Pasirinktas :attribute neteisingas.',
'numeric' => ':attribute privalo būti skaičius.', 'numeric' => ':attribute privalo būti skaičius.',
'present' => 'Atributo laukas turi būti.', 'present' => 'Atributo laukas turi būti.',
'valid_regex' => 'That is not a valid regex. ', 'valid_regex' => 'Tai nėra tinkamas regex. ',
'regex' => ':attribute formatas neteisingas.', 'regex' => ':attribute formatas neteisingas.',
'required' => ':attribute laukelis privalomas.', 'required' => ':attribute laukelis privalomas.',
'required_if' => ':attribute laukelis yra privalomas kai :other yra :value.', 'required_if' => ':attribute laukelis yra privalomas kai :other yra :value.',
@ -88,7 +88,7 @@ return array(
'unique' => ':attribute jau užimtas.', 'unique' => ':attribute jau užimtas.',
'uploaded' => 'Nepavyko įkelti atributo.', 'uploaded' => 'Nepavyko įkelti atributo.',
'url' => ':attribute formatas neteisingas.', 'url' => ':attribute formatas neteisingas.',
"unique_undeleted" => "The :attribute must be unique.", "unique_undeleted" => ":attribute turi būti unikalus.",
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------

View file

@ -5,7 +5,7 @@ return array(
'about_categories' => 'Хөрөнгийн бүтэц зохион байгуулалтыг оновчтой болгоход Ангилал тус болно. Жишээлбэл &quot;Ширээний компьютьер&quot;, &quot;Ноутбүүк&quot;,&quot;Гар утас&quot;,&quot;Таблет&quot; гэх мэт. Та өөрийн хүссэнээрээ ангиллаа зохиож болно.', 'about_categories' => 'Хөрөнгийн бүтэц зохион байгуулалтыг оновчтой болгоход Ангилал тус болно. Жишээлбэл &quot;Ширээний компьютьер&quot;, &quot;Ноутбүүк&quot;,&quot;Гар утас&quot;,&quot;Таблет&quot; гэх мэт. Та өөрийн хүссэнээрээ ангиллаа зохиож болно.',
'asset_categories' => 'Хөрөнгийн ангиллууд', 'asset_categories' => 'Хөрөнгийн ангиллууд',
'category_name' => 'Ангиллын нэр', 'category_name' => 'Ангиллын нэр',
'checkin_email' => 'Send email to user on checkin/checkout.', 'checkin_email' => 'Олгох үед хэрэглэгч уруу имэйл илгээх.',
'checkin_email_notification' => 'This user will be sent an email on checkin/checkout.', 'checkin_email_notification' => 'This user will be sent an email on checkin/checkout.',
'clone' => 'Ангиллыг хуулж үүсгэх', 'clone' => 'Ангиллыг хуулж үүсгэх',
'create' => 'Ангилал үүсгэх', 'create' => 'Ангилал үүсгэх',

View file

@ -28,5 +28,5 @@ return array(
'create_fieldset' => 'Nytt Feltsett', 'create_fieldset' => 'Nytt Feltsett',
'create_field' => 'Nytt Egendefinert Felt', 'create_field' => 'Nytt Egendefinert Felt',
'value_encrypted' => 'Verdien i dette feltet er kryptert i databasen. Bare administratorer kan se hva som står i dette feltet', 'value_encrypted' => 'Verdien i dette feltet er kryptert i databasen. Bare administratorer kan se hva som står i dette feltet',
'show_in_email' => 'Include the value of this field in checkout emails sent to the user? Encrypted fields cannot be included in emails.', 'show_in_email' => 'Inkluder verdien i dette feltet i utsjekkseposter sendt til brukeren? Krypterte felter kan ikke inkluderes i eposter.',
); );

View file

@ -16,8 +16,8 @@ return array(
), ),
'restore' => array( 'restore' => array(
'error' => 'Manufacturer was not restored, please try again', 'error' => 'Produsent ble ikke gjenopprettet. Prøv igjen',
'success' => 'Manufacturer restored successfully.' 'success' => 'Gjenopprettelse av produsent vellykket.'
), ),
'delete' => array( 'delete' => array(

View file

@ -5,7 +5,7 @@ return array(
'about_models_text' => 'Asset modeller er en måte å gruppere identiske eiendeler. "MBP 2013", "IPhone 6s", etc.', 'about_models_text' => 'Asset modeller er en måte å gruppere identiske eiendeler. "MBP 2013", "IPhone 6s", etc.',
'deleted' => 'Denne modellen er slettet. <a href="/hardware/models/:model_id/restore">Klikk her for å gjenopprette</a>.', 'deleted' => 'Denne modellen er slettet. <a href="/hardware/models/:model_id/restore">Klikk her for å gjenopprette</a>.',
'bulk_delete' => 'Bulk slett modeller', 'bulk_delete' => 'Bulk slett modeller',
'bulk_delete_help' => 'Use the checkboxes below to confirm the deletion of the selected asset models. Asset models that have assets associated with them cannot be deleted until the assets are associated with a different model.', 'bulk_delete_help' => 'Bruk merkeboksene nedenfor til å bekrefte sletting av de merkede modellene. Modeller som har eiendeler tilknyttet kan ikke slettes før eiendelene har blitt tilknyttet en annen modell.',
'bulk_delete_warn' => 'Du er i ferd med å slette :model_count modeller.', 'bulk_delete_warn' => 'Du er i ferd med å slette :model_count modeller.',
'restore' => 'Gjenopprett modell', 'restore' => 'Gjenopprett modell',
'requestable' => 'Brukere kan be om denne modellen', 'requestable' => 'Brukere kan be om denne modellen',

View file

@ -5,7 +5,7 @@ return array(
'ad_domain' => 'Active Directory domene', 'ad_domain' => 'Active Directory domene',
'ad_domain_help' => 'Dette er noen ganger det samme som e-post domene, men ikke alltid.', 'ad_domain_help' => 'Dette er noen ganger det samme som e-post domene, men ikke alltid.',
'admin_cc_email' => 'CC e-post', 'admin_cc_email' => 'CC e-post',
'admin_cc_email_help' => 'If you would like to send a copy of checkin/checkout emails that are sent to users to an additional email account, enter it here. Otherwise leave this field blank.', 'admin_cc_email_help' => 'Hvis du vil sende en kopi av innsjekk-/utsjekkeposter som sendes til brukere til en ekstra epostadresse, skriv den inn her. La ellers feltet stå tomt.',
'is_ad' => 'Dette er en Active Directory server', 'is_ad' => 'Dette er en Active Directory server',
'alert_email' => 'Send varslinger til', 'alert_email' => 'Send varslinger til',
'alerts_enabled' => 'Varslinger aktivert', 'alerts_enabled' => 'Varslinger aktivert',
@ -26,7 +26,7 @@ return array(
'custom_css' => 'Egendefinert CSS', 'custom_css' => 'Egendefinert CSS',
'custom_css_help' => 'Legg til egendefinert CSS. Ikke ta med taggene &lt;style&gt;&lt;/style&gt;.', 'custom_css_help' => 'Legg til egendefinert CSS. Ikke ta med taggene &lt;style&gt;&lt;/style&gt;.',
'custom_forgot_pass_url' => 'Egendefinert passord tilbakestillings-URL', 'custom_forgot_pass_url' => 'Egendefinert passord tilbakestillings-URL',
'custom_forgot_pass_url_help' => 'This replaces the built-in forgotten password URL on the login screen, useful to direct people to internal or hosted LDAP password reset functionality. It will effectively disable local user forgotten password functionality.', 'custom_forgot_pass_url_help' => 'Erstatter den innebygde glemt passord-URLen i innloggingsbildet. Nyttig for å sende brukere til intern eller leid LDAP passordgjenopprettingsfunksjonalitet. Vil deaktivere den lokale glemt passord-funksjonaliteten.',
'dashboard_message' => 'Dashboardmelding', 'dashboard_message' => 'Dashboardmelding',
'dashboard_message_help' => 'Denne teksten vises på dashbordet for alle som har tillatelse til å vise oversikten.', 'dashboard_message_help' => 'Denne teksten vises på dashbordet for alle som har tillatelse til å vise oversikten.',
'default_currency' => 'Standardvaluta', 'default_currency' => 'Standardvaluta',
@ -43,7 +43,8 @@ return array(
'eula_settings' => 'EULA-innstillinger', 'eula_settings' => 'EULA-innstillinger',
'eula_markdown' => 'Denne EULAen tillater <a href="https://help.github.com/articles/github-flavored-markdown/">Github Flavored markdown</a>.', 'eula_markdown' => 'Denne EULAen tillater <a href="https://help.github.com/articles/github-flavored-markdown/">Github Flavored markdown</a>.',
'footer_text' => 'Ekstra bunnteksttekst ', 'footer_text' => 'Ekstra bunnteksttekst ',
'footer_text_help' => 'This text will appear in the right-side footer. Links are allowed using <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>. Line breaks, headers, images, etc may result in unpredictable results.', 'footer_text_help' => 'Denne teksten vil fremstå i høyre del av bunnteksten. Lenker er tillatt ved å bruke <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.
Linjeskift, topptekst, bilder, osv. kan føre til uventede resultater.',
'general_settings' => 'Generelle innstillinger', 'general_settings' => 'Generelle innstillinger',
'generate_backup' => 'Generer Sikkerhetskopi', 'generate_backup' => 'Generer Sikkerhetskopi',
'header_color' => 'Overskriftsfarge', 'header_color' => 'Overskriftsfarge',
@ -52,8 +53,8 @@ return array(
'ldap_enabled' => 'LDAP aktivert', 'ldap_enabled' => 'LDAP aktivert',
'ldap_integration' => 'LDAP Integrering', 'ldap_integration' => 'LDAP Integrering',
'ldap_settings' => 'LDAP Instillinger', 'ldap_settings' => 'LDAP Instillinger',
'ldap_login_test_help' => 'Enter a valid LDAP username and password from the base DN you specified above to test whether your LDAP login is configured correctly. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.', 'ldap_login_test_help' => 'Skriv inn et gyldig LDAP brukernavn og passord fra samme base DN som du anga ovenfor for å teste at LDAP-innlogging er riktig konfigurert. DU MÅ LAGRE DINE OPPDATERTE LDAP-INNSTILLINGER FØRST.',
'ldap_login_sync_help' => 'This only tests that LDAP can sync correctly. If your LDAP Authentication query is not correct, users may still not be able to login. YOU MUST SAVE YOUR UPDATED LDAP SETTINGS FIRST.', 'ldap_login_sync_help' => 'Tester at LDAP kan synkronisere. Feil i LDAP autentiseringsspørringen din kan før til at brukere ikke kan logge inn. DU MÅ LAGRE DINE OPPDATERTE LDAP-INNSTILLINGER FØRST.',
'ldap_server' => 'LDAP Server', 'ldap_server' => 'LDAP Server',
'ldap_server_help' => 'Dette bør starte med ldap:// (for ukryptert eller TLS) eller ldaps:// (for SSL)', 'ldap_server_help' => 'Dette bør starte med ldap:// (for ukryptert eller TLS) eller ldaps:// (for SSL)',
'ldap_server_cert' => 'Validering av LDAP SSL sertifikat', 'ldap_server_cert' => 'Validering av LDAP SSL sertifikat',
@ -81,15 +82,15 @@ return array(
'login_note' => 'Logg inn melding', 'login_note' => 'Logg inn melding',
'login_note_help' => 'Eventuelt inkludere et par setninger på logg inn skjermen, for eksempel for å hjelpe mennesker som har funnet en mistet eller stjålet enhet. Dette feltet godtar <a href="https://help.github.com/articles/github-flavored-markdown/"> Github flavored markdown</a>', 'login_note_help' => 'Eventuelt inkludere et par setninger på logg inn skjermen, for eksempel for å hjelpe mennesker som har funnet en mistet eller stjålet enhet. Dette feltet godtar <a href="https://help.github.com/articles/github-flavored-markdown/"> Github flavored markdown</a>',
'login_remote_user_text' => 'Fjernbruker pålogging valg', 'login_remote_user_text' => 'Fjernbruker pålogging valg',
'login_remote_user_enabled_text' => 'Enable Login with Remote User Header', 'login_remote_user_enabled_text' => 'Aktiver innlogging med Remote User Header',
'login_remote_user_enabled_help' => 'This option enables Authentication via the REMOTE_USER header according to the "Common Gateway Interface (rfc3875)"', 'login_remote_user_enabled_help' => 'Aktiverer autentisering via REMOTE_USER headeren som beskrevet i "Common Gateway Interface (rfc3875)"',
'login_common_disabled_text' => 'Deaktiver andre godkjenningsmekanismer', 'login_common_disabled_text' => 'Deaktiver andre godkjenningsmekanismer',
'login_common_disabled_help' => 'This option disables other authentication mechanisms. Just enable this option if you are sure that your REMOTE_USER login is already working', 'login_common_disabled_help' => 'Deaktiverer andre autentiseringsmekanismer. Aktiver dette valget kun hvis du er sikker på at din REMOTE_USER innlogging allerede fungerer',
'login_remote_user_custom_logout_url_text' => 'Tilpasset utloggingsadresse', 'login_remote_user_custom_logout_url_text' => 'Tilpasset utloggingsadresse',
'login_remote_user_custom_logout_url_help' => 'If a url is provided here, users will get redirected to this URL after the user logs out of Snipe-IT. This is useful to close the user sessions of your Authentication provider correctly.', 'login_remote_user_custom_logout_url_help' => 'Hvis en URL angis her blir brukerne videresendt til denne URLen etter utlogging fra Snipe-IT. Dette er nyttig for korrekt lukking av autentiseringssesjoner hos din autentiseringsleverandør.',
'logo' => 'Logo', 'logo' => 'Logo',
'logo_print_assets' => 'Bruk i Print', 'logo_print_assets' => 'Bruk i Print',
'logo_print_assets_help' => 'Use branding on printable asset lists ', 'logo_print_assets_help' => 'Bruk branding på utskrivbare eiendelslister ',
'full_multiple_companies_support_help_text' => 'Vis kun eiendeler til bedriften brukere (inkl administratorer) er knyttet til.', 'full_multiple_companies_support_help_text' => 'Vis kun eiendeler til bedriften brukere (inkl administratorer) er knyttet til.',
'full_multiple_companies_support_text' => 'Full støtte for flere bedrifter', 'full_multiple_companies_support_text' => 'Full støtte for flere bedrifter',
'show_in_model_list' => 'Vis i Model nedtrekksmeny', 'show_in_model_list' => 'Vis i Model nedtrekksmeny',
@ -110,7 +111,7 @@ return array(
'settings' => 'Innstillinger', 'settings' => 'Innstillinger',
'show_alerts_in_menu' => 'Vis varsler i toppmenyen', 'show_alerts_in_menu' => 'Vis varsler i toppmenyen',
'show_archived_in_list' => 'Arkiverte eiendeler', 'show_archived_in_list' => 'Arkiverte eiendeler',
'show_archived_in_list_text' => 'Show archived assets in the "all assets" listing', 'show_archived_in_list_text' => 'Vis arkiverte eiendeler i "alle eiendeler" utlisting',
'show_images_in_email' => 'Vis bilder i e-post', 'show_images_in_email' => 'Vis bilder i e-post',
'show_images_in_email_help' => 'Uncheck this box if your Snipe-IT installation is behind a VPN or closed network and users outside the network will not be able to load images served from this installation in their emails.', 'show_images_in_email_help' => 'Uncheck this box if your Snipe-IT installation is behind a VPN or closed network and users outside the network will not be able to load images served from this installation in their emails.',
'site_name' => 'Nettstedsnavn', 'site_name' => 'Nettstedsnavn',
@ -119,13 +120,13 @@ return array(
'slack_endpoint' => 'Slack endepunkt', 'slack_endpoint' => 'Slack endepunkt',
'slack_integration' => 'Slack-innstillinger', 'slack_integration' => 'Slack-innstillinger',
'slack_integration_help' => 'Slack-integrasjon er valgfritt, men endepunkt og kanal er påkrevd hvis du vil bruke det. For å konfigurere Slack-integrasjon må du først <a href=":slack_link" target="_new">opprette en innkommende webhook</a> på din Slack-konto.', 'slack_integration_help' => 'Slack-integrasjon er valgfritt, men endepunkt og kanal er påkrevd hvis du vil bruke det. For å konfigurere Slack-integrasjon må du først <a href=":slack_link" target="_new">opprette en innkommende webhook</a> på din Slack-konto.',
'slack_integration_help_button' => 'Once you have saved your Slack information, a test button will appear.', 'slack_integration_help_button' => 'Du vil se en testknapp etter at du lagrer Slack-informasjonen.',
'slack_test_help' => 'Test whether your Slack integration is configured correctly. YOU MUST SAVE YOUR UPDATED SLACK SETTINGS FIRST.', 'slack_test_help' => 'Test om Slack-integrasjonen din er riktig konfigurert. DU MÅ LAGRE DINE OPPDATERTE SLACK-INNSTILLINGER FØRST.',
'snipe_version' => 'Snipe-IT-versjon', 'snipe_version' => 'Snipe-IT-versjon',
'support_footer' => 'Støtte Footer Lenker ', 'support_footer' => 'Støtte Footer Lenker ',
'support_footer_help' => 'Specify who sees the links to the Snipe-IT Support info and Users Manual', 'support_footer_help' => 'Angi hvem som kan se lenker til Snipe-IT supportinformasjon og brukermanual',
'version_footer' => 'Versjon i Footer ', 'version_footer' => 'Versjon i Footer ',
'version_footer_help' => 'Specify who sees the Snipe-IT version and build number.', 'version_footer_help' => 'Angi hvem som kan se Snipe-IT versjon og build-nummer.',
'system' => 'Systeminformasjon', 'system' => 'Systeminformasjon',
'update' => 'Oppdater innstillinger', 'update' => 'Oppdater innstillinger',
'value' => 'Verdi', 'value' => 'Verdi',
@ -138,7 +139,7 @@ return array(
'page_padding' => 'Side marger (inches)', 'page_padding' => 'Side marger (inches)',
'privacy_policy_link' => 'Link til personvernregler', 'privacy_policy_link' => 'Link til personvernregler',
'privacy_policy' => 'Personvernerklæring', 'privacy_policy' => 'Personvernerklæring',
'privacy_policy_link_help' => 'If a url is included here, a link to your privacy policy will be included in the app footer and in any emails that the system sends out, in compliance with GDPR. ', 'privacy_policy_link_help' => 'Angi en URL i dette feltet for å inkludere en lenke til personvern-policy i applikasjonsbunntekst og i alle eposter som dette systemet sender ut. Støtter GDPR. ',
'purge' => 'Tømme slettede poster', 'purge' => 'Tømme slettede poster',
'labels_display_bgutter' => 'Etikett bunnmarg', 'labels_display_bgutter' => 'Etikett bunnmarg',
'labels_display_sgutter' => 'Etikett sidemarg', 'labels_display_sgutter' => 'Etikett sidemarg',
@ -182,6 +183,6 @@ return array(
'vertical' => 'vertikal', 'vertical' => 'vertikal',
'horizontal' => 'horisontal', 'horizontal' => 'horisontal',
'unique_serial' => 'Unike serienumre', 'unique_serial' => 'Unike serienumre',
'unique_serial_help_text' => 'Checking this box will enforce a uniqueness constraint on asset serials', 'unique_serial_help_text' => 'Håndhever at eiendelsserienumre er unike',
'zerofill_count' => 'Lengden på ID-merker, inkludert zerofill', 'zerofill_count' => 'Lengden på ID-merker, inkludert zerofill',
); );

View file

@ -19,9 +19,9 @@ return array(
'confirm' => 'Er du sikker på at du vil slette denne leverandøren?', 'confirm' => 'Er du sikker på at du vil slette denne leverandøren?',
'error' => 'Det oppstod et problem under sletting av leverandør. Prøv igjen.', 'error' => 'Det oppstod et problem under sletting av leverandør. Prøv igjen.',
'success' => 'Sletting av leverandør vellykket.', 'success' => 'Sletting av leverandør vellykket.',
'assoc_assets' => 'This supplier is currently associated with :asset_count asset(s) and cannot be deleted. Please update your assets to no longer reference this supplier and try again. ', 'assoc_assets' => 'Denne leverandøren er tilknyttet med :asset_count eiendel(er), og kan ikke slettes. Oppdater eiendelene dine til ikke å bruke denne leverandøren og prøv igjen. ',
'assoc_licenses' => 'This supplier is currently associated with :licenses_count licences(s) and cannot be deleted. Please update your licenses to no longer reference this supplier and try again. ', 'assoc_licenses' => 'Denne leverandøren er tilknyttet med :licenses_count lisens(er), og kan ikke slettes. Oppdater lisensene dine til ikke å bruke denne leverandøren og prøv igjen. ',
'assoc_maintenances' => 'This supplier is currently associated with :asset_maintenances_count asset maintenances(s) and cannot be deleted. Please update your asset maintenances to no longer reference this supplier and try again. ', 'assoc_maintenances' => 'Denne leverandøren er tilknyttet med :asset_maintenances_count eiendelsvedlikehold, og kan ikke slettes. Oppdater dine eiendelsvedlikehold til ikke å bruke denne leverandøren og prøv igjen. ',
) )
); );

View file

@ -56,7 +56,7 @@
'create' => 'Opprett ny', 'create' => 'Opprett ny',
'created' => 'Enhet opprettet', 'created' => 'Enhet opprettet',
'created_asset' => 'eiendel opprettet', 'created_asset' => 'eiendel opprettet',
'created_at' => 'Opprettet i', 'created_at' => 'Opprettet',
'updated_at' => 'Oppdatert', 'updated_at' => 'Oppdatert',
'currency' => '$', // this is deprecated 'currency' => '$', // this is deprecated
'current' => 'Nåværende', 'current' => 'Nåværende',
@ -85,8 +85,8 @@
'email_domain_help' => 'Brukes til å generere e-postadresser ved import', 'email_domain_help' => 'Brukes til å generere e-postadresser ved import',
'filastname_format' => 'Fornavn (kun initial) Etternavn (oladunk@example.com)', 'filastname_format' => 'Fornavn (kun initial) Etternavn (oladunk@example.com)',
'firstname_lastname_format' => 'Fornavn Etternavn (oladunk@example.com)', 'firstname_lastname_format' => 'Fornavn Etternavn (oladunk@example.com)',
'firstname_lastname_underscore_format' => 'First Name Last Name (jane_smith@example.com)', 'firstname_lastname_underscore_format' => 'Fornavn Etternavn (oladunk@example.com)',
'lastnamefirstinitial_format' => 'Last Name First Initial (smithj@example.com)', 'lastnamefirstinitial_format' => 'Etternavn Initialer (oladunk@example.com)',
'first' => 'Første', 'first' => 'Første',
'first_name' => 'Fornavn', 'first_name' => 'Fornavn',
'first_name_format' => 'Fornavn (oladunk@example.com)', 'first_name_format' => 'Fornavn (oladunk@example.com)',
@ -103,7 +103,7 @@
'image' => 'Bilde', 'image' => 'Bilde',
'image_delete' => 'Slett bilde', 'image_delete' => 'Slett bilde',
'image_upload' => 'Last opp bilde', 'image_upload' => 'Last opp bilde',
'image_filetypes_help' => 'Accepted filetypes are jpg, png, gif, and svg. Max upload size allowed is :size.', 'image_filetypes_help' => 'Tillatte filtyper er jpg, png, gif og svg. Maks tillatte filstørrelse er :size.',
'import' => 'Importer', 'import' => 'Importer',
'import-history' => 'Importhistorikk', 'import-history' => 'Importhistorikk',
'asset_maintenance' => 'Vedlikehold av eiendeler', 'asset_maintenance' => 'Vedlikehold av eiendeler',

View file

@ -58,9 +58,9 @@ return array(
'test_email' => 'Test-epost fra Snipe-IT', 'test_email' => 'Test-epost fra Snipe-IT',
'test_mail_text' => 'Dette er en test fra Snipe-IT eiendelsadministrasjonssystem. Hvis du mottok denne meldingen fungerer e-post.', 'test_mail_text' => 'Dette er en test fra Snipe-IT eiendelsadministrasjonssystem. Hvis du mottok denne meldingen fungerer e-post.',
'the_following_item' => 'Følgende enheter har blitt sjekket inn: ', 'the_following_item' => 'Følgende enheter har blitt sjekket inn: ',
'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.', 'low_inventory_alert' => ':count enhet er under minimumnivå for beholdning, eller vil snart nå dette nivået.|:count enheter er under minimumnivå for beholdning, eller vil snart nå dette nivået.',
'assets_warrantee_alert' => 'There is :count asset with a warrantee expiring in the next :threshold days.|There are :count assets with warrantees expiring in the next :threshold days.', 'assets_warrantee_alert' => ':count eiendel har garanti som utløper de neste :threshold dagene.|:count eiendeler har garanti som utløper de neste :threshold dagene.',
'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' => ':count lisens utløper de neste :threshold dagene.|:count lisenser utløper de neste :threshold dagene.',
'to_reset' => 'Fullfør dette skjemaet for å tilbakestille ditt :web passord:', 'to_reset' => 'Fullfør dette skjemaet for å tilbakestille ditt :web passord:',
'type' => 'Type', 'type' => 'Type',
'user' => 'Bruker', 'user' => 'Bruker',

View file

@ -2,6 +2,6 @@
return [ return [
'sent' => 'Din passord link har blitt sendt!', 'sent' => 'Din passord link har blitt sendt!',
'user' => 'No matching active user found with that email.', 'user' => 'Ingen aktiv bruker med den epostadressen funnet.',
]; ];

View file

@ -14,5 +14,5 @@ return array(
'view_models' => 'Ver modelos', 'view_models' => 'Ver modelos',
'fieldset' => 'Conjunto de campos', 'fieldset' => 'Conjunto de campos',
'no_custom_field' => 'Sem campos customizados', 'no_custom_field' => 'Sem campos customizados',
'add_default_values' => 'Add default values', 'add_default_values' => 'Adicionar valores standard',
); );

View file

@ -2,6 +2,6 @@
return [ return [
'sent' => 'O link com a senha de acesso foi enviado com sucesso!', 'sent' => 'O link com a senha de acesso foi enviado com sucesso!',
'user' => 'No matching active user found with that email.', 'user' => 'Nenhum Utilizador activo encontrado com esse e-mail.',
]; ];

View file

@ -3,7 +3,7 @@
return array( return array(
'about_assets_title' => 'Om tillgångar', 'about_assets_title' => 'Om tillgångar',
'about_assets_text' => 'Tillgångar är poster som spåras med serienummer eller tillgångstagg. De tenderar att vara mer värdefulla saker där identifiering av en viss sak är viktig.', 'about_assets_text' => 'Tillgångar är poster som spåras med serienummer eller tillgångstagg. De tenderar att vara mer värdefulla saker där identifiering av en viss sak är viktig.',
'archived' => 'arkiveras', 'archived' => 'Arkiverade',
'asset' => 'Tillgång', 'asset' => 'Tillgång',
'bulk_checkout' => 'Checkout tillgångar', 'bulk_checkout' => 'Checkout tillgångar',
'checkin' => 'Checkin Asset', 'checkin' => 'Checkin Asset',
@ -16,7 +16,7 @@ return array(
'requestable' => 'Requestable', 'requestable' => 'Requestable',
'requested' => 'Begärda', 'requested' => 'Begärda',
'restore' => 'Återställ tillgången', 'restore' => 'Återställ tillgången',
'pending' => 'Avvaktan', 'pending' => 'Väntande',
'undeployable' => 'Undeployable', 'undeployable' => 'Undeployable',
'view' => 'Visa tillgång', 'view' => 'Visa tillgång',
); );

View file

@ -120,7 +120,7 @@ return array(
'slack_integration' => 'Slack Settings', 'slack_integration' => 'Slack Settings',
'slack_integration_help' => 'Slak integration är valfri, men ändpunkten och kanalen krävs om du vill använda den. För att konfigurera Slack integration måste du först <a href=":slack_link" target="_new">skapa en inkommande webhook</a> på ditt Slack-konto.', 'slack_integration_help' => 'Slak integration är valfri, men ändpunkten och kanalen krävs om du vill använda den. För att konfigurera Slack integration måste du först <a href=":slack_link" target="_new">skapa en inkommande webhook</a> på ditt Slack-konto.',
'slack_integration_help_button' => 'När du har sparat din Slack-information visas en testknapp.', 'slack_integration_help_button' => 'När du har sparat din Slack-information visas en testknapp.',
'slack_test_help' => 'Test whether your Slack integration is configured correctly. YOU MUST SAVE YOUR UPDATED SLACK SETTINGS FIRST.', 'slack_test_help' => 'Testa om din Slack-integration är konfigurerad korrekt. DU MÅSTE SPARA DINA UPPDATERADE SLACK-INSTÄLLNINGAR FÖRST.',
'snipe_version' => 'Snipe-IT-versionen', 'snipe_version' => 'Snipe-IT-versionen',
'support_footer' => 'Stöd länkar i sidfot ', 'support_footer' => 'Stöd länkar i sidfot ',
'support_footer_help' => 'Ange vem som kan se länkarna till Snipe-IT Support info och användarmanual', 'support_footer_help' => 'Ange vem som kan se länkarna till Snipe-IT Support info och användarmanual',

View file

@ -2,7 +2,7 @@
return array( return array(
'about' => 'Om statusetiketter', 'about' => 'Om statusetiketter',
'archived' => 'arkiveras', 'archived' => 'Arkiverade',
'create' => 'Skapa statusetikett', 'create' => 'Skapa statusetikett',
'color' => 'Diagramfärg', 'color' => 'Diagramfärg',
'default_label' => 'Standard etikett', 'default_label' => 'Standard etikett',
@ -10,7 +10,7 @@ return array(
'deployable' => 'Deployable', 'deployable' => 'Deployable',
'info' => 'Statusetiketter används för att beskriva de olika tillstånd som dina tillgångar kan vara i. De kan vara ute för reparation, förlorade / stulna etc. Du kan skapa nya statusetiketter för deployerbara, pågående och arkiverade tillgångar.', 'info' => 'Statusetiketter används för att beskriva de olika tillstånd som dina tillgångar kan vara i. De kan vara ute för reparation, förlorade / stulna etc. Du kan skapa nya statusetiketter för deployerbara, pågående och arkiverade tillgångar.',
'name' => 'Statusnamn', 'name' => 'Statusnamn',
'pending' => 'Avvaktan', 'pending' => 'Väntande',
'status_type' => 'Statustyp', 'status_type' => 'Statustyp',
'show_in_nav' => 'Visa i sidnav', 'show_in_nav' => 'Visa i sidnav',
'title' => 'Statusetiketter', 'title' => 'Statusetiketter',

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