Compare commits
232 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ec8ddc197f | |||
| b48e56bd46 | |||
| 753ca93371 | |||
| 04f71e7f6a | |||
| 5d129dd420 | |||
| 1c37c630aa | |||
| d329d6104e | |||
| 482723f3bc | |||
| cbc025b1ff | |||
| bf8ceceabe | |||
| fba4bba132 | |||
| 0ded40c037 | |||
| 6f486a37ff | |||
| 1ef822997b | |||
| ea66629e98 | |||
| 84c9979fe3 | |||
| 867a992183 | |||
| c3ad7d649c | |||
| fc250e228d | |||
| 37e81568ea | |||
| 048d910d5b | |||
| b162aba445 | |||
| 974627849b | |||
| e18e9f699e | |||
| cc9209d2de | |||
| dd3d264e63 | |||
| 246f1373a8 | |||
| b993f4270e | |||
| 6c51ef11b1 | |||
| 77234f6580 | |||
| 088e6af0b5 | |||
| e2e54677ee | |||
| 7a93e94fa6 | |||
| e33f73fe9f | |||
| 6291389df5 | |||
| 2950fb1041 | |||
| 68c082e0dc | |||
| ee3deb9c63 | |||
| c1505de8d6 | |||
| 10be434c13 | |||
| 92e22eead5 | |||
| 31db86abd3 | |||
| 8e70ff135a | |||
| 8bc57f98a5 | |||
| 6f4cee6334 | |||
| 6beccc5e60 | |||
| fed8e10644 | |||
| 3c0121c1d0 | |||
| 02021e3fb9 | |||
| a2960dc653 | |||
| 702499dd79 | |||
| 482c427e34 | |||
| 67910490bd | |||
| fdb5ab2293 | |||
| 092d9d1e42 | |||
| e657f11531 | |||
| 9aac183318 | |||
| c8c2867305 | |||
| 3e1f71026c | |||
| dc562d8c20 | |||
| d01f7cf317 | |||
| 3942489d21 | |||
| 51479c8bbc | |||
| ea3364ab68 | |||
| cb608d7fd1 | |||
| 9eaabf95a0 | |||
| 724f38abc2 | |||
| 0dfc083a91 | |||
| 16432f503a | |||
| 7c9433be5d | |||
| e4ce71ff14 | |||
| 45c6406ff4 | |||
| 550e2b6bb8 | |||
| a7bb890729 | |||
| 3d8f8faf01 | |||
| 55cf5877c4 | |||
| dec3c4aff3 | |||
| 79e00c1191 | |||
| 12dc33244d | |||
| 6e37f945ac | |||
| d75120000a | |||
| 9e4aab7165 | |||
| 6bc3209333 | |||
| 054ff42547 | |||
| 367ab8ddd5 | |||
| 4f5d4a0984 | |||
| 40489c53d6 | |||
| 93b760d53b | |||
| e86996bc7e | |||
| 14244f45b6 | |||
| 1b9d90a322 | |||
| 736f74d083 | |||
| 8194c6efdb | |||
| aae2a17ad1 | |||
| f44150668c | |||
| 6eed2deb09 | |||
| 878c6e7031 | |||
| 1f4a73fab6 | |||
| 7a315523fe | |||
| 6f082e662b | |||
| 018c981c5a | |||
| 0149773a03 | |||
| 5d46d90725 | |||
| 0544e05f32 | |||
| 80ff42a41f | |||
| 90b7df45b9 | |||
| 32858b973a | |||
| 40ba8d0de1 | |||
| 8ddbb4e64f | |||
| cc40c48aac | |||
| 522ab9e0f5 | |||
| 97187aa7eb | |||
| d93a5aa623 | |||
| a5b88982bf | |||
| df71bdcada | |||
| 51bab2dd26 | |||
| ed8da6ad1b | |||
| 18d0a04efc | |||
| bb68ed3ad9 | |||
| 402ca07aa2 | |||
| 28dc358df1 | |||
| 3cf1e9d55d | |||
| 82b001ab5f | |||
| 7b272226ce | |||
| 78d26fb7f6 | |||
| 930842e685 | |||
| b938cb42d8 | |||
| 4c7b6d130f | |||
| af57ca4983 | |||
| 40c31a1ad7 | |||
| 7ae4a4177f | |||
| 6efd323fbf | |||
| ed9dbcc777 | |||
| c2cf7de41b | |||
| 32bd14bd2d | |||
| f9cbecdb17 | |||
| 7bb29a0277 | |||
| d5f7579e9f | |||
| 13fd43c45c | |||
| c08ce901cc | |||
| 94bd11d3c9 | |||
| 59c6e26b29 | |||
| bf7cc404f8 | |||
| 12a2c71b90 | |||
| 6e2eeba0f6 | |||
| 99a739fae3 | |||
| 0185f61c11 | |||
| 783f0c113d | |||
| 75a839cc21 | |||
| 577b5586b4 | |||
| 1474a16148 | |||
| 9baa2000e1 | |||
| d0624dbefe | |||
| ecb6e8d9a9 | |||
| bbb299faf2 | |||
| ba3b55cab0 | |||
| 67acca7bc8 | |||
| e4b33c3b56 | |||
| ed43c73cec | |||
| a6fa795b41 | |||
| 3a6bac2e63 | |||
| 8e01c05e42 | |||
| fabf9281e9 | |||
| 6588d409b8 | |||
| 92a3421a4e | |||
| a42147ff34 | |||
| 0df1bc6894 | |||
| 9317076c5e | |||
| 1b5525c51f | |||
| 6019c80c7b | |||
| aaa6cb24d4 | |||
| 1ef5ad500a | |||
| 9468acedfa | |||
| 6a951b6357 | |||
| 95f7742259 | |||
| 9f795306e5 | |||
| 6feaff1e7b | |||
| 9a168354ae | |||
| 309d242c4d | |||
| 5c174f829e | |||
| 3c428f2d7b | |||
| 6833716576 | |||
| bd374d031a | |||
| ef26f48f60 | |||
| b07f8525db | |||
| 9f062701fa | |||
| 2c452daddf | |||
| 53a82d3f4d | |||
| b5b8816279 | |||
| 7bc4127e8c | |||
| 06158cc413 | |||
| cb49e7c9a6 | |||
| 1822027a8f | |||
| c8dabc25e3 | |||
| f2b10eeee8 | |||
| 4b52e1471c | |||
| f6bba03375 | |||
| b3813a7121 | |||
| eb2a1396ca | |||
| 0fae18c4ba | |||
| 25ac83e944 | |||
| a82e65e190 | |||
| 187bb90de0 | |||
| 293648582a | |||
| 51a306993c | |||
| ec1851fa84 | |||
| bbe748dbd3 | |||
| 406e8c5874 | |||
| a4f71a9f0a | |||
| 3748498523 | |||
| 49d11103f7 | |||
| dce9060820 | |||
| 02fa7daa1d | |||
| 2a2acf6d1c | |||
| c385b4a082 | |||
| 1b961346f0 | |||
| 100db23210 | |||
| 3e980a4c57 | |||
| 9a3ac41370 | |||
| 0b48fd1465 | |||
| 220537fbfb | |||
| df5437647b | |||
| 92b2da9b1b | |||
| ef56177372 | |||
| cb7822576f | |||
| 7ba361b10d | |||
| 55694fa2fc | |||
| c825878c46 | |||
| 80a69bfe90 | |||
| d4dc8d2b79 | |||
| 4e3df93349 | |||
| 38efc62900 |
@@ -4162,6 +4162,24 @@
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Tinyblargon",
|
||||
"name": "Okean",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/76069640?v=4",
|
||||
"profile": "https://github.com/Tinyblargon",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "amedranogil",
|
||||
"name": "Alejandro Medrano",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/6515064?v=4",
|
||||
"profile": "https://www.lst.tfo.upm.es/alejandro-medrano/",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
+1
-1
@@ -67,7 +67,7 @@ Thanks goes to all of these wonderful people ([emoji key](https://github.com/ken
|
||||
| [<img src="https://avatars.githubusercontent.com/u/80526133?v=4" width="110px;"/><br /><sub>AlexanderWPapyrus</sub>](https://github.com/AlexanderWPapyrus)<br />[💻](https://github.com/snipe/snipe-it/commits?author=AlexanderWPapyrus "Code") | [<img src="https://avatars.githubusercontent.com/u/306231?v=4" width="110px;"/><br /><sub>Alexandr Hacicheant</sub>](https://github.com/disc)<br />[💻](https://github.com/snipe/snipe-it/commits?author=disc "Code") | [<img src="https://avatars.githubusercontent.com/u/3032891?v=4" width="110px;"/><br /><sub>Hex</sub>](https://hex128.io/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=hex128 "Code") | [<img src="https://avatars.githubusercontent.com/u/8697942?v=4" width="110px;"/><br /><sub>Arunas Skirius</sub>](https://github.com/arukompas)<br />[💻](https://github.com/snipe/snipe-it/commits?author=arukompas "Code") | [<img src="https://avatars.githubusercontent.com/u/104396?v=4" width="110px;"/><br /><sub>Ben Periton</sub>](https://github.com/benperiton)<br />[💻](https://github.com/snipe/snipe-it/commits?author=benperiton "Code") | [<img src="https://avatars.githubusercontent.com/u/11906832?v=4" width="110px;"/><br /><sub>Byron Wolfman</sub>](https://wolfman.dev/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=byronwolfman "Code") | [<img src="https://avatars.githubusercontent.com/u/56485508?v=4" width="110px;"/><br /><sub>Calvin</sub>](https://github.com/CalvinSchwartz)<br />[💻](https://github.com/snipe/snipe-it/commits?author=CalvinSchwartz "Code") |
|
||||
| [<img src="https://avatars.githubusercontent.com/u/181059?v=4" width="110px;"/><br /><sub>Juan Font</sub>](https://github.com/juanfont)<br />[💻](https://github.com/snipe/snipe-it/commits?author=juanfont "Code") | [<img src="https://avatars.githubusercontent.com/u/13137708?v=4" width="110px;"/><br /><sub>Juho Taipale</sub>](https://github.com/juhotaipale)<br />[💻](https://github.com/snipe/snipe-it/commits?author=juhotaipale "Code") | [<img src="https://avatars.githubusercontent.com/u/1007419?v=4" width="110px;"/><br /><sub>Korvin Szanto</sub>](https://github.com/KorvinSzanto)<br />[💻](https://github.com/snipe/snipe-it/commits?author=KorvinSzanto "Code") | [<img src="https://avatars.githubusercontent.com/u/8513053?v=4" width="110px;"/><br /><sub>Lewis Foster</sub>](https://lewisfoster.foo/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sniff122 "Code") | [<img src="https://avatars.githubusercontent.com/u/33877541?v=4" width="110px;"/><br /><sub>Logan Swartzendruber</sub>](https://github.com/loganswartz)<br />[💻](https://github.com/snipe/snipe-it/commits?author=loganswartz "Code") | [<img src="https://avatars.githubusercontent.com/u/1156208?v=4" width="110px;"/><br /><sub>Lorenzo P.</sub>](https://github.com/lopezio)<br />[💻](https://github.com/snipe/snipe-it/commits?author=lopezio "Code") | [<img src="https://avatars.githubusercontent.com/u/33946590?v=4" width="110px;"/><br /><sub>Lukas Jung</sub>](https://github.com/m4us1ne)<br />[💻](https://github.com/snipe/snipe-it/commits?author=m4us1ne "Code") |
|
||||
| [<img src="https://avatars.githubusercontent.com/u/10965027?v=4" width="110px;"/><br /><sub>Ellie</sub>](https://leafedfox.xyz/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=LeafedFox "Code") | [<img src="https://avatars.githubusercontent.com/u/20960555?v=4" width="110px;"/><br /><sub>GA Stamper</sub>](https://github.com/gastamper)<br />[💻](https://github.com/snipe/snipe-it/commits?author=gastamper "Code") | [<img src="https://avatars.githubusercontent.com/u/206553556?v=4" width="110px;"/><br /><sub>Guillaume Lefranc</sub>](https://github.com/gl-pup)<br />[💻](https://github.com/snipe/snipe-it/commits?author=gl-pup "Code") | [<img src="https://avatars.githubusercontent.com/u/733892?v=4" width="110px;"/><br /><sub>Hajo Möller</sub>](https://github.com/dasjoe)<br />[💻](https://github.com/snipe/snipe-it/commits?author=dasjoe "Code") | [<img src="https://avatars.githubusercontent.com/u/3420063?v=4" width="110px;"/><br /><sub>Istvan Basa</sub>](https://github.com/pottom)<br />[💻](https://github.com/snipe/snipe-it/commits?author=pottom "Code") | [<img src="https://avatars.githubusercontent.com/u/810824?v=4" width="110px;"/><br /><sub>JJ Asghar</sub>](https://jjasghar.github.io/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jjasghar "Code") | [<img src="https://avatars.githubusercontent.com/u/40404495?v=4" width="110px;"/><br /><sub>James E. Msenga</sub>](https://github.com/JemCdo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=JemCdo "Code") |
|
||||
| [<img src="https://avatars.githubusercontent.com/u/6865786?v=4" width="110px;"/><br /><sub>Jan Felix Wiebe</sub>](https://github.com/jfwiebe)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jfwiebe "Code") | [<img src="https://avatars.githubusercontent.com/u/43412008?v=4" width="110px;"/><br /><sub>Jo Drexl</sub>](https://www.nfon.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=drexljo "Code") | [<img src="https://avatars.githubusercontent.com/u/4807843?v=4" width="110px;"/><br /><sub>Austin Sasko</sub>](https://github.com/austinsasko)<br />[💻](https://github.com/snipe/snipe-it/commits?author=austinsasko "Code") | [<img src="https://avatars.githubusercontent.com/u/4875039?v=4" width="110px;"/><br /><sub>Jasson</sub>](http://jassoncordones.github.io)<br />[💻](https://github.com/snipe/snipe-it/commits?author=JassonCordones "Code") |
|
||||
| [<img src="https://avatars.githubusercontent.com/u/6865786?v=4" width="110px;"/><br /><sub>Jan Felix Wiebe</sub>](https://github.com/jfwiebe)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jfwiebe "Code") | [<img src="https://avatars.githubusercontent.com/u/43412008?v=4" width="110px;"/><br /><sub>Jo Drexl</sub>](https://www.nfon.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=drexljo "Code") | [<img src="https://avatars.githubusercontent.com/u/4807843?v=4" width="110px;"/><br /><sub>Austin Sasko</sub>](https://github.com/austinsasko)<br />[💻](https://github.com/snipe/snipe-it/commits?author=austinsasko "Code") | [<img src="https://avatars.githubusercontent.com/u/4875039?v=4" width="110px;"/><br /><sub>Jasson</sub>](http://jassoncordones.github.io)<br />[💻](https://github.com/snipe/snipe-it/commits?author=JassonCordones "Code") | [<img src="https://avatars.githubusercontent.com/u/76069640?v=4" width="110px;"/><br /><sub>Okean</sub>](https://github.com/Tinyblargon)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Tinyblargon "Code") | [<img src="https://avatars.githubusercontent.com/u/6515064?v=4" width="110px;"/><br /><sub>Alejandro Medrano</sub>](https://www.lst.tfo.upm.es/alejandro-medrano/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=amedranogil "Code") |
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
||||
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class FixUpAssignedTypeWithoutAssignedTo extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'snipeit:assigned-type-fixup';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Fixes up assets that have an assigned_type but no assigned_to';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
DB::table('assets')->whereNotNull('assigned_type')->whereNull('assigned_to')->update(['assigned_type' => null]);
|
||||
$this->info("Assets with an assigned_type but no assigned_to are fixed");
|
||||
}
|
||||
}
|
||||
@@ -99,8 +99,11 @@ class SendAcceptanceReminder extends Command
|
||||
foreach ($no_email_list as $user) {
|
||||
$rows[] = [$user['id'], $user['name']];
|
||||
}
|
||||
$this->info("The following users do not have an email address:");
|
||||
$this->table($headers, $rows);
|
||||
|
||||
if (!empty($rows)) {
|
||||
$this->info("The following users do not have an email address:");
|
||||
$this->table($headers, $rows);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ class CheckoutableCheckedIn
|
||||
$this->checkedOutTo = $checkedOutTo;
|
||||
$this->checkedInBy = $checkedInBy;
|
||||
$this->note = $note;
|
||||
$this->action_date = $action_date ?? date('Y-m-d');
|
||||
$this->action_date = $action_date ?? date('Y-m-d H:i:s');
|
||||
$this->originalValues = $originalValues;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ use Illuminate\Support\Facades\Log;
|
||||
use Throwable;
|
||||
use JsonException;
|
||||
use Carbon\Exceptions\InvalidFormatException;
|
||||
use Illuminate\Http\Exceptions\ThrottleRequestsException;
|
||||
|
||||
class Handler extends ExceptionHandler
|
||||
{
|
||||
@@ -107,11 +108,10 @@ class Handler extends ExceptionHandler
|
||||
|
||||
$statusCode = $e->getStatusCode();
|
||||
|
||||
// API throttle requests are handled in the RouteServiceProvider configureRateLimiting() method, so we don't need to handle them here
|
||||
switch ($e->getStatusCode()) {
|
||||
case '404':
|
||||
return response()->json(Helper::formatStandardApiResponse('error', null, $statusCode . ' endpoint not found'), 404);
|
||||
case '429':
|
||||
return response()->json(Helper::formatStandardApiResponse('error', null, 'Too many requests'), 429);
|
||||
case '405':
|
||||
return response()->json(Helper::formatStandardApiResponse('error', null, 'Method not allowed'), 405);
|
||||
default:
|
||||
@@ -143,6 +143,8 @@ class Handler extends ExceptionHandler
|
||||
$route = 'maintenances.index';
|
||||
} elseif ($route === 'licenseseats.index') {
|
||||
$route = 'licenses.index';
|
||||
} elseif ($route === 'customfields.index') {
|
||||
$route = 'fields.index';
|
||||
}
|
||||
|
||||
return redirect()
|
||||
@@ -201,6 +203,7 @@ class Handler extends ExceptionHandler
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
|
||||
$this->reportable(function (Throwable $e) {
|
||||
//
|
||||
});
|
||||
|
||||
@@ -1313,25 +1313,24 @@ class Helper
|
||||
switch ($item) {
|
||||
case 'asset':
|
||||
return 'fas fa-barcode';
|
||||
break;
|
||||
case 'accessory':
|
||||
return 'fas fa-keyboard';
|
||||
break;
|
||||
case 'component':
|
||||
return 'fas fa-hdd';
|
||||
break;
|
||||
case 'consumable':
|
||||
return 'fas fa-tint';
|
||||
break;
|
||||
case 'license':
|
||||
return 'far fa-save';
|
||||
break;
|
||||
case 'location':
|
||||
return 'fas fa-map-marker-alt';
|
||||
break;
|
||||
case 'user':
|
||||
return 'fas fa-user';
|
||||
break;
|
||||
case 'supplier':
|
||||
return 'fa-solid fa-store';
|
||||
case 'manufacturer':
|
||||
return 'fa-solid fa-building';
|
||||
case 'category':
|
||||
return 'fa-solid fa-table-columns';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -85,6 +85,12 @@ class AssetModelsController extends Controller
|
||||
$assetmodels = $assetmodels->where('models.model_number', '=', $request->input('model_number'));
|
||||
}
|
||||
|
||||
if ($request->input('requestable') == 'true') {
|
||||
$assetmodels = $assetmodels->where('models.requestable', '=', '1');
|
||||
} elseif ($request->input('requestable') == 'false') {
|
||||
$assetmodels = $assetmodels->where('models.requestable', '=', '0');
|
||||
}
|
||||
|
||||
if ($request->filled('notes')) {
|
||||
$assetmodels = $assetmodels->where('models.notes', '=', $request->input('notes'));
|
||||
}
|
||||
|
||||
@@ -1146,7 +1146,7 @@ class AssetsController extends Controller
|
||||
|
||||
// Validate the rest of the data before we turn off the event dispatcher
|
||||
if ($asset->isInvalid()) {
|
||||
return response()->json(Helper::formatStandardApiResponse('error', null, $asset->getErrors()));
|
||||
return response()->json(Helper::formatStandardApiResponse('error', ['asset_tag' => $asset->asset_tag], $asset->getErrors()));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -234,6 +234,15 @@ class ImportController extends Controller
|
||||
case 'location':
|
||||
$redirectTo = 'locations.index';
|
||||
break;
|
||||
case 'supplier':
|
||||
$redirectTo = 'suppliers.index';
|
||||
break;
|
||||
case 'manufacturer':
|
||||
$redirectTo = 'manufacturers.index';
|
||||
break;
|
||||
case 'category':
|
||||
$redirectTo = 'categories.index';
|
||||
break;
|
||||
}
|
||||
|
||||
if ($errors) { //Failure
|
||||
|
||||
@@ -87,7 +87,8 @@ class LocationsController extends Controller
|
||||
->withCount('accessories as accessories_count')
|
||||
->withCount('rtd_assets as rtd_assets_count')
|
||||
->withCount('children as children_count')
|
||||
->withCount('users as users_count');
|
||||
->withCount('users as users_count')
|
||||
->with('adminuser');
|
||||
|
||||
// Only scope locations if the setting is enabled
|
||||
if (Setting::getSettings()->scope_locations_fmcs) {
|
||||
@@ -218,6 +219,7 @@ class LocationsController extends Controller
|
||||
'locations.updated_at',
|
||||
'locations.image',
|
||||
'locations.currency',
|
||||
'locations.company_id',
|
||||
'locations.notes',
|
||||
])
|
||||
->withCount('assignedAssets as assigned_assets_count')
|
||||
|
||||
@@ -24,10 +24,15 @@ class SuppliersController extends Controller
|
||||
public function index(Request $request): array
|
||||
{
|
||||
$this->authorize('view', Supplier::class);
|
||||
$allowed_columns = ['
|
||||
id',
|
||||
$allowed_columns = [
|
||||
'id',
|
||||
'name',
|
||||
'address',
|
||||
'address2',
|
||||
'city',
|
||||
'state',
|
||||
'country',
|
||||
'zip',
|
||||
'phone',
|
||||
'contact',
|
||||
'fax',
|
||||
@@ -39,21 +44,24 @@ class SuppliersController extends Controller
|
||||
'components_count',
|
||||
'consumables_count',
|
||||
'url',
|
||||
'notes',
|
||||
];
|
||||
|
||||
$suppliers = Supplier::select(
|
||||
['id', 'name', 'address', 'address2', 'city', 'state', 'country', 'fax', 'phone', 'email', 'contact', 'created_at', 'updated_at', 'deleted_at', 'image', 'notes', 'url'])
|
||||
['id', 'name', 'address', 'address2', 'city', 'state', 'country', 'fax', 'phone', 'email', 'contact', 'created_at', 'created_by', 'updated_at', 'deleted_at', 'image', 'notes', 'url', 'zip'])
|
||||
->withCount('assets as assets_count')
|
||||
->withCount('licenses as licenses_count')
|
||||
->withCount('accessories as accessories_count')
|
||||
->withCount('components as components_count')
|
||||
->withCount('consumables as consumables_count');
|
||||
->withCount('consumables as consumables_count')
|
||||
->with('adminuser');
|
||||
|
||||
|
||||
if ($request->filled('search')) {
|
||||
$suppliers = $suppliers->TextSearch($request->input('search'));
|
||||
$suppliers->TextSearch($request->input('search'));
|
||||
}
|
||||
|
||||
|
||||
if ($request->filled('name')) {
|
||||
$suppliers->where('name', '=', $request->input('name'));
|
||||
}
|
||||
@@ -100,7 +108,15 @@ class SuppliersController extends Controller
|
||||
|
||||
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
|
||||
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at';
|
||||
$suppliers->orderBy($sort, $order);
|
||||
|
||||
switch ($request->input('sort')) {
|
||||
case 'created_by':
|
||||
$suppliers->OrderByCreatedByName($order);
|
||||
break;
|
||||
default:
|
||||
$suppliers->orderBy($sort, $order);
|
||||
break;
|
||||
}
|
||||
|
||||
$total = $suppliers->count();
|
||||
$suppliers = $suppliers->skip($offset)->take($limit)->get();
|
||||
|
||||
@@ -6,6 +6,7 @@ use App\Helpers\Helper;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\SaveUserRequest;
|
||||
use App\Http\Transformers\AccessoriesTransformer;
|
||||
use App\Http\Transformers\ActionlogsTransformer;
|
||||
use App\Http\Transformers\AssetsTransformer;
|
||||
use App\Http\Transformers\ConsumablesTransformer;
|
||||
use App\Http\Transformers\LicensesTransformer;
|
||||
@@ -80,7 +81,7 @@ class UsersController extends Controller
|
||||
'users.autoassign_licenses',
|
||||
'users.website',
|
||||
|
||||
])->with('manager', 'groups', 'userloc', 'company', 'department', 'assets', 'licenses', 'accessories', 'consumables', 'createdBy', 'managesUsers', 'managedLocations')
|
||||
])->with('manager', 'groups', 'userloc', 'company', 'department', 'assets', 'licenses', 'accessories', 'consumables', 'createdBy', 'managesUsers', 'managedLocations', 'eulas')
|
||||
->withCount([
|
||||
'assets as assets_count' => function(Builder $query) {
|
||||
$query->withoutTrashed();
|
||||
@@ -736,6 +737,25 @@ class UsersController extends Controller
|
||||
return (new UsersTransformer)->transformUser($request->user());
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the EULAs accepted by the user.
|
||||
*
|
||||
* @param \App\Models\User $user
|
||||
* @param \App\Http\Transformers\ActionlogsTransformer $transformer
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*@since [v8.1.16]
|
||||
* @author [Godfrey Martinez] [<gmartinez@grokability.com>]
|
||||
*/
|
||||
public function eulas(User $user, ActionlogsTransformer $transformer)
|
||||
{
|
||||
$this->authorize('view', Asset::class);
|
||||
|
||||
$eulas = $user->eulas;
|
||||
return response()->json(
|
||||
$transformer->transformActionlogs($eulas, $eulas->count())
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore a soft-deleted user.
|
||||
*
|
||||
|
||||
@@ -67,16 +67,10 @@ class AssetMaintenancesController extends Controller
|
||||
// We have to set this so that the correct property is set in the select2 ajax dropdown
|
||||
$asset->asset_id = $asset->id;
|
||||
}
|
||||
|
||||
// Prepare Asset Maintenance Type List
|
||||
$assetMaintenanceType = [
|
||||
'' => 'Select an asset maintenance type',
|
||||
] + AssetMaintenance::getImprovementOptions();
|
||||
// Mark the selected asset, if it came in
|
||||
|
||||
|
||||
return view('asset_maintenances/edit')
|
||||
->with('assetMaintenanceType', AssetMaintenance::getImprovementOptions())
|
||||
->with('asset', $asset)
|
||||
->with('assetMaintenanceType', $assetMaintenanceType)
|
||||
->with('item', new AssetMaintenance);
|
||||
}
|
||||
|
||||
@@ -91,43 +85,47 @@ class AssetMaintenancesController extends Controller
|
||||
public function store(Request $request) : RedirectResponse
|
||||
{
|
||||
$this->authorize('update', Asset::class);
|
||||
// create a new model instance
|
||||
$assetMaintenance = new AssetMaintenance();
|
||||
$assetMaintenance->supplier_id = $request->input('supplier_id');
|
||||
$assetMaintenance->is_warranty = $request->input('is_warranty');
|
||||
$assetMaintenance->cost = $request->input('cost');
|
||||
$assetMaintenance->notes = $request->input('notes');
|
||||
$asset = Asset::find($request->input('asset_id'));
|
||||
|
||||
if ((! Company::isCurrentUserHasAccess($asset)) && ($asset != null)) {
|
||||
return static::getInsufficientPermissionsRedirect();
|
||||
$assets = Asset::whereIn('id', $request->input('selected_assets'))->get();
|
||||
|
||||
foreach ($assets as $asset) {
|
||||
if ((! Company::isCurrentUserHasAccess($asset)) && ($asset != null)) {
|
||||
return static::getInsufficientPermissionsRedirect();
|
||||
}
|
||||
|
||||
$assetMaintenance = new AssetMaintenance();
|
||||
$assetMaintenance->supplier_id = $request->input('supplier_id');
|
||||
$assetMaintenance->is_warranty = $request->input('is_warranty');
|
||||
$assetMaintenance->cost = $request->input('cost');
|
||||
$assetMaintenance->notes = $request->input('notes');
|
||||
|
||||
// Save the asset maintenance data
|
||||
$assetMaintenance->asset_id = $asset->id;
|
||||
$assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type');
|
||||
$assetMaintenance->title = $request->input('title');
|
||||
$assetMaintenance->start_date = $request->input('start_date');
|
||||
$assetMaintenance->completion_date = $request->input('completion_date');
|
||||
$assetMaintenance->created_by = auth()->id();
|
||||
|
||||
if (($assetMaintenance->completion_date !== null)
|
||||
&& ($assetMaintenance->start_date !== '')
|
||||
&& ($assetMaintenance->start_date !== '0000-00-00')
|
||||
) {
|
||||
$startDate = Carbon::parse($assetMaintenance->start_date);
|
||||
$completionDate = Carbon::parse($assetMaintenance->completion_date);
|
||||
$assetMaintenance->asset_maintenance_time = (int) $completionDate->diffInDays($startDate, true);
|
||||
}
|
||||
|
||||
|
||||
// Was the asset maintenance created?
|
||||
if (!$assetMaintenance->save()) {
|
||||
return redirect()->back()->withInput()->withErrors($assetMaintenance->getErrors());
|
||||
}
|
||||
}
|
||||
|
||||
// Save the asset maintenance data
|
||||
$assetMaintenance->asset_id = $request->input('asset_id');
|
||||
$assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type');
|
||||
$assetMaintenance->title = $request->input('title');
|
||||
$assetMaintenance->start_date = $request->input('start_date');
|
||||
$assetMaintenance->completion_date = $request->input('completion_date');
|
||||
$assetMaintenance->created_by = auth()->id();
|
||||
return redirect()->route('maintenances.index')
|
||||
->with('success', trans('admin/asset_maintenances/message.create.success'));
|
||||
|
||||
if (($assetMaintenance->completion_date !== null)
|
||||
&& ($assetMaintenance->start_date !== '')
|
||||
&& ($assetMaintenance->start_date !== '0000-00-00')
|
||||
) {
|
||||
$startDate = Carbon::parse($assetMaintenance->start_date);
|
||||
$completionDate = Carbon::parse($assetMaintenance->completion_date);
|
||||
$assetMaintenance->asset_maintenance_time = (int) $completionDate->diffInDays($startDate, true);
|
||||
}
|
||||
|
||||
// Was the asset maintenance created?
|
||||
if ($assetMaintenance->save()) {
|
||||
// Redirect to the new asset maintenance page
|
||||
return redirect()->route('maintenances.index')
|
||||
->with('success', trans('admin/asset_maintenances/message.create.success'));
|
||||
}
|
||||
|
||||
return redirect()->back()->withInput()->withErrors($assetMaintenance->getErrors());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -149,7 +147,7 @@ class AssetMaintenancesController extends Controller
|
||||
}
|
||||
|
||||
// Prepare Improvement Type List
|
||||
$assetMaintenanceType = ['' => 'Select an improvement type'] + AssetMaintenance::getImprovementOptions();
|
||||
$assetMaintenanceType = ['' => trans('general.select')] + AssetMaintenance::getImprovementOptions();
|
||||
|
||||
return view('asset_maintenances/edit')
|
||||
->with('selectedAsset', null)
|
||||
|
||||
@@ -149,7 +149,7 @@ class AssetsController extends Controller
|
||||
$asset->byod = request('byod', 0);
|
||||
|
||||
if (! empty($settings->audit_interval)) {
|
||||
$asset->next_audit_date = Carbon::now()->addMonths($settings->audit_interval)->toDateString();
|
||||
$asset->next_audit_date = Carbon::now()->addMonths((int) $settings->audit_interval)->toDateString();
|
||||
}
|
||||
|
||||
// Set location_id to rtd_location_id ONLY if the asset isn't being checked out
|
||||
@@ -188,14 +188,31 @@ class AssetsController extends Controller
|
||||
|
||||
// Validate the asset before saving
|
||||
if ($asset->isValid() && $asset->save()) {
|
||||
if (request('assigned_user')) {
|
||||
$target = User::find(request('assigned_user'));
|
||||
$target = null;
|
||||
$location = null;
|
||||
|
||||
if ($userId = request('assigned_user')) {
|
||||
$target = User::find($userId);
|
||||
|
||||
if (!$target) {
|
||||
return redirect()->back()->withInput()->with('error', trans('admin/hardware/message.create.target_not_found.user'));
|
||||
}
|
||||
$location = $target->location_id;
|
||||
} elseif (request('assigned_asset')) {
|
||||
$target = Asset::find(request('assigned_asset'));
|
||||
|
||||
} elseif ($assetId = request('assigned_asset')) {
|
||||
$target = Asset::find($assetId);
|
||||
|
||||
if (!$target) {
|
||||
return redirect()->back()->withInput()->with('error', trans('admin/hardware/message.create.target_not_found.asset'));
|
||||
}
|
||||
$location = $target->location_id;
|
||||
} elseif (request('assigned_location')) {
|
||||
$target = Location::find(request('assigned_location'));
|
||||
|
||||
} elseif ($locationId = request('assigned_location')) {
|
||||
$target = Location::find($locationId);
|
||||
|
||||
if (!$target) {
|
||||
return redirect()->back()->withInput()->with('error', trans('admin/hardware/message.create.target_not_found.location'));
|
||||
}
|
||||
$location = $target->id;
|
||||
}
|
||||
|
||||
@@ -446,7 +463,7 @@ class AssetsController extends Controller
|
||||
event(new CheckoutableCheckedIn($asset, $target, auth()->user(), 'Checkin on delete', $checkin_at, $originalValues));
|
||||
DB::table('assets')
|
||||
->where('id', $asset->id)
|
||||
->update(['assigned_to' => null]);
|
||||
->update(['assigned_to' => null, 'assigned_type' => null]);
|
||||
}
|
||||
|
||||
|
||||
@@ -458,6 +475,7 @@ class AssetsController extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$asset->delete();
|
||||
|
||||
return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.delete.success'));
|
||||
@@ -890,7 +908,7 @@ class AssetsController extends Controller
|
||||
return redirect()->route('hardware.edit', $asset)->withErrors($asset->getErrors());
|
||||
}
|
||||
|
||||
$dt = Carbon::now()->addMonths($settings->audit_interval)->toDateString();
|
||||
$dt = Carbon::now()->addMonths( (int) $settings->audit_interval)->toDateString();
|
||||
return view('hardware/audit')->with('asset', $asset)->with('item', $asset)->with('next_audit_date', $dt)->with('locations_list');
|
||||
}
|
||||
|
||||
|
||||
@@ -52,11 +52,17 @@ class BulkAssetsController extends Controller
|
||||
}
|
||||
|
||||
$asset_ids = $request->input('ids');
|
||||
|
||||
if ($request->input('bulk_actions') === 'checkout') {
|
||||
$request->session()->flashInput(['selected_assets' => $asset_ids]);
|
||||
return redirect()->route('hardware.bulkcheckout.show');
|
||||
}
|
||||
|
||||
if ($request->input('bulk_actions') === 'maintenance') {
|
||||
$request->session()->flashInput(['selected_assets' => $asset_ids]);
|
||||
return redirect()->route('maintenances.create');
|
||||
}
|
||||
|
||||
// Figure out where we need to send the user after the update is complete, and store that in the session
|
||||
$bulk_back_url = request()->headers->get('referer');
|
||||
session(['bulk_back_url' => $bulk_back_url]);
|
||||
@@ -562,7 +568,10 @@ class BulkAssetsController extends Controller
|
||||
public function showCheckout() : View
|
||||
{
|
||||
$this->authorize('checkout', Asset::class);
|
||||
return view('hardware/bulk-checkout');
|
||||
|
||||
$do_not_change = ['' => trans('general.do_not_change')];
|
||||
$status_label_list = $do_not_change + Helper::deployableStatusLabelList();
|
||||
return view('hardware/bulk-checkout')->with('statusLabel_list', $status_label_list);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -594,13 +603,13 @@ class BulkAssetsController extends Controller
|
||||
}
|
||||
$checkout_at = date('Y-m-d H:i:s');
|
||||
if (($request->filled('checkout_at')) && ($request->get('checkout_at') != date('Y-m-d'))) {
|
||||
$checkout_at = e($request->get('checkout_at'));
|
||||
$checkout_at = $request->get('checkout_at');
|
||||
}
|
||||
|
||||
$expected_checkin = '';
|
||||
|
||||
if ($request->filled('expected_checkin')) {
|
||||
$expected_checkin = e($request->get('expected_checkin'));
|
||||
$expected_checkin = $request->get('expected_checkin');
|
||||
}
|
||||
|
||||
$errors = [];
|
||||
@@ -608,6 +617,11 @@ class BulkAssetsController extends Controller
|
||||
foreach ($assets as $asset) {
|
||||
$this->authorize('checkout', $asset);
|
||||
|
||||
// See if there is a status label passed
|
||||
if ($request->filled('status_id')) {
|
||||
$asset->status_id = $request->get('status_id');
|
||||
}
|
||||
|
||||
$checkout_success = $asset->checkOut($target, $admin, $checkout_at, $expected_checkin, e($request->get('note')), $asset->name, null);
|
||||
|
||||
//TODO - I think this logic is duplicated in the checkOut method?
|
||||
|
||||
@@ -650,6 +650,7 @@ class SettingsController extends Controller
|
||||
|
||||
$setting->alert_email = $alert_email;
|
||||
$setting->admin_cc_email = $admin_cc_email;
|
||||
$setting->admin_cc_always = $request->validated('admin_cc_always');
|
||||
$setting->alerts_enabled = $request->input('alerts_enabled', '0');
|
||||
$setting->alert_interval = $request->input('alert_interval');
|
||||
$setting->alert_threshold = $request->input('alert_threshold');
|
||||
|
||||
@@ -73,6 +73,7 @@ class Kernel extends HttpKernel
|
||||
'can' => \Illuminate\Auth\Middleware\Authorize::class,
|
||||
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
|
||||
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
|
||||
'api-throttle' => \App\Http\Middleware\SetAPIResponseHeaders::class,
|
||||
'health' => null,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Routing\Middleware\ThrottleRequests;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class SetAPIResponseHeaders extends ThrottleRequests
|
||||
{
|
||||
|
||||
/**
|
||||
* Add the rate limit headers to the response.
|
||||
*
|
||||
* This extends the original ThrottleRequests middleware to add the 'X-RateLimit-Reset' and 'Retry-After' headers, even
|
||||
* if the rate limit is not exceeded.
|
||||
* @param $maxAttempts
|
||||
* @param $remainingAttempts
|
||||
* @param $retryAfter
|
||||
* @param Response|null $response
|
||||
* @return array|int[]
|
||||
*/
|
||||
protected function getHeaders($maxAttempts, $remainingAttempts, $retryAfter = null, ?Response $response = null)
|
||||
{
|
||||
if ($response &&
|
||||
! is_null($response->headers->get('X-RateLimit-Remaining')) &&
|
||||
(int) $response->headers->get('X-RateLimit-Remaining') <= (int) $remainingAttempts) {
|
||||
$headers = [];
|
||||
$headers['Retry-After'] = $retryAfter; // this is the only line we changed
|
||||
$headers['X-RateLimit-Reset'] = $retryAfter; // this is the only line we changed
|
||||
$headers['X-RateLimit-Reset-Timestamp'] = $this->availableAt($retryAfter); // this is the only line we changed
|
||||
return $headers;
|
||||
}
|
||||
|
||||
$headers = [
|
||||
'X-RateLimit-Limit' => $maxAttempts,
|
||||
'X-RateLimit-Remaining' => $remainingAttempts,
|
||||
];
|
||||
|
||||
if (! is_null($retryAfter)) {
|
||||
$headers['Retry-After'] = $retryAfter;
|
||||
$headers['X-RateLimit-Reset'] = $retryAfter; // this is the only line we changed
|
||||
$headers['X-RateLimit-Reset-Timestamp'] = $this->availableAt($retryAfter); // this is the only line we changed
|
||||
}
|
||||
|
||||
return $headers;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
protected function handleRequest($request, Closure $next, array $limits)
|
||||
{
|
||||
foreach ($limits as $limit) {
|
||||
if ($this->limiter->tooManyAttempts($limit->key, $limit->maxAttempts)) {
|
||||
throw $this->buildException($request, $limit->key, $limit->maxAttempts, $limit->responseCallback);
|
||||
}
|
||||
|
||||
$this->limiter->hit($limit->key, $limit->decaySeconds);
|
||||
}
|
||||
|
||||
$response = $next($request);
|
||||
|
||||
foreach ($limits as $limit) {
|
||||
$response = $this->addHeaders(
|
||||
$response,
|
||||
$limit->maxAttempts,
|
||||
$this->calculateRemainingAttempts($limit->key, $limit->maxAttempts),
|
||||
$this->getTimeUntilNextRetry($limit->key) // this is the only line we changed
|
||||
);
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -37,8 +37,8 @@ class StoreLabelSettings extends FormRequest
|
||||
|
||||
return [
|
||||
'labels_per_page' => 'numeric',
|
||||
'labels_width' => 'numeric',
|
||||
'labels_height' => 'numeric',
|
||||
'labels_width' => 'numeric|min:0.1',
|
||||
'labels_height' => 'numeric|min:0.1',
|
||||
'labels_pmargin_left' => 'numeric|nullable',
|
||||
'labels_pmargin_right' => 'numeric|nullable',
|
||||
'labels_pmargin_top' => 'numeric|nullable',
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Http\Requests;
|
||||
use App\Models\Accessory;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class StoreNotificationSettings extends FormRequest
|
||||
{
|
||||
@@ -26,6 +27,9 @@ class StoreNotificationSettings extends FormRequest
|
||||
return [
|
||||
'alert_email' => 'email_array|nullable',
|
||||
'admin_cc_email' => 'email_array|nullable',
|
||||
'admin_cc_always' => [
|
||||
Rule::in('0', '1'),
|
||||
],
|
||||
'alert_threshold' => 'numeric|nullable',
|
||||
'alert_interval' => 'numeric|nullable|gt:0',
|
||||
'audit_warning_days' => 'numeric|nullable',
|
||||
|
||||
@@ -57,6 +57,10 @@ class LocationsTransformer
|
||||
'ldap_ou' => ($location->ldap_ou) ? e($location->ldap_ou) : null,
|
||||
'notes' => Helper::parseEscapedMarkedownInline($location->notes),
|
||||
'created_at' => Helper::getFormattedDateObject($location->created_at, 'datetime'),
|
||||
'created_by' => $location->adminuser ? [
|
||||
'id' => (int) $location->adminuser->id,
|
||||
'name'=> e($location->adminuser->present()->fullName),
|
||||
]: null,
|
||||
'updated_at' => Helper::getFormattedDateObject($location->updated_at, 'datetime'),
|
||||
'parent' => ($location->parent) ? [
|
||||
'id' => (int) $location->parent->id,
|
||||
|
||||
@@ -45,6 +45,10 @@ class SuppliersTransformer
|
||||
'components_count' => (int) $supplier->components_count,
|
||||
'notes' => ($supplier->notes) ? Helper::parseEscapedMarkedownInline($supplier->notes) : null,
|
||||
'created_at' => Helper::getFormattedDateObject($supplier->created_at, 'datetime'),
|
||||
'created_by' => $supplier->adminuser ? [
|
||||
'id' => (int) $supplier->adminuser->id,
|
||||
'name'=> e($supplier->adminuser->present()->fullName),
|
||||
]: null,
|
||||
'updated_at' => Helper::getFormattedDateObject($supplier->updated_at, 'datetime'),
|
||||
|
||||
];
|
||||
|
||||
@@ -80,7 +80,16 @@ class AssetImporter extends ItemImporter
|
||||
$asset_tag = Asset::autoincrement_asset();
|
||||
}
|
||||
|
||||
$asset = Asset::where(['asset_tag'=> (string) $asset_tag])->first();
|
||||
|
||||
|
||||
if ($this->findCsvMatch($row, 'id')!='') {
|
||||
// Override asset if an ID was given
|
||||
\Log::debug('Finding asset by ID: '.$this->findCsvMatch($row, 'id'));
|
||||
$asset = Asset::find($this->findCsvMatch($row, 'id'));
|
||||
} else {
|
||||
$asset = Asset::where(['asset_tag'=> (string) $asset_tag])->first();
|
||||
}
|
||||
|
||||
if ($asset) {
|
||||
if (! $this->updating) {
|
||||
$exists_error = trans('general.import_asset_tag_exists', ['asset_tag' => $asset_tag]);
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
namespace App\Importer;
|
||||
|
||||
use App\Models\Category;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
/**
|
||||
* When we are importing users via an Asset/etc import, we use createOrFetchUser() in
|
||||
* Importer\Importer.php. [ALG]
|
||||
*
|
||||
* Class CategoryImporter
|
||||
*/
|
||||
class CategoryImporter extends ItemImporter
|
||||
{
|
||||
protected $categories;
|
||||
|
||||
public function __construct($filename)
|
||||
{
|
||||
parent::__construct($filename);
|
||||
}
|
||||
|
||||
protected function handle($row)
|
||||
{
|
||||
parent::handle($row);
|
||||
$this->createCategoryIfNotExists($row);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a category if a duplicate does not exist.
|
||||
* @todo Investigate how this should interact with Importer::createCategoryIfNotExists
|
||||
*
|
||||
* @author A. Gianotto
|
||||
* @since 6.1.0
|
||||
* @param array $row
|
||||
*/
|
||||
public function createCategoryIfNotExists(array $row)
|
||||
{
|
||||
|
||||
$editingCategory = false;
|
||||
|
||||
$category = Category::where('name', '=', $this->findCsvMatch($row, 'name'))->first();
|
||||
|
||||
if ($this->findCsvMatch($row, 'id')!='') {
|
||||
// Override category if an ID was given
|
||||
\Log::debug('Finding category by ID: '.$this->findCsvMatch($row, 'id'));
|
||||
$category = Category::find($this->findCsvMatch($row, 'id'));
|
||||
}
|
||||
|
||||
|
||||
if ($category) {
|
||||
if (! $this->updating) {
|
||||
$this->log('A matching Category '.$this->item['name'].' already exists');
|
||||
return;
|
||||
}
|
||||
|
||||
$this->log('Updating Category');
|
||||
$editingCategory = true;
|
||||
} else {
|
||||
$this->log('No Matching Category, Create a new one');
|
||||
$category = new Category;
|
||||
$category->created_by = auth()->id();
|
||||
}
|
||||
|
||||
// Pull the records from the CSV to determine their values
|
||||
$this->item['name'] = trim($this->findCsvMatch($row, 'name'));
|
||||
$this->item['notes'] = trim($this->findCsvMatch($row, 'notes'));
|
||||
$this->item['eula_text'] = trim($this->findCsvMatch($row, 'eula_text'));
|
||||
$this->item['category_type'] = trim($this->findCsvMatch($row, 'category_type'));
|
||||
$this->item['use_default_eula'] = trim(($this->fetchHumanBoolean($this->findCsvMatch($row, 'use_default_eula'))) == 1) ? 1 : 0;
|
||||
$this->item['require_acceptance'] = trim(($this->fetchHumanBoolean($this->findCsvMatch($row, 'require_acceptance'))) == 1) ? 1 : 0;
|
||||
$this->item['checkin_email'] = trim(($this->fetchHumanBoolean($this->findCsvMatch($row, 'checkin_email'))) == 1) ? 1 : 0;
|
||||
|
||||
|
||||
Log::debug('Item array is: ');
|
||||
Log::debug(print_r($this->item, true));
|
||||
|
||||
|
||||
if ($editingCategory) {
|
||||
Log::debug('Updating existing category');
|
||||
$category->update($this->sanitizeItemForUpdating($category));
|
||||
} else {
|
||||
Log::debug('Creating category');
|
||||
$category->fill($this->sanitizeItemForStoring($category));
|
||||
}
|
||||
|
||||
if ($category->save()) {
|
||||
$this->log('Category '.$category->name.' created or updated from CSV import');
|
||||
return $category;
|
||||
|
||||
} else {
|
||||
Log::debug($category->getErrors());
|
||||
$this->logError($category, 'Category "'.$this->item['name'].'"');
|
||||
return $category->errors;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -110,7 +110,7 @@ class ItemImporter extends Importer
|
||||
protected function determineCheckout($row)
|
||||
{
|
||||
// Locations don't get checked out to anyone/anything
|
||||
if ((get_class($this) == LocationImporter::class) || (get_class($this) == AssetModelImporter::class)) {
|
||||
if ((get_class($this) == LocationImporter::class) || (get_class($this) == AssetModelImporter::class) || (get_class($this) == SupplierImporter::class) || (get_class($this) == ManufacturerImporter::class) || (get_class($this) == CategoryImporter::class)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
namespace App\Importer;
|
||||
|
||||
use App\Models\Manufacturer;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
/**
|
||||
* When we are importing users via an Asset/etc import, we use createOrFetchUser() in
|
||||
* Importer\Importer.php. [ALG]
|
||||
*
|
||||
* Class ManufacturerImporter
|
||||
*/
|
||||
class ManufacturerImporter extends ItemImporter
|
||||
{
|
||||
protected $manufacturers;
|
||||
|
||||
public function __construct($filename)
|
||||
{
|
||||
parent::__construct($filename);
|
||||
}
|
||||
|
||||
protected function handle($row)
|
||||
{
|
||||
parent::handle($row);
|
||||
$this->createManufacturerIfNotExists($row);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a supplier if a duplicate does not exist.
|
||||
* @todo Investigate how this should interact with Importer::createManufacturerIfNotExists
|
||||
*
|
||||
* @author A. Gianotto
|
||||
* @since 6.1.0
|
||||
* @param array $row
|
||||
*/
|
||||
public function createManufacturerIfNotExists(array $row)
|
||||
{
|
||||
|
||||
$editingManufacturer = false;
|
||||
|
||||
$supplier = Manufacturer::where('name', '=', $this->findCsvMatch($row, 'name'))->first();
|
||||
|
||||
if ($this->findCsvMatch($row, 'id')!='') {
|
||||
// Override supplier if an ID was given
|
||||
\Log::debug('Finding supplier by ID: '.$this->findCsvMatch($row, 'id'));
|
||||
$supplier = Manufacturer::find($this->findCsvMatch($row, 'id'));
|
||||
}
|
||||
|
||||
|
||||
if ($supplier) {
|
||||
if (! $this->updating) {
|
||||
$this->log('A matching Manufacturer '.$this->item['name'].' already exists');
|
||||
return;
|
||||
}
|
||||
|
||||
$this->log('Updating Manufacturer');
|
||||
$editingManufacturer = true;
|
||||
} else {
|
||||
$this->log('No Matching Manufacturer, Create a new one');
|
||||
$supplier = new Manufacturer;
|
||||
$supplier->created_by = auth()->id();
|
||||
}
|
||||
|
||||
// Pull the records from the CSV to determine their values
|
||||
$this->item['name'] = trim($this->findCsvMatch($row, 'name'));
|
||||
$this->item['support_phone'] = trim($this->findCsvMatch($row, 'support_phone'));
|
||||
$this->item['fax'] = trim($this->findCsvMatch($row, 'fax'));
|
||||
$this->item['support_email'] = trim($this->findCsvMatch($row, 'support_email'));
|
||||
$this->item['contact'] = trim($this->findCsvMatch($row, 'contact'));
|
||||
$this->item['url'] = trim($this->findCsvMatch($row, 'url'));
|
||||
$this->item['support_url'] = trim($this->findCsvMatch($row, 'support_url'));
|
||||
$this->item['warranty_lookup_url'] = trim($this->findCsvMatch($row, 'warranty_lookup_url'));
|
||||
$this->item['notes'] = trim($this->findCsvMatch($row, 'notes'));
|
||||
|
||||
|
||||
Log::debug('Item array is: ');
|
||||
Log::debug(print_r($this->item, true));
|
||||
|
||||
|
||||
if ($editingManufacturer) {
|
||||
Log::debug('Updating existing supplier');
|
||||
$supplier->update($this->sanitizeItemForUpdating($supplier));
|
||||
} else {
|
||||
Log::debug('Creating supplier');
|
||||
$supplier->fill($this->sanitizeItemForStoring($supplier));
|
||||
}
|
||||
|
||||
if ($supplier->save()) {
|
||||
$this->log('Manufacturer '.$supplier->name.' created or updated from CSV import');
|
||||
return $supplier;
|
||||
|
||||
} else {
|
||||
Log::debug($supplier->getErrors());
|
||||
$this->logError($supplier, 'Manufacturer "'.$this->item['name'].'"');
|
||||
return $supplier->errors;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
namespace App\Importer;
|
||||
|
||||
use App\Models\Supplier;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
/**
|
||||
* When we are importing users via an Asset/etc import, we use createOrFetchUser() in
|
||||
* Importer\Importer.php. [ALG]
|
||||
*
|
||||
* Class SupplierImporter
|
||||
*/
|
||||
class SupplierImporter extends ItemImporter
|
||||
{
|
||||
protected $suppliers;
|
||||
|
||||
public function __construct($filename)
|
||||
{
|
||||
parent::__construct($filename);
|
||||
}
|
||||
|
||||
protected function handle($row)
|
||||
{
|
||||
parent::handle($row);
|
||||
$this->createSupplierIfNotExists($row);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a supplier if a duplicate does not exist.
|
||||
* @todo Investigate how this should interact with Importer::createSupplierIfNotExists
|
||||
*
|
||||
* @author A. Gianotto
|
||||
* @since 6.1.0
|
||||
* @param array $row
|
||||
*/
|
||||
public function createSupplierIfNotExists(array $row)
|
||||
{
|
||||
|
||||
$editingSupplier = false;
|
||||
|
||||
$supplier = Supplier::where('name', '=', $this->findCsvMatch($row, 'name'))->first();
|
||||
|
||||
if ($this->findCsvMatch($row, 'id')!='') {
|
||||
// Override supplier if an ID was given
|
||||
\Log::debug('Finding supplier by ID: '.$this->findCsvMatch($row, 'id'));
|
||||
$supplier = Supplier::find($this->findCsvMatch($row, 'id'));
|
||||
}
|
||||
|
||||
|
||||
if ($supplier) {
|
||||
if (! $this->updating) {
|
||||
$this->log('A matching Supplier '.$this->item['name'].' already exists');
|
||||
return;
|
||||
}
|
||||
|
||||
$this->log('Updating Supplier');
|
||||
$editingSupplier = true;
|
||||
} else {
|
||||
$this->log('No Matching Supplier, Create a new one');
|
||||
$supplier = new Supplier;
|
||||
$supplier->created_by = auth()->id();
|
||||
}
|
||||
|
||||
// Pull the records from the CSV to determine their values
|
||||
$this->item['name'] = trim($this->findCsvMatch($row, 'name'));
|
||||
$this->item['address'] = trim($this->findCsvMatch($row, 'address'));
|
||||
$this->item['address2'] = trim($this->findCsvMatch($row, 'address2'));
|
||||
$this->item['city'] = trim($this->findCsvMatch($row, 'city'));
|
||||
$this->item['state'] = trim($this->findCsvMatch($row, 'state'));
|
||||
$this->item['country'] = trim($this->findCsvMatch($row, 'country'));
|
||||
$this->item['zip'] = trim($this->findCsvMatch($row, 'zip'));
|
||||
$this->item['phone'] = trim($this->findCsvMatch($row, 'phone'));
|
||||
$this->item['fax'] = trim($this->findCsvMatch($row, 'fax'));
|
||||
$this->item['email'] = trim($this->findCsvMatch($row, 'email'));
|
||||
$this->item['contact'] = trim($this->findCsvMatch($row, 'contact'));
|
||||
$this->item['url'] = trim($this->findCsvMatch($row, 'url'));
|
||||
$this->item['notes'] = trim($this->findCsvMatch($row, 'notes'));
|
||||
|
||||
|
||||
Log::debug('Item array is: ');
|
||||
Log::debug(print_r($this->item, true));
|
||||
|
||||
|
||||
if ($editingSupplier) {
|
||||
Log::debug('Updating existing supplier');
|
||||
$supplier->update($this->sanitizeItemForUpdating($supplier));
|
||||
} else {
|
||||
Log::debug('Creating supplier');
|
||||
$supplier->fill($this->sanitizeItemForStoring($supplier));
|
||||
}
|
||||
|
||||
if ($supplier->save()) {
|
||||
$this->log('Supplier '.$supplier->name.' created or updated from CSV import');
|
||||
return $supplier;
|
||||
|
||||
} else {
|
||||
Log::debug($supplier->getErrors());
|
||||
$this->logError($supplier, 'Supplier "'.$this->item['name'].'"');
|
||||
return $supplier->errors;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -69,16 +69,16 @@ class CheckoutableListener
|
||||
return;
|
||||
}
|
||||
|
||||
$acceptance = $this->getCheckoutAcceptance($event);
|
||||
|
||||
$shouldSendEmailToUser = $this->shouldSendCheckoutEmailToUser($event->checkoutable);
|
||||
$shouldSendEmailToAlertAddress = $this->shouldSendEmailToAlertAddress();
|
||||
$shouldSendEmailToAlertAddress = $this->shouldSendEmailToAlertAddress($acceptance);
|
||||
$shouldSendWebhookNotification = $this->shouldSendWebhookNotification();
|
||||
|
||||
if (!$shouldSendEmailToUser && !$shouldSendEmailToAlertAddress && !$shouldSendWebhookNotification) {
|
||||
return;
|
||||
}
|
||||
|
||||
$acceptance = $this->getCheckoutAcceptance($event);
|
||||
|
||||
if ($shouldSendEmailToUser || $shouldSendEmailToAlertAddress) {
|
||||
$mailable = $this->getCheckoutMailType($event, $acceptance);
|
||||
$notifiable = $this->getNotifiableUser($event);
|
||||
@@ -419,9 +419,19 @@ class CheckoutableListener
|
||||
return false;
|
||||
}
|
||||
|
||||
private function shouldSendEmailToAlertAddress(): bool
|
||||
private function shouldSendEmailToAlertAddress($acceptance = null): bool
|
||||
{
|
||||
return Setting::getSettings() && Setting::getSettings()->admin_cc_email;
|
||||
$setting = Setting::getSettings();
|
||||
|
||||
if (!$setting) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (is_null($acceptance) && !$setting->admin_cc_always) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return (bool) $setting->admin_cc_email;
|
||||
}
|
||||
|
||||
private function getFormattedAlertAddresses(): array
|
||||
|
||||
@@ -35,10 +35,14 @@ class Importer extends Component
|
||||
public $accessories_fields;
|
||||
public $assets_fields;
|
||||
public $users_fields;
|
||||
public $assetmodels_fields;
|
||||
public $suppliers_fields;
|
||||
public $licenses_fields;
|
||||
public $locations_fields;
|
||||
public $consumables_fields;
|
||||
public $components_fields;
|
||||
public $manufacturers_fields;
|
||||
public $categories_fields;
|
||||
public $aliases_fields;
|
||||
|
||||
protected $rules = [
|
||||
@@ -85,9 +89,6 @@ class Importer extends Component
|
||||
case 'component':
|
||||
$results = $this->components_fields;
|
||||
break;
|
||||
case 'consumable':
|
||||
$results = $this->consumables_fields;
|
||||
break;
|
||||
case 'license':
|
||||
$results = $this->licenses_fields;
|
||||
break;
|
||||
@@ -97,8 +98,14 @@ class Importer extends Component
|
||||
case 'location':
|
||||
$results = $this->locations_fields;
|
||||
break;
|
||||
case 'user':
|
||||
$results = $this->users_fields;
|
||||
case 'supplier':
|
||||
$results = $this->suppliers_fields;
|
||||
break;
|
||||
case 'manufacturer':
|
||||
$results = $this->manufacturers_fields;
|
||||
break;
|
||||
case 'category':
|
||||
$results = $this->categories_fields;
|
||||
break;
|
||||
default:
|
||||
$results = [];
|
||||
@@ -128,7 +135,7 @@ class Importer extends Component
|
||||
//yes, this key *is* valid. Continue on to the next field.
|
||||
continue;
|
||||
} else {
|
||||
//no, this key is *INVALID* for this import type. Better set it to null
|
||||
//no, this key is *INVALID* for this import type. Better set it to null,
|
||||
// and we'll hope that the $aliases_fields or something else picks it up.
|
||||
$this->field_map[$i] = null; // fingers crossed! But it's not likely, tbh.
|
||||
} // TODO - strictly speaking, this isn't necessary here I don't think.
|
||||
@@ -149,7 +156,7 @@ class Importer extends Component
|
||||
// in "Accessories"!)
|
||||
if (array_key_exists($key, $this->columnOptions[$type])) {
|
||||
$this->field_map[$i] = $key;
|
||||
continue 3; // bust out of both of these loops; as well as the surrounding one - e.g. move on to the next header
|
||||
continue 3; // bust out of both of these loops and the surrounding one - e.g. move on to the next header
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -171,6 +178,9 @@ class Importer extends Component
|
||||
'license' => trans('general.licenses'),
|
||||
'location' => trans('general.locations'),
|
||||
'user' => trans('general.users'),
|
||||
'supplier' => trans('general.suppliers'),
|
||||
'manufacturer' => trans('general.manufacturers'),
|
||||
'category' => trans('general.categories'),
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -193,6 +203,7 @@ class Importer extends Component
|
||||
];
|
||||
|
||||
$this->assets_fields = [
|
||||
'id' => trans('general.id'),
|
||||
'asset_eol_date' => trans('admin/hardware/form.eol_date'),
|
||||
'asset_model' => trans('general.model_name'),
|
||||
'asset_notes' => trans('general.item_notes', ['item' => trans('admin/hardware/general.asset')]),
|
||||
@@ -332,6 +343,7 @@ class Importer extends Component
|
||||
|
||||
$this->locations_fields = [
|
||||
'id' => trans('general.id'),
|
||||
'name' => trans('general.name'),
|
||||
'address' => trans('general.address'),
|
||||
'address2' => trans('general.importer.address2'),
|
||||
'city' => trans('general.city'),
|
||||
@@ -340,13 +352,52 @@ class Importer extends Component
|
||||
'ldap_ou' => trans('admin/locations/table.ldap_ou'),
|
||||
'manager' => trans('general.importer.manager_full_name'),
|
||||
'manager_username' => trans('general.importer.manager_username'),
|
||||
'name' => trans('general.item_name_var', ['item' => trans('general.location')]),
|
||||
'notes' => trans('general.notes'),
|
||||
'parent_location' => trans('admin/locations/table.parent'),
|
||||
'state' => trans('general.state'),
|
||||
'zip' => trans('general.zip'),
|
||||
];
|
||||
|
||||
$this->suppliers_fields = [
|
||||
'id' => trans('general.id'),
|
||||
'name' => trans('general.name'),
|
||||
'address' => trans('general.address'),
|
||||
'address2' => trans('general.importer.address2'),
|
||||
'city' => trans('general.city'),
|
||||
'notes' => trans('general.notes'),
|
||||
'state' => trans('general.state'),
|
||||
'zip' => trans('general.zip'),
|
||||
'phone' => trans('general.phone'),
|
||||
'fax' => trans('general.fax'),
|
||||
'url' => trans('general.url'),
|
||||
'contact' => trans('general.contact'),
|
||||
'email' => trans('general.email'),
|
||||
];
|
||||
|
||||
$this->manufacturers_fields = [
|
||||
'id' => trans('general.id'),
|
||||
'name' => trans('general.name'),
|
||||
'notes' => trans('general.notes'),
|
||||
'support_phone' => trans('admin/manufacturers/table.support_phone'),
|
||||
'support_url' => trans('admin/manufacturers/table.support_url'),
|
||||
'support_email' => trans('admin/manufacturers/table.support_email'),
|
||||
'warranty_lookup_url' => trans('admin/manufacturers/table.warranty_lookup_url'),
|
||||
'url' => trans('general.url'),
|
||||
];
|
||||
|
||||
$this->categories_fields = [
|
||||
'id' => trans('general.id'),
|
||||
'name' => trans('general.name'),
|
||||
'notes' => trans('general.notes'),
|
||||
'category_type' => trans('admin/categories/general.import_category_type'),
|
||||
'eula_text' => trans('admin/categories/general.import_eula_text'),
|
||||
'use_default_eula' => trans('admin/categories/general.use_default_eula_column'),
|
||||
'require_acceptance' => trans('admin/categories/general.import_require_acceptance'),
|
||||
'checkin_email' => trans('admin/categories/general.import_checkin_email'),
|
||||
];
|
||||
|
||||
|
||||
|
||||
$this->assetmodels_fields = [
|
||||
'category' => trans('general.category'),
|
||||
'eol' => trans('general.eol'),
|
||||
@@ -371,6 +422,8 @@ class Importer extends Component
|
||||
'consumable name',
|
||||
'component name',
|
||||
'name',
|
||||
'supplier name',
|
||||
'location name',
|
||||
],
|
||||
'item_no' => [
|
||||
'item number',
|
||||
|
||||
@@ -113,7 +113,13 @@ class Actionlog extends SnipeModel
|
||||
} elseif (auth()->user() && auth()->user()->company) {
|
||||
$actionlog->company_id = auth()->user()->company_id;
|
||||
}
|
||||
|
||||
if ($actionlog->action_date == '') {
|
||||
$actionlog->action_date = Carbon::now();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -122,9 +122,9 @@ class Asset extends Depreciable
|
||||
'assigned_to' => ['nullable', 'integer', 'required_with:assigned_type'],
|
||||
'assigned_type' => ['nullable', 'required_with:assigned_to', 'in:'.User::class.",".Location::class.",".Asset::class],
|
||||
'requestable' => ['nullable', 'boolean'],
|
||||
'assigned_user' => ['nullable', 'exists:users,id,deleted_at,NULL'],
|
||||
'assigned_location' => ['nullable', 'exists:locations,id,deleted_at,NULL', 'fmcs_location'],
|
||||
'assigned_asset' => ['nullable', 'exists:assets,id,deleted_at,NULL']
|
||||
'assigned_user' => ['integer', 'nullable', 'exists:users,id,deleted_at,NULL'],
|
||||
'assigned_location' => ['integer', 'nullable', 'exists:locations,id,deleted_at,NULL', 'fmcs_location'],
|
||||
'assigned_asset' => ['integer', 'nullable', 'exists:assets,id,deleted_at,NULL']
|
||||
];
|
||||
|
||||
|
||||
@@ -963,6 +963,7 @@ class Asset extends Depreciable
|
||||
return $this->model->category->require_acceptance;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ class AssetMaintenance extends Model implements ICompanyableChild
|
||||
protected $table = 'asset_maintenances';
|
||||
protected $rules = [
|
||||
'asset_id' => 'required|integer',
|
||||
'supplier_id' => 'required|integer',
|
||||
'supplier_id' => 'nullable|integer',
|
||||
'asset_maintenance_type' => 'required',
|
||||
'title' => 'required|max:100',
|
||||
'is_warranty' => 'boolean',
|
||||
|
||||
@@ -160,7 +160,7 @@ final class Company extends SnipeModel
|
||||
|
||||
|
||||
if (auth()->user()) {
|
||||
Log::warning('Companyable is '.$companyable);
|
||||
// Log::warning('Companyable is '.$companyable);
|
||||
$current_user_company_id = auth()->user()->company_id;
|
||||
$companyable_company_id = $companyable->company_id;
|
||||
return $current_user_company_id == null || $current_user_company_id == $companyable_company_id || auth()->user()->isSuperUser();
|
||||
|
||||
@@ -43,8 +43,8 @@ class DefaultLabel extends RectangleSheet
|
||||
|
||||
$this->textSize = Helper::convertUnit($settings->labels_fontsize, 'pt', 'in');
|
||||
|
||||
$this->labelWidth = $settings->labels_width;
|
||||
$this->labelHeight = $settings->labels_height;
|
||||
$this->labelWidth = $this->setLabelWidth($settings);
|
||||
$this->labelHeight = $this->setLabelHeight($settings);
|
||||
|
||||
$this->labelSpacingH = $settings->labels_display_sgutter;
|
||||
$this->labelSpacingV = $settings->labels_display_bgutter;
|
||||
@@ -181,6 +181,25 @@ class DefaultLabel extends RectangleSheet
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
private function setLabelWidth(Setting $settings)
|
||||
{
|
||||
$labelWidth = $settings->labels_width;
|
||||
|
||||
?>
|
||||
if ($labelWidth == 0) {
|
||||
$labelWidth = 0.1;
|
||||
}
|
||||
|
||||
return $labelWidth;
|
||||
}
|
||||
|
||||
private function setLabelHeight(?Setting $settings)
|
||||
{
|
||||
$labelHeight = $settings->labels_height;
|
||||
|
||||
if ($labelHeight == 0) {
|
||||
$labelHeight = 0.1;
|
||||
}
|
||||
|
||||
return $labelHeight;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,6 +135,17 @@ class Location extends SnipeModel
|
||||
return $this->hasMany(\App\Models\User::class, 'location_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* Establishes the location -> admin user relationship
|
||||
*
|
||||
* @author A. Gianotto <snipe@snipe.net>
|
||||
* @return \Illuminate\Database\Eloquent\Relations\Relation
|
||||
*/
|
||||
public function adminuser()
|
||||
{
|
||||
return $this->belongsTo(\App\Models\User::class, 'created_by');
|
||||
}
|
||||
|
||||
/**
|
||||
* Find assets with this location as their location_id
|
||||
*
|
||||
@@ -374,4 +385,13 @@ class Location extends SnipeModel
|
||||
{
|
||||
return $query->leftJoin('companies as company_sort', 'locations.company_id', '=', 'company_sort.id')->orderBy('company_sort.name', $order);
|
||||
}
|
||||
|
||||
/**
|
||||
* Query builder scope to order on the user that created it
|
||||
*/
|
||||
public function scopeOrderByCreatedByName($query, $order)
|
||||
{
|
||||
return $query->leftJoin('users as admin_sort', 'locations.created_by', '=', 'admin_sort.id')->select('locations.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -89,13 +89,10 @@ trait Loggable
|
||||
$log->note = $note;
|
||||
$log->action_date = $action_date;
|
||||
|
||||
if (! $log->action_date) {
|
||||
$log->action_date = date('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
$changed = [];
|
||||
$array_to_flip = array_keys($fields_array);
|
||||
$array_to_flip = array_merge($array_to_flip, ['action_date','name','status_id','location_id','expected_checkin']);
|
||||
$array_to_flip = array_merge($array_to_flip, ['name','status_id','location_id','expected_checkin']);
|
||||
$originalValues = array_intersect_key($originalValues, array_flip($array_to_flip));
|
||||
|
||||
|
||||
@@ -182,7 +179,7 @@ trait Loggable
|
||||
$log->note = $note;
|
||||
$log->action_date = $action_date;
|
||||
|
||||
if (! $log->action_date) {
|
||||
if (!$action_date) {
|
||||
$log->action_date = date('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
@@ -193,7 +190,7 @@ trait Loggable
|
||||
$changed = [];
|
||||
|
||||
$array_to_flip = array_keys($fields_array);
|
||||
$array_to_flip = array_merge($array_to_flip, ['action_date','name','status_id','location_id','expected_checkin']);
|
||||
$array_to_flip = array_merge($array_to_flip, ['name','status_id','location_id','expected_checkin']);
|
||||
|
||||
$originalValues = array_intersect_key($originalValues, array_flip($array_to_flip));
|
||||
|
||||
|
||||
+22
-1
@@ -48,7 +48,7 @@ class Supplier extends SnipeModel
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $searchableAttributes = ['name'];
|
||||
protected $searchableAttributes = ['name', 'notes', 'phone', 'fax', 'url', 'email', 'contact', 'address', 'address2', 'city', 'state', 'country', 'zip'];
|
||||
|
||||
/**
|
||||
* The relations and their attributes that should be included when searching the model.
|
||||
@@ -128,6 +128,18 @@ class Supplier extends SnipeModel
|
||||
return $this->hasMany(\App\Models\Consumable::class, 'supplier_id');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Establishes the supplier -> admin user relationship
|
||||
*
|
||||
* @author A. Gianotto <snipe@snipe.net>
|
||||
* @return \Illuminate\Database\Eloquent\Relations\Relation
|
||||
*/
|
||||
public function adminuser()
|
||||
{
|
||||
return $this->belongsTo(\App\Models\User::class, 'created_by');
|
||||
}
|
||||
|
||||
/**
|
||||
* Establishes the supplier -> asset maintenances relationship
|
||||
*
|
||||
@@ -197,4 +209,13 @@ class Supplier extends SnipeModel
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Query builder scope to order on the user that created it
|
||||
*/
|
||||
public function scopeOrderByCreatedByName($query, $order)
|
||||
{
|
||||
return $query->leftJoin('users as admin_sort', 'suppliers.created_by', '=', 'admin_sort.id')->select('suppliers.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -551,6 +551,25 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo
|
||||
->orderBy('created_at', 'desc');
|
||||
}
|
||||
|
||||
/**
|
||||
* Establishes the user -> eula relationship
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Relations\Relation
|
||||
* @since [v8.1.16]
|
||||
* @author [Godfrey Martinez] [<gmartinez@grokability.com>]
|
||||
*/
|
||||
public function eulas()
|
||||
{
|
||||
return $this->hasMany(Actionlog::class, 'target_id')
|
||||
->with('item')
|
||||
->select(['id', 'target_id', 'target_type', 'action_type', 'filename', 'accept_signature', 'created_at'])
|
||||
->where('target_type', self::class)
|
||||
->where('action_type', 'accepted')
|
||||
->whereNotNull('filename')
|
||||
->whereNotNull('accept_signature')
|
||||
->orderBy('created_at', 'desc');
|
||||
}
|
||||
|
||||
/**
|
||||
* Establishes the user -> requested assets relationship
|
||||
*
|
||||
|
||||
@@ -62,6 +62,7 @@ class AssetObserver
|
||||
$logAction = new Actionlog();
|
||||
$logAction->item_type = Asset::class;
|
||||
$logAction->item_id = $asset->id;
|
||||
$logAction->action_date = date('Y-m-d H:i:s');
|
||||
$logAction->created_at = date('Y-m-d H:i:s');
|
||||
$logAction->created_by = auth()->id();
|
||||
$logAction->log_meta = json_encode($changed);
|
||||
@@ -108,6 +109,7 @@ class AssetObserver
|
||||
$logAction = new Actionlog();
|
||||
$logAction->item_type = Asset::class; // can we instead say $logAction->item = $asset ?
|
||||
$logAction->item_id = $asset->id;
|
||||
$logAction->action_date = date('Y-m-d H:i:s');
|
||||
$logAction->created_at = date('Y-m-d H:i:s');
|
||||
$logAction->created_by = auth()->id();
|
||||
if($asset->imported) {
|
||||
@@ -128,6 +130,7 @@ class AssetObserver
|
||||
$logAction->item_type = Asset::class;
|
||||
$logAction->item_id = $asset->id;
|
||||
$logAction->created_at = date('Y-m-d H:i:s');
|
||||
$logAction->action_date = date('Y-m-d H:i:s');
|
||||
$logAction->created_by = auth()->id();
|
||||
$logAction->logaction('delete');
|
||||
}
|
||||
@@ -143,6 +146,7 @@ class AssetObserver
|
||||
$logAction = new Actionlog();
|
||||
$logAction->item_type = Asset::class;
|
||||
$logAction->item_id = $asset->id;
|
||||
$logAction->action_date = date('Y-m-d H:i:s');
|
||||
$logAction->created_at = date('Y-m-d H:i:s');
|
||||
$logAction->created_by = auth()->id();
|
||||
$logAction->logaction('restore');
|
||||
|
||||
@@ -0,0 +1,172 @@
|
||||
<?php
|
||||
|
||||
namespace App\Presenters;
|
||||
|
||||
/**
|
||||
* Class AccessoryPresenter
|
||||
*/
|
||||
class HistoryPresenter extends Presenter
|
||||
{
|
||||
/**
|
||||
* Json Column Layout for bootstrap table
|
||||
* @return string
|
||||
*/
|
||||
public static function dataTableLayout($serial = false)
|
||||
{
|
||||
$extra = [];
|
||||
$layout_start = [
|
||||
[
|
||||
'id' => 'id',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.id'),
|
||||
'visible' => false,
|
||||
'class' => 'hidden-xs',
|
||||
],
|
||||
[
|
||||
'field' => 'icon',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('admin/hardware/table.icon'),
|
||||
'visible' => true,
|
||||
'class' => 'hidden-xs',
|
||||
'formatter' => 'iconFormatter',
|
||||
],
|
||||
[
|
||||
'field' => 'created_at',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.created_at'),
|
||||
'visible' => false,
|
||||
'formatter' => 'dateDisplayFormatter',
|
||||
],
|
||||
[
|
||||
'field' => 'created_by',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'title' => trans('general.created_by'),
|
||||
'visible' => false,
|
||||
'formatter' => 'usersLinkObjFormatter',
|
||||
],
|
||||
[
|
||||
'field' => 'action_date',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'title' => trans('general.action_date'),
|
||||
'visible' => false,
|
||||
'formatter' => 'dateDisplayFormatter',
|
||||
],
|
||||
[
|
||||
'field' => 'action_type',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.action'),
|
||||
'visible' => false,
|
||||
],
|
||||
[
|
||||
'field' => 'item',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.item'),
|
||||
'visible' => false,
|
||||
'formatter' => 'polymorphicItemFormatter',
|
||||
],
|
||||
];
|
||||
|
||||
|
||||
if ($serial) {
|
||||
$extra = [
|
||||
[
|
||||
'field' => 'item.serial',
|
||||
'title' => trans('admin/hardware/table.serial'),
|
||||
'visible' => false,
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
$layout_end = [
|
||||
[
|
||||
'field' => 'target',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.target'),
|
||||
'visible' => false,
|
||||
'formatter' => 'polymorphicItemFormatter',
|
||||
],
|
||||
[
|
||||
'field' => 'file',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.file_name'),
|
||||
'visible' => false,
|
||||
'formatter' => 'fileUploadNameFormatter',
|
||||
],
|
||||
[
|
||||
'field' => 'file_download',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.download'),
|
||||
'visible' => false,
|
||||
'formatter' => 'fileUploadFormatter',
|
||||
],
|
||||
[
|
||||
'field' => 'note',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'visible' => false,
|
||||
'title' => trans('general.notes'),
|
||||
'formatter' => 'notesFormatter'
|
||||
],
|
||||
[
|
||||
'field' => 'signature_file',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.signature'),
|
||||
'visible' => false,
|
||||
'formatter' => 'imageFormatter',
|
||||
],
|
||||
[
|
||||
'field' => 'log_meta',
|
||||
'searchable' => false,
|
||||
'sortable' => false,
|
||||
'visible' => true,
|
||||
'title' => trans('admin/hardware/table.changed'),
|
||||
'formatter' => 'changeLogFormatter',
|
||||
],
|
||||
[
|
||||
'field' => 'remote_ip',
|
||||
'searchable' => false,
|
||||
'sortable' => false,
|
||||
'visible' => true,
|
||||
'title' => trans('admin/settings/general.login_ip'),
|
||||
],
|
||||
[
|
||||
'field' => 'user_agent',
|
||||
'searchable' => false,
|
||||
'sortable' => false,
|
||||
'visible' => true,
|
||||
'title' => trans('admin/settings/general.login_user_agent'),
|
||||
],
|
||||
[
|
||||
'field' => 'action_source',
|
||||
'searchable' => false,
|
||||
'sortable' => false,
|
||||
'visible' => true,
|
||||
'title' => trans('general.action_source'),
|
||||
],
|
||||
];
|
||||
|
||||
$merged = array_merge($layout_start, $extra, $layout_end);
|
||||
return json_encode($merged);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -208,7 +208,16 @@ class LocationPresenter extends Presenter
|
||||
'title' => trans('general.created_at'),
|
||||
'visible' => false,
|
||||
'formatter' => 'dateDisplayFormatter',
|
||||
], [
|
||||
],
|
||||
[
|
||||
'field' => 'created_by',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.created_by'),
|
||||
'visible' => false,
|
||||
'formatter' => 'usersLinkObjFormatter',
|
||||
],[
|
||||
'field' => 'actions',
|
||||
'searchable' => false,
|
||||
'sortable' => false,
|
||||
|
||||
@@ -0,0 +1,226 @@
|
||||
<?php
|
||||
|
||||
namespace App\Presenters;
|
||||
|
||||
/**
|
||||
* Class LocationPresenter
|
||||
*/
|
||||
class SupplierPresenter extends Presenter
|
||||
{
|
||||
/**
|
||||
* Json Column Layout for bootstrap table
|
||||
*/
|
||||
public static function dataTableLayout()
|
||||
{
|
||||
$layout = [
|
||||
[
|
||||
'field' => 'id',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.id'),
|
||||
'visible' => false,
|
||||
],
|
||||
[
|
||||
'field' => 'name',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => false,
|
||||
'title' => trans('general.name'),
|
||||
'visible' => true,
|
||||
'formatter' => 'suppliersLinkFormatter',
|
||||
], [
|
||||
'field' => 'image',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.image'),
|
||||
'visible' => true,
|
||||
'formatter' => 'imageFormatter',
|
||||
],
|
||||
[
|
||||
'field' => 'assets_count',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.assets'),
|
||||
'titleTooltip' => trans('general.assets'),
|
||||
'visible' => true,
|
||||
'class' => 'css-barcode',
|
||||
], [
|
||||
'field' => 'accessories_count',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.accessories'),
|
||||
'titleTooltip' => trans('general.accessories'),
|
||||
'visible' => true,
|
||||
'class' => 'css-accessory',
|
||||
],
|
||||
[
|
||||
'field' => 'licenses_count',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.licenses'),
|
||||
'titleTooltip' => trans('general.licenses'),
|
||||
'visible' => true,
|
||||
'class' => 'css-license',
|
||||
], [
|
||||
'field' => 'components_count',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.components'),
|
||||
'titleTooltip' => trans('general.components'),
|
||||
'visible' => true,
|
||||
'class' => 'css-component',
|
||||
], [
|
||||
'field' => 'consumables_count',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.consumables'),
|
||||
'titleTooltip' => trans('general.consumables'),
|
||||
'visible' => true,
|
||||
'class' => 'css-consumable',
|
||||
], [
|
||||
'field' => 'url',
|
||||
'searchable' => false,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.url'),
|
||||
'visible' => true,
|
||||
'formatter' => 'externalLinkFormatter',
|
||||
], [
|
||||
'field' => 'address',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('admin/locations/table.address'),
|
||||
'visible' => true,
|
||||
], [
|
||||
'field' => 'address2',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('admin/locations/table.address2'),
|
||||
'visible' => false,
|
||||
], [
|
||||
'field' => 'city',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('admin/locations/table.city'),
|
||||
'visible' => true,
|
||||
], [
|
||||
'field' => 'state',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('admin/locations/table.state'),
|
||||
'visible' => true,
|
||||
], [
|
||||
'field' => 'zip',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('admin/locations/table.zip'),
|
||||
'visible' => false,
|
||||
], [
|
||||
'field' => 'country',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('admin/locations/table.country'),
|
||||
'visible' => false,
|
||||
], [
|
||||
'field' => 'phone',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('admin/users/table.phone'),
|
||||
'visible' => false,
|
||||
'formatter' => 'phoneFormatter',
|
||||
], [
|
||||
'field' => 'fax',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('admin/suppliers/table.fax'),
|
||||
'visible' => false,
|
||||
'formatter' => 'phoneFormatter',
|
||||
], [
|
||||
'field' => 'notes',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'visible' => false,
|
||||
'title' => trans('general.notes'),
|
||||
], [
|
||||
'field' => 'created_at',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.created_at'),
|
||||
'visible' => false,
|
||||
'formatter' => 'dateDisplayFormatter',
|
||||
], [
|
||||
'field' => 'created_by',
|
||||
'searchable' => true,
|
||||
'sortable' => true,
|
||||
'switchable' => true,
|
||||
'title' => trans('general.created_by'),
|
||||
'visible' => false,
|
||||
'formatter' => 'usersLinkObjFormatter',
|
||||
], [
|
||||
'field' => 'actions',
|
||||
'searchable' => false,
|
||||
'sortable' => false,
|
||||
'switchable' => false,
|
||||
'title' => trans('table.actions'),
|
||||
'visible' => true,
|
||||
'formatter' => 'suppliersActionsFormatter',
|
||||
],
|
||||
];
|
||||
|
||||
return json_encode($layout);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Link to this supplier name
|
||||
* @return string
|
||||
*/
|
||||
public function nameUrl()
|
||||
{
|
||||
return (string) link_to_route('suppliers.show', $this->name, $this->id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter for Polymorphism.
|
||||
* @return mixed
|
||||
*/
|
||||
public function name()
|
||||
{
|
||||
return $this->model->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Url to view this item.
|
||||
* @return string
|
||||
*/
|
||||
public function viewUrl()
|
||||
{
|
||||
return route('suppliers.show', $this->id);
|
||||
}
|
||||
|
||||
public function glyph()
|
||||
{
|
||||
return '<x-icon type="suppliers" />';
|
||||
}
|
||||
|
||||
public function fullName()
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
}
|
||||
@@ -76,6 +76,8 @@ class RouteServiceProvider extends ServiceProvider
|
||||
/**
|
||||
* Configure the rate limiters for the application.
|
||||
*
|
||||
* This ONLY fires on 429 responses.
|
||||
*
|
||||
* https://laravel.com/docs/8.x/routing#rate-limiting
|
||||
*
|
||||
* @return void
|
||||
@@ -83,9 +85,17 @@ class RouteServiceProvider extends ServiceProvider
|
||||
protected function configureRateLimiting()
|
||||
{
|
||||
|
||||
// Rate limiter for API calls
|
||||
// Rate limiter for API calls - this sends the correct API headers to show the user the remaining time they have to wait and gives them the 429 status code if they are throttled
|
||||
RateLimiter::for('api', function (Request $request) {
|
||||
return Limit::perMinute(config('app.api_throttle_per_minute'))->by(optional($request->user())->id ?: $request->ip());
|
||||
return Limit::perMinute(config('app.api_throttle_per_minute'))->by(optional($request->user())->id ?: $request->ip())
|
||||
->response(function ($request, $headers) {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'messages' => 'Too many requests. Try again in '.$headers['Retry-After'].' seconds.',
|
||||
'status_code' => 429,
|
||||
'retryAfter' => $headers['Retry-After'] ?? 60,
|
||||
], 429, $headers);
|
||||
});
|
||||
});
|
||||
|
||||
// Rate limiter for forgotten password requests
|
||||
|
||||
+14
-2
@@ -25,6 +25,16 @@ class Label implements View
|
||||
*/
|
||||
protected $data;
|
||||
|
||||
|
||||
/**
|
||||
* TCPDF output destination.
|
||||
* "I" - inline by default.
|
||||
* See TCPDF's Output method for details.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private string $destination = 'I';
|
||||
|
||||
public function __construct() {
|
||||
$this->data = new Collection();
|
||||
}
|
||||
@@ -140,7 +150,9 @@ class Label implements View
|
||||
$barcode2DTarget = $asset->serial;
|
||||
break;
|
||||
case 'location':
|
||||
$barcode2DTarget = route('locations.show', $asset->location_id);
|
||||
$barcode2DTarget = $asset->location_id
|
||||
? route('locations.show', $asset->location_id)
|
||||
: null;
|
||||
break;
|
||||
case 'hardware_id':
|
||||
default:
|
||||
@@ -220,7 +232,7 @@ class Label implements View
|
||||
$template->writeAll($pdf, $data);
|
||||
|
||||
$filename = $assets->count() > 1 ? 'assets.pdf' : $assets->first()->asset_tag.'.pdf';
|
||||
$pdf->Output($filename, 'I');
|
||||
$pdf->Output($filename, $this->destination);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -39,6 +39,7 @@
|
||||
"eduardokum/laravel-mail-auto-embed": "^2.0",
|
||||
"enshrined/svg-sanitize": "^0.15.0",
|
||||
"erusev/parsedown": "^1.7",
|
||||
"fakerphp/faker": "^1.24",
|
||||
"guzzlehttp/guzzle": "^7.0.1",
|
||||
"intervention/image": "^2.5",
|
||||
"javiereguiluz/easyslugger": "^1.0",
|
||||
@@ -82,7 +83,6 @@
|
||||
"ext-exif": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"fakerphp/faker": "^1.16",
|
||||
"larastan/larastan": "^2.9",
|
||||
"mockery/mockery": "^1.4",
|
||||
"nunomaduro/phpinsights": "^2.11",
|
||||
|
||||
Generated
+64
-64
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "2e91e2f670634312429f20fda573e6a1",
|
||||
"content-hash": "089c4016869fc4c657d80bdd4b100ec2",
|
||||
"packages": [
|
||||
{
|
||||
"name": "alek13/slack",
|
||||
@@ -1766,6 +1766,69 @@
|
||||
},
|
||||
"time": "2019-12-30T22:54:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "fakerphp/faker",
|
||||
"version": "v1.24.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/FakerPHP/Faker.git",
|
||||
"reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
|
||||
"reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.4 || ^8.0",
|
||||
"psr/container": "^1.0 || ^2.0",
|
||||
"symfony/deprecation-contracts": "^2.2 || ^3.0"
|
||||
},
|
||||
"conflict": {
|
||||
"fzaninotto/faker": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"bamarni/composer-bin-plugin": "^1.4.1",
|
||||
"doctrine/persistence": "^1.3 || ^2.0",
|
||||
"ext-intl": "*",
|
||||
"phpunit/phpunit": "^9.5.26",
|
||||
"symfony/phpunit-bridge": "^5.4.16"
|
||||
},
|
||||
"suggest": {
|
||||
"doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
|
||||
"ext-curl": "Required by Faker\\Provider\\Image to download images.",
|
||||
"ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
|
||||
"ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
|
||||
"ext-mbstring": "Required for multibyte Unicode string functionality."
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Faker\\": "src/Faker/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "François Zaninotto"
|
||||
}
|
||||
],
|
||||
"description": "Faker is a PHP library that generates fake data for you.",
|
||||
"keywords": [
|
||||
"data",
|
||||
"faker",
|
||||
"fixtures"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/FakerPHP/Faker/issues",
|
||||
"source": "https://github.com/FakerPHP/Faker/tree/v1.24.1"
|
||||
},
|
||||
"time": "2024-11-21T13:46:39+00:00"
|
||||
},
|
||||
{
|
||||
"name": "filp/whoops",
|
||||
"version": "2.16.0",
|
||||
@@ -12385,69 +12448,6 @@
|
||||
},
|
||||
"time": "2023-08-08T05:53:35+00:00"
|
||||
},
|
||||
{
|
||||
"name": "fakerphp/faker",
|
||||
"version": "v1.24.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/FakerPHP/Faker.git",
|
||||
"reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
|
||||
"reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.4 || ^8.0",
|
||||
"psr/container": "^1.0 || ^2.0",
|
||||
"symfony/deprecation-contracts": "^2.2 || ^3.0"
|
||||
},
|
||||
"conflict": {
|
||||
"fzaninotto/faker": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"bamarni/composer-bin-plugin": "^1.4.1",
|
||||
"doctrine/persistence": "^1.3 || ^2.0",
|
||||
"ext-intl": "*",
|
||||
"phpunit/phpunit": "^9.5.26",
|
||||
"symfony/phpunit-bridge": "^5.4.16"
|
||||
},
|
||||
"suggest": {
|
||||
"doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
|
||||
"ext-curl": "Required by Faker\\Provider\\Image to download images.",
|
||||
"ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
|
||||
"ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
|
||||
"ext-mbstring": "Required for multibyte Unicode string functionality."
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Faker\\": "src/Faker/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "François Zaninotto"
|
||||
}
|
||||
],
|
||||
"description": "Faker is a PHP library that generates fake data for you.",
|
||||
"keywords": [
|
||||
"data",
|
||||
"faker",
|
||||
"fixtures"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/FakerPHP/Faker/issues",
|
||||
"source": "https://github.com/FakerPHP/Faker/tree/v1.24.1"
|
||||
},
|
||||
"time": "2024-11-21T13:46:39+00:00"
|
||||
},
|
||||
{
|
||||
"name": "fidry/cpu-core-counter",
|
||||
"version": "1.2.0",
|
||||
|
||||
+5
-5
@@ -1,10 +1,10 @@
|
||||
<?php
|
||||
return array (
|
||||
'app_version' => 'v8.1.4',
|
||||
'full_app_version' => 'v8.1.4 - build 18245-g101b8afb5',
|
||||
'build_version' => '18245',
|
||||
'app_version' => 'v8.1.15',
|
||||
'full_app_version' => 'v8.1.15 - build 18405-ge4314cf42',
|
||||
'build_version' => '18405',
|
||||
'prerelease_version' => '',
|
||||
'hash_version' => 'g101b8afb5',
|
||||
'full_hash' => 'v8.1.4-180-g101b8afb5',
|
||||
'hash_version' => 'ge4314cf42',
|
||||
'full_hash' => 'v8.1.15-13-ge4314cf42',
|
||||
'branch' => 'develop',
|
||||
);
|
||||
@@ -165,4 +165,72 @@ class ImportFactory extends Factory
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a supplier import type.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function suppliers()
|
||||
{
|
||||
return $this->state(function (array $attributes) {
|
||||
$fileBuilder = Importing\SuppliersImportFileBuilder::new();
|
||||
$attributes['name'] = "Supplier {$attributes['name']}";
|
||||
$attributes['import_type'] = 'supplier';
|
||||
$attributes['header_row'] = $fileBuilder->toCsv()[0];
|
||||
$attributes['first_row'] = $fileBuilder->firstRow();
|
||||
|
||||
return $attributes;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an supplier import type.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function locations()
|
||||
{
|
||||
return $this->state(function (array $attributes) {
|
||||
$fileBuilder = Importing\SuppliersImportFileBuilder::new();
|
||||
$attributes['name'] = "Location {$attributes['name']}";
|
||||
$attributes['import_type'] = 'location';
|
||||
$attributes['header_row'] = $fileBuilder->toCsv()[0];
|
||||
$attributes['first_row'] = $fileBuilder->firstRow();
|
||||
|
||||
return $attributes;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a supplier import type.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function manufacturers()
|
||||
{
|
||||
return $this->state(function (array $attributes) {
|
||||
$fileBuilder = Importing\ManufacturersImportFileBuilder::new();
|
||||
$attributes['name'] = "Manufacturer {$attributes['name']}";
|
||||
$attributes['import_type'] = 'manufacturer';
|
||||
$attributes['header_row'] = $fileBuilder->toCsv()[0];
|
||||
$attributes['first_row'] = $fileBuilder->firstRow();
|
||||
|
||||
return $attributes;
|
||||
});
|
||||
}
|
||||
|
||||
public function categories()
|
||||
{
|
||||
return $this->state(function (array $attributes) {
|
||||
$fileBuilder = Importing\CategoriesImportFileBuilder::new();
|
||||
$attributes['name'] = "Category {$attributes['name']}";
|
||||
$attributes['import_type'] = 'category';
|
||||
$attributes['header_row'] = $fileBuilder->toCsv()[0];
|
||||
$attributes['first_row'] = $fileBuilder->firstRow();
|
||||
|
||||
return $attributes;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
|
||||
Schema::table('action_logs', function (Blueprint $table) {
|
||||
$table->index(['action_date']);
|
||||
});
|
||||
|
||||
DB::update('update '.DB::getTablePrefix().'action_logs set action_date = created_at where created_at IS NOT NULL and action_date IS NULL');
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration {
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('settings', function (Blueprint $table) {
|
||||
$table->boolean('admin_cc_always')->after('admin_cc_email')->default(1);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('settings', function (Blueprint $table) {
|
||||
$table->dropColumn('admin_cc_always');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
DB::table('assets')->whereNotNull('assigned_type')->whereNull('assigned_to')->update(['assigned_type' => null]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('action_logs', function (Blueprint $table) {
|
||||
$table->index('deleted_at');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('action_logs', function (Blueprint $table) {
|
||||
$table->dropIndex('deleted_at');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('asset_maintenances', function (Blueprint $table) {
|
||||
$table->integer('supplier_id')->nullable()->default(null)->change();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
//
|
||||
}
|
||||
};
|
||||
@@ -21,7 +21,7 @@ services:
|
||||
- .env.dev.docker
|
||||
|
||||
mariadb:
|
||||
image: mariadb:11.5.2
|
||||
image: mariadb:11.4.7
|
||||
volumes:
|
||||
- db:/var/lib/mysql
|
||||
env_file:
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
retries: 5
|
||||
|
||||
redis:
|
||||
image: redis:7.4.0
|
||||
image: redis:7.4.3
|
||||
|
||||
mailhog:
|
||||
image: mailhog/mailhog:v1.0.1
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ services:
|
||||
- .env
|
||||
|
||||
db:
|
||||
image: mariadb:11.5.2
|
||||
image: mariadb:11.4.7
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- db_data:/var/lib/mysql
|
||||
|
||||
+12
-3
@@ -100,9 +100,13 @@ chown -R docker:root /var/www/html/storage/framework/cache
|
||||
# Fix php settings
|
||||
if [ -v "PHP_UPLOAD_LIMIT" ]
|
||||
then
|
||||
echo "Changing upload limit to ${PHP_UPLOAD_LIMIT}"
|
||||
sed -i "s/^upload_max_filesize.*/upload_max_filesize = ${PHP_UPLOAD_LIMIT}M/" /etc/php*/php.ini
|
||||
sed -i "s/^post_max_size.*/post_max_size = ${PHP_UPLOAD_LIMIT}M/" /etc/php*/php.ini
|
||||
PHP_INI_FILE=$(find /etc/php/*/apache2/php.ini)
|
||||
if [ -e $PHP_INI_FILE ]
|
||||
then
|
||||
echo "Changing upload limit to ${PHP_UPLOAD_LIMIT}M in ${PHP_INI_FILE}"
|
||||
sed -i "s/^upload_max_filesize.*/upload_max_filesize = ${PHP_UPLOAD_LIMIT}M/" $PHP_INI_FILE
|
||||
sed -i "s/^post_max_size.*/post_max_size = ${PHP_UPLOAD_LIMIT}M/" $PHP_INI_FILE
|
||||
fi
|
||||
fi
|
||||
|
||||
# If the Oauth DB files are not present copy the vendor files over to the db migrations
|
||||
@@ -120,4 +124,9 @@ php artisan migrate --force
|
||||
php artisan config:clear
|
||||
php artisan config:cache
|
||||
|
||||
# we do this after the artisan commands to ensure that if the laravel
|
||||
# log got created by root, we set the permissions back
|
||||
touch /var/www/html/storage/logs/laravel.log
|
||||
chown -R docker:root /var/www/html/storage/logs/laravel.log
|
||||
|
||||
exec supervisord -c /supervisord.conf
|
||||
|
||||
@@ -79,6 +79,7 @@ done
|
||||
chown -R apache:root /var/lib/snipeit/data/*
|
||||
chown -R apache:root /var/lib/snipeit/dumps
|
||||
chown -R apache:root /var/lib/snipeit/keys
|
||||
chown -R apache:root /var/www/html/storage/framework/cache
|
||||
|
||||
# Fix php settings
|
||||
if [ ! -z "${PHP_UPLOAD_LIMIT}" ]
|
||||
|
||||
@@ -99,10 +99,7 @@ then
|
||||
cp -a /var/www/html/vendor/laravel/passport/database/migrations/* /var/www/html/database/migrations/
|
||||
fi
|
||||
|
||||
# Create laravel log file
|
||||
touch /var/www/html/storage/logs/laravel.log
|
||||
# Add correct permissions for files and directories
|
||||
chown www-data:www-data /var/www/html/storage/logs/laravel.log
|
||||
chown -R www-data:www-data \
|
||||
/var/lib/snipeit/data \
|
||||
/var/lib/snipeit/dumps \
|
||||
@@ -114,6 +111,11 @@ php artisan migrate --force
|
||||
php artisan config:clear
|
||||
php artisan config:cache
|
||||
|
||||
# Create laravel log file
|
||||
touch /var/www/html/storage/logs/laravel.log
|
||||
# ensure it's owned by www:data in case it was created by root
|
||||
chown www-data:www-data /var/www/html/storage/logs/laravel.log
|
||||
|
||||
echo [INFO docker entrypoint] End script execution
|
||||
|
||||
exec "$@"
|
||||
exec "$@"
|
||||
|
||||
Vendored
+11
File diff suppressed because one or more lines are too long
@@ -110,6 +110,6 @@
|
||||
"/css/dist/skins/skin-yellow.min.css": "/css/dist/skins/skin-yellow.min.css?id=7b315b9612b8fde8f9c5b0ddb6bba690",
|
||||
"/css/dist/bootstrap-table.css": "/css/dist/bootstrap-table.css?id=54d676a6ea8677dd48f6c4b3041292cf",
|
||||
"/js/build/vendor.js": "/js/build/vendor.js?id=89dffa552c6e3abe3a2aac6c9c7b466b",
|
||||
"/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=783d3a8076337744f0176d60e1041ea4",
|
||||
"/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=60097b6b56d80cbc76257d4ecf6f57b4",
|
||||
"/js/dist/all.js": "/js/dist/all.js?id=8c6d7286f667eeb62a0a28a09851a6c3"
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ return [
|
||||
'manage' => 'crwdns6501:0crwdne6501:0',
|
||||
'field' => 'crwdns1487:0crwdne1487:0',
|
||||
'about_fieldsets_title' => 'crwdns1488:0crwdne1488:0',
|
||||
'about_fieldsets_text' => 'crwdns13226:0crwdne13226:0',
|
||||
'about_fieldsets_text' => 'crwdns13242:0crwdne13242:0',
|
||||
'custom_format' => 'crwdns6505:0crwdne6505:0',
|
||||
'encrypt_field' => 'crwdns1792:0crwdne1792:0',
|
||||
'encrypt_field_help' => 'crwdns1683:0crwdne1683:0',
|
||||
|
||||
@@ -49,12 +49,11 @@ return [
|
||||
'error_redirect' => 'crwdns11843:0crwdne11843:0',
|
||||
'error_misc' => 'crwdns11383:0crwdne11383:0',
|
||||
'webhook_fail' => 'crwdns12830:0crwdne12830:0',
|
||||
'webhook_channel_not_found' => 'crwdns12876:0crwdne12876:0'
|
||||
'webhook_channel_not_found' => 'crwdns12876:0crwdne12876:0',
|
||||
'ms_teams_deprecation' => 'crwdns13246:0crwdne13246:0',
|
||||
],
|
||||
|
||||
'location_scoping' => [
|
||||
'not_saved' => 'crwdns13053:0crwdne13053:0',
|
||||
'mismatch' => 'crwdns13055:0crwdne13055:0',
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
@@ -521,7 +521,7 @@ return [
|
||||
'checked_out_to_fields' => 'crwdns12214:0crwdne12214:0',
|
||||
'percent_complete' => 'crwdns11811:0crwdne11811:0',
|
||||
'uploading' => 'crwdns11813:0crwdne11813:0',
|
||||
'upload_error' => 'crwdns11884:0crwdne11884:0',
|
||||
'upload_error' => 'crwdns13244:0crwdne13244:0',
|
||||
'copy_to_clipboard' => 'crwdns11837:0crwdne11837:0',
|
||||
'copied' => 'crwdns11839:0crwdne11839:0',
|
||||
'status_compatibility' => 'crwdns11910:0crwdne11910:0',
|
||||
|
||||
@@ -5,7 +5,7 @@ return [
|
||||
'manage' => 'Manage',
|
||||
'field' => 'veld',
|
||||
'about_fieldsets_title' => 'Oor Fieldsets',
|
||||
'about_fieldsets_text' => 'Veldstelle stel jou in staat om groepe van persoonlike velde te skep wat gereeld hergebruik word vir spesifieke tipe bates.',
|
||||
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used for specific asset model types.',
|
||||
'custom_format' => 'Custom Regex format...',
|
||||
'encrypt_field' => 'Enkripteer die waarde van hierdie veld in die databasis',
|
||||
'encrypt_field_help' => 'WAARSKUWING: Om \'n veld te enkripteer, maak dit onondersoekbaar.',
|
||||
|
||||
@@ -49,12 +49,11 @@ return [
|
||||
'error_redirect' => 'ERROR: 301/302 :endpoint returns a redirect. For security reasons, we don’t follow redirects. Please use the actual endpoint.',
|
||||
'error_misc' => 'Something went wrong. :( ',
|
||||
'webhook_fail' => ' webhook notification failed: Check to make sure the URL is still valid.',
|
||||
'webhook_channel_not_found' => ' webhook channel not found.'
|
||||
'webhook_channel_not_found' => ' webhook channel not found.',
|
||||
'ms_teams_deprecation' => 'The selected Microsoft Teams webhook URL will be deprecated Dec 31st, 2025. Please use a workflow URL. Microsoft\'s documentation on creating a workflow can be found <a href="https://support.microsoft.com/en-us/office/create-incoming-webhooks-with-workflows-for-microsoft-teams-8ae491c7-0394-4861-ba59-055e33f75498" target="_blank"> here.</a>',
|
||||
],
|
||||
|
||||
'location_scoping' => [
|
||||
'not_saved' => 'Your settings were not saved.',
|
||||
'mismatch' => 'There is 1 item in the database that need your attention before you can enable location scoping.|There are :count items in the database that need your attention before you can enable location scoping.',
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
'about' => 'Oor Status Etikette',
|
||||
'about' => 'About Status Types',
|
||||
'archived' => 'argief',
|
||||
'create' => 'Skep statusetiket',
|
||||
'color' => 'Grafiek Kleur',
|
||||
'default_label' => 'Default Label',
|
||||
'default_label_help' => 'This is used to ensure your most commonly used status labels appear at the top of the select box when creating/editing assets.',
|
||||
'deployable' => 'verbintenis',
|
||||
'info' => 'Statusetikette word gebruik om die verskillende state waarin u bates kan wees, te beskryf. Hulle kan dalk herstel, verlore / gesteel wees, ens. U kan nuwe statusetikette skep vir ontplooibare, hangende en geargiveerde bates.',
|
||||
'info' => 'Status label types are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for your deployable, pending and archived assets according to your own workflow. For more information, <a href="https://snipe-it.readme.io/docs/overview#status-labels" target="_blank">see the documentation <i class="fa fa-external-link"></i></a>.',
|
||||
'name' => 'Status Naam',
|
||||
'pending' => 'hangende',
|
||||
'status_type' => 'Status Tipe',
|
||||
|
||||
@@ -522,7 +522,7 @@ return [
|
||||
'checked_out_to_fields' => 'Checked Out To Fields',
|
||||
'percent_complete' => '% volledige',
|
||||
'uploading' => 'Uploading... ',
|
||||
'upload_error' => 'Error uploading file. Please check that there are no empty rows and that no column names are duplicated.',
|
||||
'upload_error' => 'Error uploading file. Please check that you have no empty rows or duplicated column names in your CSV, and that the server permissions allow uploads.',
|
||||
'copy_to_clipboard' => 'Copy to Clipboard',
|
||||
'copied' => 'Copied!',
|
||||
'status_compatibility' => 'If assets are already assigned, they cannot be changed to a non-deployable status type and this value change will be skipped.',
|
||||
|
||||
@@ -5,7 +5,7 @@ return [
|
||||
'manage' => 'Manage',
|
||||
'field' => 'Field',
|
||||
'about_fieldsets_title' => 'About Fieldsets',
|
||||
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
|
||||
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used for specific asset model types.',
|
||||
'custom_format' => 'Custom Regex format...',
|
||||
'encrypt_field' => 'Encrypt the value of this field in the database',
|
||||
'encrypt_field_help' => 'WARNING: Encrypting a field makes it unsearchable.',
|
||||
|
||||
@@ -49,12 +49,11 @@ return [
|
||||
'error_redirect' => 'ERROR: 301/302 :endpoint returns a redirect. For security reasons, we don’t follow redirects. Please use the actual endpoint.',
|
||||
'error_misc' => 'Something went wrong. :( ',
|
||||
'webhook_fail' => ' webhook notification failed: Check to make sure the URL is still valid.',
|
||||
'webhook_channel_not_found' => ' webhook channel not found.'
|
||||
'webhook_channel_not_found' => ' webhook channel not found.',
|
||||
'ms_teams_deprecation' => 'The selected Microsoft Teams webhook URL will be deprecated Dec 31st, 2025. Please use a workflow URL. Microsoft\'s documentation on creating a workflow can be found <a href="https://support.microsoft.com/en-us/office/create-incoming-webhooks-with-workflows-for-microsoft-teams-8ae491c7-0394-4861-ba59-055e33f75498" target="_blank"> here.</a>',
|
||||
],
|
||||
|
||||
'location_scoping' => [
|
||||
'not_saved' => 'Your settings were not saved.',
|
||||
'mismatch' => 'There is 1 item in the database that need your attention before you can enable location scoping.|There are :count items in the database that need your attention before you can enable location scoping.',
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
'about' => 'About Status Labels',
|
||||
'about' => 'About Status Types',
|
||||
'archived' => 'የተመኸደረ',
|
||||
'create' => 'Create Status Label',
|
||||
'color' => 'Chart Color',
|
||||
'default_label' => 'Default Label',
|
||||
'default_label_help' => 'This is used to ensure your most commonly used status labels appear at the top of the select box when creating/editing assets.',
|
||||
'deployable' => 'Deployable',
|
||||
'info' => 'Status labels are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for deployable, pending and archived assets.',
|
||||
'info' => 'Status label types are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for your deployable, pending and archived assets according to your own workflow. For more information, <a href="https://snipe-it.readme.io/docs/overview#status-labels" target="_blank">see the documentation <i class="fa fa-external-link"></i></a>.',
|
||||
'name' => 'Status Name',
|
||||
'pending' => 'Pending',
|
||||
'status_type' => 'Status Type',
|
||||
|
||||
@@ -522,7 +522,7 @@ return [
|
||||
'checked_out_to_fields' => 'Checked Out To Fields',
|
||||
'percent_complete' => '% complete',
|
||||
'uploading' => 'Uploading... ',
|
||||
'upload_error' => 'Error uploading file. Please check that there are no empty rows and that no column names are duplicated.',
|
||||
'upload_error' => 'Error uploading file. Please check that you have no empty rows or duplicated column names in your CSV, and that the server permissions allow uploads.',
|
||||
'copy_to_clipboard' => 'Copy to Clipboard',
|
||||
'copied' => 'Copied!',
|
||||
'status_compatibility' => 'If assets are already assigned, they cannot be changed to a non-deployable status type and this value change will be skipped.',
|
||||
|
||||
@@ -5,7 +5,7 @@ return [
|
||||
'manage' => 'إدارة',
|
||||
'field' => 'حقل',
|
||||
'about_fieldsets_title' => 'حول مجموعة الحقول',
|
||||
'about_fieldsets_text' => '(مجموعات الحقول) تسمح لك بإنشاء مجموعات من الحقول اللتي يمكن إعادة إستخدامها مع موديل محدد.',
|
||||
'about_fieldsets_text' => 'مجموعات الحقول تسمح لك بإنشاء مجموعات من الحقول المخصصة التي يعاد استخدامها في كثير من الأحيان لأنواع معينة من نماذج الأصول.',
|
||||
'custom_format' => 'تنسيق Regex المخصص...',
|
||||
'encrypt_field' => 'تشفير قيمة هذا الحقل في قاعدة البيانات',
|
||||
'encrypt_field_help' => 'تحذير: تشفير الحقل يجعله غير قابل للبحث.',
|
||||
|
||||
@@ -49,12 +49,11 @@ return [
|
||||
'error_redirect' => 'خطأ: 301/302 :endpoint يرجع إعادة توجيه. لأسباب أمنية، نحن لا نتابع إعادة التوجيه. الرجاء استخدام نقطة النهاية الفعلية.',
|
||||
'error_misc' => 'حدث خطأ ما. :( ',
|
||||
'webhook_fail' => ' webhook notification failed: Check to make sure the URL is still valid.',
|
||||
'webhook_channel_not_found' => ' webhook channel not found.'
|
||||
'webhook_channel_not_found' => ' webhook channel not found.',
|
||||
'ms_teams_deprecation' => 'The selected Microsoft Teams webhook URL will be deprecated Dec 31st, 2025. Please use a workflow URL. Microsoft\'s documentation on creating a workflow can be found <a href="https://support.microsoft.com/en-us/office/create-incoming-webhooks-with-workflows-for-microsoft-teams-8ae491c7-0394-4861-ba59-055e33f75498" target="_blank"> here.</a>',
|
||||
],
|
||||
|
||||
'location_scoping' => [
|
||||
'not_saved' => 'Your settings were not saved.',
|
||||
'mismatch' => 'There is 1 item in the database that need your attention before you can enable location scoping.|There are :count items in the database that need your attention before you can enable location scoping.',
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
'about' => 'حول تسميات الحالة',
|
||||
'about' => 'About Status Types',
|
||||
'archived' => 'مؤرشف',
|
||||
'create' => 'إنشاء تسمية الحالة',
|
||||
'color' => 'لون الرسم البياني',
|
||||
'default_label' => 'الوسم الافتراضي',
|
||||
'default_label_help' => 'يستخدم هذا للتأكد من أن تسميات الحالة الأكثر استخداما تظهر في الجزء العلوي من المربع المحدد عند إنشاء/تحرير الأصول.',
|
||||
'deployable' => 'قابل للتوزيع',
|
||||
'info' => 'يتم استخدام تسميات الحالة لوصف الحالات المحتملة للأصول التابعة لك. قد تكون قيد الصيانة أو ضمن المفقودة أو المسروقة، وما إلى ذلك. يمكنك إنشاء تسميات حالة جديدة للأصول القابلة للتوزيع وقيد الانتظار والمؤرشفة.',
|
||||
'info' => 'Status label types are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for your deployable, pending and archived assets according to your own workflow. For more information, <a href="https://snipe-it.readme.io/docs/overview#status-labels" target="_blank">see the documentation <i class="fa fa-external-link"></i></a>.',
|
||||
'name' => 'اسم الحالة',
|
||||
'pending' => 'قيد الانتظار',
|
||||
'status_type' => 'نوع الحالة',
|
||||
|
||||
@@ -522,7 +522,7 @@ return [
|
||||
'checked_out_to_fields' => 'Checked Out To Fields',
|
||||
'percent_complete' => '% اكتمال',
|
||||
'uploading' => 'تحميل... ',
|
||||
'upload_error' => 'خطأ في تحميل الملف. الرجاء التحقق من أنه لا توجد صفوف فارغة وأنه لا يوجد تكرار لأسماء الأعمدة.',
|
||||
'upload_error' => 'Error uploading file. Please check that you have no empty rows or duplicated column names in your CSV, and that the server permissions allow uploads.',
|
||||
'copy_to_clipboard' => 'نسخ إلى الحافظة',
|
||||
'copied' => 'نسخ!',
|
||||
'status_compatibility' => 'إذا تم تعيين الأصول بالفعل، فإنه لا يمكن تغييرها إلى نوع حالة غير قابل للنشر وسيتم تخطي هذا التغيير في القيمة.',
|
||||
|
||||
@@ -18,7 +18,7 @@ return array(
|
||||
'confirm' => 'Сигурни ли сте, че желаете да изтриете този компонент?',
|
||||
'error' => 'Възникна проблем при изтриването на компонента. Моля опитайте отново.',
|
||||
'success' => 'Компонентът бе изтрит успешно.',
|
||||
'error_qty' => 'Some components of this type are still checked out. Please check them in and try again.',
|
||||
'error_qty' => 'Някой компоненти от този тип са все още изписани. Моля проверете ги и пробвайте отново.',
|
||||
),
|
||||
|
||||
'checkout' => array(
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
return array(
|
||||
|
||||
'invalid_category_type' => 'The category must be a consumable category.',
|
||||
'invalid_category_type' => 'Категоряита трябва да бъде от консумативи.',
|
||||
'does_not_exist' => 'Консуматива не съществува.',
|
||||
|
||||
'create' => array(
|
||||
|
||||
@@ -5,7 +5,7 @@ return [
|
||||
'manage' => 'Управление',
|
||||
'field' => 'Поле',
|
||||
'about_fieldsets_title' => 'Относно Fieldsets',
|
||||
'about_fieldsets_text' => 'Fieldsets позволяват създаването на групи от персонализирани полета, които се използват и преизползват често за специфични типове модели на активи.',
|
||||
'about_fieldsets_text' => '"Група от полета" позволяват създаването на групи от персонализирани полета, които се използват и преизползват често за специфични типове модели на активи.',
|
||||
'custom_format' => 'Персонализиран формат...',
|
||||
'encrypt_field' => 'Шифроване на стойността на това поле в базата данни',
|
||||
'encrypt_field_help' => 'ВНИМАНИЕ: Шифроване на поле го прави невалидно за търсене.',
|
||||
@@ -57,8 +57,8 @@ return [
|
||||
'show_in_requestable_list_short' => 'Покажи в списъка на изискуемите артикули',
|
||||
'show_in_requestable_list' => 'Покажи стойноста в списъка на изискуемите артикули. Криптираните полета няма да се покажат',
|
||||
'encrypted_options' => 'Това поле е криптирано, затова някой настройки няма да бъдат налични.',
|
||||
'display_checkin' => 'Display in checkin forms',
|
||||
'display_checkout' => 'Display in checkout forms',
|
||||
'display_audit' => 'Display in audit forms',
|
||||
'display_checkin' => 'Покажи в форма за вписване',
|
||||
'display_checkout' => 'Покажи в форма за изписване',
|
||||
'display_audit' => 'Покажи в форма за одит',
|
||||
|
||||
];
|
||||
|
||||
@@ -5,7 +5,7 @@ return array(
|
||||
'field' => array(
|
||||
'invalid' => 'Това поле не съществува.',
|
||||
'already_added' => 'Вече е добавено поле',
|
||||
'none_selected' => 'No field selected',
|
||||
'none_selected' => 'Не е избрано поле',
|
||||
|
||||
'create' => array(
|
||||
'error' => 'Поле не беше създадено, моля опитайте отново.',
|
||||
|
||||
@@ -14,7 +14,7 @@ return [
|
||||
Нямате нагласена амортизация.
|
||||
Моля настройте поне една амортизация за да видите справката.',
|
||||
'depreciation_method' => 'Справка за амортизации',
|
||||
'linear_depreciation' => 'Linear (Default)',
|
||||
'half_1' => 'Half-year convention, always applied',
|
||||
'half_2' => 'Half-year convention, applied with condition',
|
||||
'linear_depreciation' => 'Линеен (по подразбиране)',
|
||||
'half_1' => 'Полугодишна, винаги се приложена',
|
||||
'half_2' => 'Полугодишна, приложена с условие',
|
||||
];
|
||||
|
||||
@@ -55,11 +55,11 @@ return [
|
||||
'asset_location_update_default' => 'Актуализиране на местоположението по подразбиране',
|
||||
'asset_location_update_actual' => 'Актуализиране само на местоположението',
|
||||
'asset_not_deployable' => 'Актива не може да бъде предоставен. Този активк не може да бъде изписан.',
|
||||
'asset_not_deployable_checkin' => 'That asset status is not deployable. Using this status label will checkin the asset.',
|
||||
'asset_deployable' => 'This asset can be checked out.',
|
||||
'asset_not_deployable_checkin' => 'Статуса на този актив е със забрана за изписване. Използвайки този статус ще впише актива обратно.',
|
||||
'asset_deployable' => 'Този актив може да бъде изписан.',
|
||||
'processing_spinner' => 'Обработка...(Това може да отнеме време при големи файлове)',
|
||||
'processing' => 'В процес на изпълнение... ',
|
||||
'optional_infos' => 'Допълнителна информация',
|
||||
'order_details' => 'Информация за състоянието на поръчка',
|
||||
'calc_eol' => 'If nulling the EOL date, use automatic EOL calculation based on the purchase date and EOL rate.',
|
||||
'calc_eol' => 'Ако нулирате EOL датата, ще се използва EOL дата базирана на дата на закупуване + EOL норма.',
|
||||
];
|
||||
|
||||
@@ -6,7 +6,7 @@ return [
|
||||
'archived' => 'Архивиран',
|
||||
'asset' => 'Актив',
|
||||
'bulk_checkout' => 'Общо отписване',
|
||||
'bulk_checkin' => 'Bulk Checkin',
|
||||
'bulk_checkin' => 'Общо вписване',
|
||||
'checkin' => 'Връщане на актив',
|
||||
'checkout' => 'Изписване на актив',
|
||||
'clone' => 'Копиране на актив',
|
||||
@@ -27,7 +27,7 @@ return [
|
||||
'undeployable_tooltip' => 'Този актив е забранен за изписване и не може да се изпише в момента.',
|
||||
'view' => 'Преглед на актив',
|
||||
'csv_error' => 'Имате грешка във вашият CSV файл:',
|
||||
'import_text' => '<p>Upload a CSV that contains asset history. The assets and users MUST already exist in the system, or they will be skipped. Matching assets for history import happens against the asset tag. We will try to find a matching user based on the user\'s name you provide, and the criteria you select below. If you do not select any criteria below, it will simply try to match on the username format you configured in the <code>Admin > General Settings</code>.</p><p>Fields included in the CSV must match the headers: <strong>Asset Tag, Name, Checkout Date, Checkin Date</strong>. Any additional fields will be ignored. </p><p>Checkin Date: blank or future checkin dates will checkout items to associated user. Excluding the Checkin Date column will create a checkin date with todays date.</p> ',
|
||||
'import_text' => '<p>Качи CSV файл, който съдържа историята на активите. Активите и потребителите ТРЯБВА да ги има създадени в системата в противен слуай няма да се импортират. При импортиране на историята на активите, съвпадението се прави по техния инвентарен номер. Ще се опитаме да намерим потребителя на база неговото потребителско име и критерия който сте избрали по-долу. Ще се опита да намери съвпадение по формата на потребителско име избран в <code>Admin > General Settings</code>.</p><p>Полетата включени в CSV файла, трябва да съвпадат с <strong>Инвентарен номер, Име, Дата на изписване, Дата на вписване</strong>. Всякакви допълнителни полета ще бъдат игнорирани. </p><p> Празна дата на вписване или дата в бъдещето ще изпише актива към асоцийрания потребител. Ако не се включи колона с дата на вписване, същата ще бъде създадена със текущата дата.</p> ',
|
||||
'csv_import_match_f-l' => 'Опитай да намериш съвпадение на потребителите по <strong>Име.Фамилия</strong> (<code>Иван.Иванов</code>)',
|
||||
'csv_import_match_initial_last' => 'Опитай да намериш съвпадение на потребителите по <strong>Първа буква, Фамилия</strong> (<code>ииванов</code>)',
|
||||
'csv_import_match_first' => 'Опитай да намериш съвпадение на потребителите по <strong>Име</strong> (<code>Иван</code>)',
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
|
||||
return [
|
||||
|
||||
'undeployable' => '<strong>Warning: </strong> This asset has been marked as currently undeployable. If this status has changed, please update the asset status.',
|
||||
'undeployable' => '<strong>Внимание:</strong> Този актив е маркиран, като забранен за изписване. Ако статусът е променен, моля обновете актива.',
|
||||
'does_not_exist' => 'Активът не съществува.',
|
||||
'does_not_exist_var' => 'Активът с етике :asset_tag не е намерен.',
|
||||
'no_tag' => 'Не е предоставен етикет на актив.',
|
||||
'does_not_exist_or_not_requestable' => 'Актива не съществува или не може да бъде предоставян.',
|
||||
'assoc_users' => 'Активът е изписан на потребител и не може да бъде изтрит. Моля впишете го обратно и след това опитайте да го изтриете отново.',
|
||||
'warning_audit_date_mismatch' => 'Следващата дата на одит на този актив (:next_audit_date) е преди последната дата на одит (:last_audit_date). Моля, актуализирайте следващата дата на одита.',
|
||||
'labels_generated' => 'Labels were successfully generated.',
|
||||
'error_generating_labels' => 'Error while generating labels.',
|
||||
'no_assets_selected' => 'No assets selected.',
|
||||
'labels_generated' => 'Етиката е успешно генериран.',
|
||||
'error_generating_labels' => 'Грешка при генериране на етикети.',
|
||||
'no_assets_selected' => 'Няма избрани активи.',
|
||||
|
||||
'create' => [
|
||||
'error' => 'Активът не беше създаден. Моля опитайте отново.',
|
||||
'success' => 'Активът създаден успешно.',
|
||||
'success_linked' => 'Артикул с етикет :tag беше създаден успешно. <strong><a href=":link" style="color: white;">Щракнете тук за да го видите</a></strong>.',
|
||||
'multi_success_linked' => 'Asset with tag :links was created successfully.|:count assets were created succesfully. :links.',
|
||||
'partial_failure' => 'An asset was unable to be created. Reason: :failures|:count assets were unable to be created. Reasons: :failures',
|
||||
'multi_success_linked' => 'Актив с етикет :links беше създаден успешно.|:count активи бяха създадено успешно. :links.',
|
||||
'partial_failure' => 'Грешка при създаване на актив. Съобщението за грешка е: :failures|:count актива не бяха създадени. Съобщението за грешка е: :failures',
|
||||
],
|
||||
|
||||
'update' => [
|
||||
@@ -56,24 +56,24 @@ return [
|
||||
],
|
||||
|
||||
'import' => [
|
||||
'import_button' => 'Process Import',
|
||||
'import_button' => 'Импортирай',
|
||||
'error' => 'Някои елементи не бяха въведени правилно.',
|
||||
'errorDetail' => 'Следните елементи не бяха въведени поради грешки.',
|
||||
'success' => 'Вашият файл беше въведен.',
|
||||
'file_delete_success' => 'Вашият файл беше изтрит успешно.',
|
||||
'file_delete_error' => 'Файлът не е в състояние да бъде изтрит',
|
||||
'file_missing' => 'Избраният файл липсва',
|
||||
'file_already_deleted' => 'The file selected was already deleted',
|
||||
'file_already_deleted' => 'Избрания файл беше вече изтрит',
|
||||
'header_row_has_malformed_characters' => 'Един или повече атрибути на заглавния ред съдържат неправилни UTF-8 символи',
|
||||
'content_row_has_malformed_characters' => 'Един или повече атрибути на заглавния ред съдържат неправилни UTF-8 символи',
|
||||
'transliterate_failure' => 'Transliteration from :encoding to UTF-8 failed due to invalid characters in input'
|
||||
'transliterate_failure' => 'Транслитерацията от :encoding към UTF-8 беше неуспешна, поради невалидни символи'
|
||||
],
|
||||
|
||||
|
||||
'delete' => [
|
||||
'confirm' => 'Сигурни ли сте, че желаете изтриване на актива?',
|
||||
'error' => 'Проблем при изтриване на актива. Моля опитайте отново.',
|
||||
'assigned_to_error' => '{1}Asset Tag: :asset_tag is currently checked out. Check in this device before deletion.|[2,*]Asset Tags: :asset_tag are currently checked out. Check in these devices before deletion.',
|
||||
'assigned_to_error' => '{1}Актива: :asset_tag е изписан. Впишете го обратно преди изтриване.|[2,*] Активите :asset_tag са изписани. Впишете ги обратно преди изтриване.',
|
||||
'nothing_updated' => 'Няма избрани активи, така че нищо не бе изтрито.',
|
||||
'success' => 'Активът е изтрит успешно.',
|
||||
],
|
||||
@@ -87,8 +87,8 @@ return [
|
||||
],
|
||||
|
||||
'multi-checkout' => [
|
||||
'error' => 'Asset was not checked out, please try again|Assets were not checked out, please try again',
|
||||
'success' => 'Asset checked out successfully.|Assets checked out successfully.',
|
||||
'error' => 'Актива не беше изписан, моля опитайте отново|Активите не бяха изписани, моля опитайте отново',
|
||||
'success' => 'Актива е изписан успешно.|Активите са изписани успешно.',
|
||||
],
|
||||
|
||||
'checkin' => [
|
||||
@@ -100,9 +100,9 @@ return [
|
||||
],
|
||||
|
||||
'requests' => [
|
||||
'error' => 'Request was not successful, please try again.',
|
||||
'success' => 'Request successfully submitted.',
|
||||
'canceled' => 'Request successfully canceled.',
|
||||
'error' => 'Опитат беше неуспешен, моля опитайте отново.',
|
||||
'success' => 'Заявката е успешно подадена.',
|
||||
'canceled' => 'Заявката е отменена.',
|
||||
'cancel' => 'Отмени тази заявка за артикул',
|
||||
],
|
||||
|
||||
|
||||
@@ -47,5 +47,5 @@ return [
|
||||
'kit_deleted' => 'Комплектът беше изтрит',
|
||||
'kit_model_updated' => 'Модела беше успешно обновен',
|
||||
'kit_model_detached' => 'Модела беше премахнат успешно',
|
||||
'model_already_attached' => 'Model already attached to kit',
|
||||
'model_already_attached' => 'Модела е добавен в комплекта',
|
||||
];
|
||||
|
||||
@@ -14,7 +14,7 @@ return array(
|
||||
'info' => 'Информация за лиценз',
|
||||
'license_seats' => 'Потребителски лицензи',
|
||||
'seat' => 'Потребителски лиценз',
|
||||
'seat_count' => 'Seat :count',
|
||||
'seat_count' => 'Брой места :count',
|
||||
'seats' => 'Потребителски лицензи',
|
||||
'software_licenses' => 'Софтуерни лицензи',
|
||||
'user' => 'Потребител',
|
||||
@@ -24,12 +24,12 @@ return array(
|
||||
[
|
||||
'checkin_all' => [
|
||||
'button' => 'Връщане на всички бройки',
|
||||
'modal' => 'This action will checkin one seat. | This action will checkin all :checkedout_seats_count seats for this license.',
|
||||
'modal' => 'Това действие ще впише едно работно място. | Това действие ще впише всички :checkedout_seats_count работни места от този лиценз.',
|
||||
'enabled_tooltip' => 'Вписване на всички бройки от този лиценз за потребителите и активите',
|
||||
'disabled_tooltip' => 'Това е забранено защото няма изписани бройки',
|
||||
'disabled_tooltip_reassignable' => 'Това е деактивирано, защото лиценза не може да се прехвърля',
|
||||
'success' => 'Лиценза е заведен успешно! | Всички лицензи са заведени успешно!',
|
||||
'log_msg' => 'Checked in via bulk license checkin in license GUI',
|
||||
'log_msg' => 'Вписване чрез групово лиценз вписване в GUI',
|
||||
],
|
||||
|
||||
'checkout_all' => [
|
||||
|
||||
@@ -44,13 +44,13 @@ return array(
|
||||
'error' => 'Възникна проблем при изписването на лиценза. Моля, опитайте отново.',
|
||||
'success' => 'Лицензът е изписан',
|
||||
'not_enough_seats' => 'Няма достатъчно лицензи за изписване',
|
||||
'mismatch' => 'The license seat provided does not match the license',
|
||||
'unavailable' => 'This seat is not available for checkout.',
|
||||
'mismatch' => 'Броя лицензни места не отговаря на броя лицензи',
|
||||
'unavailable' => 'Този лиценз за работно място не е наличен за изписване.',
|
||||
),
|
||||
|
||||
'checkin' => array(
|
||||
'error' => 'Възникна проблем при вписването на лиценза. Моля, опитайте отново.',
|
||||
'not_reassignable' => 'License not reassignable',
|
||||
'not_reassignable' => 'Лиценза не може да се прехвърля',
|
||||
'success' => 'Лицензът е вписан'
|
||||
),
|
||||
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
return array(
|
||||
|
||||
'does_not_exist' => 'Местоположението не съществува.',
|
||||
'assoc_users' => 'This location is not currently deletable because it is the location of record for at least one asset or user, has assets assigned to it, or is the parent location of another location. Please update your records to no longer reference this location and try again ',
|
||||
'assoc_users' => 'Това местоположение не може да бъде изтрито, защото има поне един запис на актив или потребител, зачислен към него или съдържа под локаций. Моля обновете вашите записи, така че да не съдържат това местоположение и пробвайте да го изтриете отново. ',
|
||||
'assoc_assets' => 'Местоположението е свързано с поне един актив и не може да бъде изтрито. Моля, актуализирайте активите, така че да не са свързани с това местоположение и опитайте отново. ',
|
||||
'assoc_child_loc' => 'В избраното местоположение е присъединено едно или повече местоположения. Моля преместете ги в друго и опитайте отново.',
|
||||
'assigned_assets' => 'Изписани Активи',
|
||||
'current_location' => 'Текущо местоположение',
|
||||
'open_map' => 'Open in :map_provider_icon Maps',
|
||||
'open_map' => 'Отвори в :map_provider_icon карти',
|
||||
|
||||
|
||||
'create' => array(
|
||||
@@ -22,8 +22,8 @@ return array(
|
||||
),
|
||||
|
||||
'restore' => array(
|
||||
'error' => 'Location was not restored, please try again',
|
||||
'success' => 'Location restored successfully.'
|
||||
'error' => 'Местоположението не беше възстановено, моля опитайте отново',
|
||||
'success' => 'Местоположението е възстановено.'
|
||||
),
|
||||
|
||||
'delete' => array(
|
||||
|
||||
@@ -39,5 +39,5 @@ return [
|
||||
'signed_by_finance_auditor' => 'Подписан от (счетоводител):',
|
||||
'signed_by_location_manager' => 'Подписан от (мениджър):',
|
||||
'signed_by' => 'Подписано от:',
|
||||
'clone' => 'Clone Location',
|
||||
'clone' => 'Клонирай местоположението',
|
||||
];
|
||||
|
||||
@@ -7,7 +7,7 @@ return array(
|
||||
'no_association' => 'ВНИМАНИЕ! Модела за този актив е неправилен или липсва!',
|
||||
'no_association_fix' => 'Това ще счупи нещата по много лош начин. Редактирайте артикула сега и го зачислете към модел.',
|
||||
'assoc_users' => 'Този модел е асоцииран с един или повече активи и не може да бъде изтрит. Моля изтрийте активите и опитайте отново.',
|
||||
'invalid_category_type' => 'This category must be an asset category.',
|
||||
'invalid_category_type' => 'Тази категоря трябва да бъде за модели.',
|
||||
|
||||
'create' => array(
|
||||
'error' => 'Моделът не беше създаден. Моля опитайте отново.',
|
||||
|
||||
@@ -4,7 +4,7 @@ return [
|
||||
'info' => 'Изберете опциите, които желаете за справката за активи.',
|
||||
'deleted_user' => 'Изтрит потребител',
|
||||
'send_reminder' => 'Изпрати напомняне',
|
||||
'cannot_send_reminder' => 'User has been deleted or does not have an email address so cannot receive a reminder',
|
||||
'cannot_send_reminder' => 'Потребителя е бил изтрит или няма валиден е-майл адрес и не може да получи напомняне',
|
||||
'reminder_sent' => 'Напомнянето изпратено',
|
||||
'acceptance_deleted' => 'Заявката за приемане е изтрита',
|
||||
'acceptance_request' => 'Заявка за приемане',
|
||||
@@ -15,9 +15,9 @@ return [
|
||||
'user_country' => 'Държава на потребителя',
|
||||
'user_zip' => 'Пощенски код на потребителя'
|
||||
],
|
||||
'open_saved_template' => 'Open Saved Template',
|
||||
'save_template' => 'Save Template',
|
||||
'select_a_template' => 'Select a Template',
|
||||
'template_name' => 'Template Name',
|
||||
'update_template' => 'Update Template',
|
||||
'open_saved_template' => 'Отвори записан шаблон',
|
||||
'save_template' => 'Запиши шаблон',
|
||||
'select_a_template' => 'Избери шаблон',
|
||||
'template_name' => 'Име на шаблон',
|
||||
'update_template' => 'Обнови шаблон',
|
||||
];
|
||||
|
||||
@@ -8,7 +8,7 @@ return [
|
||||
'ad_append_domain' => 'Добави името на домейна към потребителското име',
|
||||
'ad_append_domain_help' => 'От потребителя не се изисква да въвежда "username@domain.local", достатъчно е да напише само "username".',
|
||||
'admin_cc_email' => 'CC електронна поща',
|
||||
'admin_cc_email_help' => 'Send a copy of checkin/checkout emails to this address.',
|
||||
'admin_cc_email_help' => 'Изпращай копие на известията за вписване/изписване на следния е-майл адрес.',
|
||||
'admin_settings' => 'Админ настройки',
|
||||
'is_ad' => 'Това е активна директория на сървър',
|
||||
'alerts' => 'Известия',
|
||||
@@ -31,18 +31,18 @@ return [
|
||||
'backups' => 'Архивиране',
|
||||
'backups_help' => 'Създаване, сваляне и възстановяване на архиви ',
|
||||
'backups_restoring' => 'Възстановяване от архив',
|
||||
'backups_clean' => 'Clean the backed-up database before restore',
|
||||
'backups_clean_helptext' => "This can be useful if you're changing between database versions",
|
||||
'backups_clean' => 'Почисти архива на базата преди възстановяване',
|
||||
'backups_clean_helptext' => "Това може да е полесно при смяна на версията на базата",
|
||||
'backups_upload' => 'Качване на архив',
|
||||
'backups_path' => 'Архивите на сървъра са записани в <code>:path</code>',
|
||||
'backups_restore_warning' => 'Use the restore button <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> to restore from a previous backup. (This does not currently work with S3 file storage or Docker.)<br><br>Your <strong>entire :app_name database and any uploaded files will be completely replaced</strong> by what\'s in the backup file ',
|
||||
'backups_restore_warning' => 'Използвайте бутона за възстановяване <small><span class="btn btn-xs btn-warning"><i class="text-white fas fa-retweet" aria-hidden="true"></i></span></small> ,за да възстановите архивно копие. (Това не работи с S3 файлова система или Docker.)<br><br>Вашата <strong>цяла :app_name датабаза и всички качени файлове ще бъдат заменени</strong> от съдържанието на архива. ',
|
||||
'backups_logged_out' => 'Всички потребители, включително и вие, ще бъдат отписани след възстановяването.',
|
||||
'backups_large' => 'Много големите архиви може да не могат да се възстановят поради изтичане на времето на сесията и ще трябва да се възстановят ръчно през команден ред. ',
|
||||
'barcode_settings' => 'Настройки на баркод',
|
||||
'confirm_purge' => 'Потвърдете пречистване ',
|
||||
'confirm_purge_help' => 'Моля да потвърдите изтриването като въведете думата "DELETE" в полето. Изтриването не може да се прекрати и всички записи който са маркирани за истриване, ще бъдат безвъзвратно изтрити. (Добре е да направите архив преди това.)',
|
||||
'custom_css' => 'Потребителски CSS',
|
||||
'custom_css_placeholder' => 'Add your custom CSS',
|
||||
'custom_css_placeholder' => 'Добавете ваш персонализиран CSS',
|
||||
'custom_css_help' => 'Включете вашите CSS правила тук. Не използвайте <style></style> тагове.',
|
||||
'custom_forgot_pass_url' => 'Персонализиран адрес за възстановяване на паролата',
|
||||
'custom_forgot_pass_url_help' => 'Това URL ще замени вградения механизъм за възстановяване на паролата на входния екран, което е полезно за потребителите, използващи външни оторизации като LDAP. Това ефективно ще спре възможността за възстановяване на паролата за потребителите, управлявани през Sinpe-it.',
|
||||
@@ -50,28 +50,28 @@ return [
|
||||
'dashboard_message_help' => 'Този текст ще се появи на таблото на всички потребители с права за достъп до таблото.',
|
||||
'default_currency' => 'Валута по подразбиране',
|
||||
'default_eula_text' => 'EULA по подразбиране',
|
||||
'default_eula_text_placeholder' => 'Add your default EULA text',
|
||||
'default_eula_text_placeholder' => 'Добавете ваш EULA',
|
||||
'default_language' => 'Език по подразбиране',
|
||||
'default_eula_help_text' => 'Можете да асоциирате специфична EULA към всяка избрана категория.',
|
||||
'acceptance_note' => 'Добавете бележка за вашето решение (По желание)',
|
||||
'display_asset_name' => 'Визуализиране на актив',
|
||||
'display_checkout_date' => 'Визуализиране на дата на изписване',
|
||||
'display_eol' => 'Визуализиране на EOL в таблиците',
|
||||
'display_qr' => 'Display 2D barcode',
|
||||
'display_qr' => 'Показвай 2D баркод',
|
||||
'display_alt_barcode' => 'Показване на 1D баркод',
|
||||
'barcode_type' => '2D тип на баркод',
|
||||
'alt_barcode_type' => '1D тип на баркод',
|
||||
'enabled' => 'Активно',
|
||||
'eula_settings' => 'Настройки на EULA',
|
||||
'eula_markdown' => 'Съдържанието на EULA може да бъде форматирано с <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
|
||||
'empty_row_count' => 'Field Start Offset (Empty Rows)',
|
||||
'empty_row_count_help' => 'Fields will begin populating after this many empty rows are skipped at the top of the label.',
|
||||
'empty_row_count' => 'Отместване на началото на полето (Празни редове)',
|
||||
'empty_row_count_help' => 'Полетата ще започнат да се попълват след като празните редове се презкочат в началото на етикета.',
|
||||
'favicon' => 'Favicon',
|
||||
'favicon_format' => 'Приетите файлови формати са ico, png, и gif. Другите формати на снимки може да не работят в всъчки браузъри.',
|
||||
'favicon_size' => 'Favicons трябва да бъдат квадратна снимка с размери, 16х16 пиксела.',
|
||||
'footer_text' => 'Допълнителен текст във футъра',
|
||||
'footer_text_help' => 'Този текст ще се визуализира в дясната част на футъра. Връзки могат да бъдат добавяни с използването на <a href="https://help.github.com/articles/github-flavored-markdown/">Github тип markdown</a>. Нови редове, хедър тагове, изображения и т.н. могат да доведат до непредвидими резултати.',
|
||||
'footer_text_placeholder' => 'Optional footer text',
|
||||
'footer_text_placeholder' => 'Опционален текст на долния колонтитул',
|
||||
'general_settings' => 'Общи настройки',
|
||||
'general_settings_help' => 'Общи условия и други',
|
||||
'generate_backup' => 'Създаване на архив',
|
||||
@@ -97,7 +97,7 @@ return [
|
||||
'ldap_login_sync_help' => 'Това единствено проверява дали LDAP може да се синхронизира успешно. Ако вашата LDAP заявка за оторизация не е коректна е възможно потребителите да не могат да влязат. НЕОБХОДИМО Е ДА ЗАПИШЕТЕ LDAP НАСТРОЙКИТЕ ПРЕДИ ТОВА.',
|
||||
'ldap_manager' => 'LDAP мениджър',
|
||||
'ldap_server' => 'LDAP сървър',
|
||||
'ldap_server_help' => 'This should start with ldap:// (for unencrypted) or ldaps:// (for TLS or SSL)',
|
||||
'ldap_server_help' => 'Това трябва да започва с Idap:// (for unencrypted) или Idaps:// (for TLS or SSL)',
|
||||
'ldap_server_cert' => 'Валидация на LDAP SSL сертификата',
|
||||
'ldap_server_cert_ignore' => 'Допускане на невалиден SSL сертификат',
|
||||
'ldap_server_cert_help' => 'Изберете тази опция ако използвате самоподписан SSL сертификат.',
|
||||
@@ -111,8 +111,8 @@ return [
|
||||
'ldap_pword' => 'LDAP парола на потребител за връзка',
|
||||
'ldap_basedn' => 'Базов DN',
|
||||
'ldap_filter' => 'LDAP филтър',
|
||||
'ldap_pw_sync' => 'Cache LDAP Passwords',
|
||||
'ldap_pw_sync_help' => 'Uncheck this box if you do not wish to keep LDAP passwords cached as local hashed passwords. Disabling this means that your users may not be able to login if your LDAP server is unreachable for some reason.',
|
||||
'ldap_pw_sync' => 'Кеш за LDAP Пароли',
|
||||
'ldap_pw_sync_help' => 'Махнете отметката, ако не желаете да се пази кеш за LDAP пароли, като локален хеш. Забранявайки този опция означава, че вашите потребители няма да могат да се впишат ако не работи LDAP сървъра поради някаква причина.',
|
||||
'ldap_username_field' => 'Поле за потребителско име',
|
||||
'ldap_lname_field' => 'Фамилия',
|
||||
'ldap_fname_field' => 'LDAP собствено име',
|
||||
@@ -120,8 +120,8 @@ return [
|
||||
'ldap_version' => 'LDAP версия',
|
||||
'ldap_active_flag' => 'LDAP флаг за активност',
|
||||
'ldap_activated_flag_help' => 'Тази стойност определя дали синхронизирания потребител може да се логва в Snipe-IT. <strong>Не се премахва възможността да се изписват активи към потребителя</strong> и полето трябва да бъде <strong>attribute name</strong> от вашата AD/LDAP, а не <strong>неговата стройност</strong>. <br><br>Ако това поле не съществува във вашата AD/LDAP или стойността е <code>0</code> или <code>false</code> <strong>достъпа на потребителя ще бъде забранен</strong>. Ако стойността в AD/LDAP полето е <code>1</code> или <code>true</code> означава че потребителя може да се логва. Когато това поле е празно във вашата AD се приема <code>userAccountControl</code> атрибута, който обикновенно позволява не блокираните потребители да се логват.',
|
||||
'ldap_invert_active_flag' => 'LDAP Invert Active Flag',
|
||||
'ldap_invert_active_flag_help' => 'If enabled: when the value returned by LDAP Active Flag is <code>0</code> or <code>false</code> the user account will be active.',
|
||||
'ldap_invert_active_flag' => 'LDAP Инвертиране на активния флаг',
|
||||
'ldap_invert_active_flag_help' => 'Ако е включено, когато стойноста на полето LDAP Active Flag е <code>0</code> или <code>false</code> потребителя ще е активен.',
|
||||
'ldap_emp_num' => 'LDAP номер на служител',
|
||||
'ldap_email' => 'LDAP електронна поща',
|
||||
'ldap_test' => 'Тест LDAP',
|
||||
@@ -136,7 +136,7 @@ return [
|
||||
'login_user_agent' => 'Потребителски агент',
|
||||
'login_help' => 'Списък на опитите за достъп',
|
||||
'login_note' => 'Вход забележка',
|
||||
'login_note_placeholder' => "If you do not have a login or have found a device belonging to this company, please call technical support at 888-555-1212. Thank you.",
|
||||
'login_note_placeholder' => "Ако нямате потребител или сте намерили загубено устройство принадлежащо на тази компания, моля свържете се на официалният им телефон.",
|
||||
'login_note_help' => 'По избор включете няколко изречения на екрана за вход, например, за да помогнете на хора, които са намерили изгубено или откраднато устройство. Това поле приема <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
|
||||
'login_remote_user_text' => 'Опции за вход с Remote User',
|
||||
'login_remote_user_enabled_text' => 'Включване на вход с HTTP хедър Remote User',
|
||||
@@ -152,15 +152,15 @@ return [
|
||||
'logo_print_assets_help' => 'Показвай логото при печат на листа с артикули ',
|
||||
'full_multiple_companies_support_help_text' => 'Ограничаване на потребителите (включително административните) до активите на собствената им компания.',
|
||||
'full_multiple_companies_support_text' => 'Поддръжка на множество компании',
|
||||
'scope_locations_fmcs_support_text' => 'Scope Locations with Full Multiple Companies Support',
|
||||
'scope_locations_fmcs_support_help_text' => 'Restrict locations to their selected company.',
|
||||
'scope_locations_fmcs_check_button' => 'Check Compatibility',
|
||||
'scope_locations_fmcs_support_disabled_text' => 'This option is disabled because you have conflicting locations set for :count or more items.',
|
||||
'scope_locations_fmcs_support_text' => 'Подружка на множество местоположения и много фирми',
|
||||
'scope_locations_fmcs_support_help_text' => 'Ограничи местоположенията до техните избрани фирми.',
|
||||
'scope_locations_fmcs_check_button' => 'Проверка за съвместимост',
|
||||
'scope_locations_fmcs_support_disabled_text' => 'Тази опция е забранена, защото имате конфликт на настройката на местоположение на :count или повече артикула.',
|
||||
'show_in_model_list' => 'Показване в падащите менюта на моделите',
|
||||
'optional' => 'незадължително',
|
||||
'per_page' => 'Резултати на страница',
|
||||
'php' => 'PHP версия',
|
||||
'php_info' => 'PHP info',
|
||||
'php_info' => 'PHP инфо',
|
||||
'php_overview' => 'PHP',
|
||||
'php_overview_help' => 'PHP Системна информация',
|
||||
'php_gd_info' => 'Необходимо е да инсталирате php-gd, за да визуализирате QR кодове. Моля прегледайте инструкцията за инсталация.',
|
||||
|
||||
@@ -49,12 +49,11 @@ return [
|
||||
'error_redirect' => 'Грешка 301/302 :endpoint върна пренасочване. От съображения за сигурност, ние не отваряме пренасочванията. Моля ползвайте действителната крайна точка.',
|
||||
'error_misc' => 'Възникна грешка. :( ',
|
||||
'webhook_fail' => ' webhook notification failed: Check to make sure the URL is still valid.',
|
||||
'webhook_channel_not_found' => ' webhook channel not found.'
|
||||
'webhook_channel_not_found' => ' webhook channel not found.',
|
||||
'ms_teams_deprecation' => 'The selected Microsoft Teams webhook URL will be deprecated Dec 31st, 2025. Please use a workflow URL. Microsoft\'s documentation on creating a workflow can be found <a href="https://support.microsoft.com/en-us/office/create-incoming-webhooks-with-workflows-for-microsoft-teams-8ae491c7-0394-4861-ba59-055e33f75498" target="_blank"> here.</a>',
|
||||
],
|
||||
|
||||
'location_scoping' => [
|
||||
'not_saved' => 'Your settings were not saved.',
|
||||
'mismatch' => 'There is 1 item in the database that need your attention before you can enable location scoping.|There are :count items in the database that need your attention before you can enable location scoping.',
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
'about' => 'Относно статус етикетите',
|
||||
'about' => 'About Status Types',
|
||||
'archived' => 'Архивирани',
|
||||
'create' => 'Създаване на статус етикет',
|
||||
'color' => 'Цвят на диаграма',
|
||||
'default_label' => 'Етикет по подразбиране',
|
||||
'default_label_help' => 'Позиционира най-често използваните етикети в началото на падащото меню за избор при създаване и редактиране на активи.',
|
||||
'deployable' => 'Може да бъде предоставен',
|
||||
'info' => 'Статусите се използват за описване на различните състояния на Вашите активи. Например, това са Предаден за ремонт, Изгубен/откраднат и др. Можете да създавате нови статуси за активите, които могат да бъдат предоставяни, очакващи набавяне и архивирани.',
|
||||
'info' => 'Status label types are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for your deployable, pending and archived assets according to your own workflow. For more information, <a href="https://snipe-it.readme.io/docs/overview#status-labels" target="_blank">see the documentation <i class="fa fa-external-link"></i></a>.',
|
||||
'name' => 'Статус',
|
||||
'pending' => 'Изчакване',
|
||||
'status_type' => 'Тип на статуса',
|
||||
|
||||
@@ -23,16 +23,16 @@ return [
|
||||
'asset_models' => 'Модели на активи',
|
||||
'asset_model' => 'Модел',
|
||||
'asset' => 'Актив',
|
||||
'asset_previous' => 'Asset (Previously Assigned)',
|
||||
'asset_previous' => 'Актив (Предходно зачислен)',
|
||||
'asset_report' => 'Справка за активите',
|
||||
'asset_tag' => 'Инвентарен номер',
|
||||
'asset_tags' => 'Етикет на актив',
|
||||
'assets_available' => 'Налични активи',
|
||||
'accept_assets' => 'Приеми Актив :name',
|
||||
'accept_assets_menu' => 'Приеми активите',
|
||||
'accept_item' => 'Accept Item',
|
||||
'accept_item' => 'Приеми артикул',
|
||||
'audit' => 'проверка',
|
||||
'audits' => 'Audits',
|
||||
'audits' => 'Одити',
|
||||
'audit_report' => 'Отчет за одита',
|
||||
'assets' => 'Активи',
|
||||
'assets_audited' => 'одитирани активи',
|
||||
@@ -64,12 +64,12 @@ return [
|
||||
'changepassword' => 'Смяна на паролата',
|
||||
'checkin' => 'Вписване',
|
||||
'checkin_from' => 'Форма за вписване',
|
||||
'checkin_note' => 'Checkin Note',
|
||||
'checkout_note' => 'Checkout Note',
|
||||
'checkin_note' => 'Забележка Вписване',
|
||||
'checkout_note' => 'Забележка Изписване',
|
||||
'checkout' => 'Изписване',
|
||||
'checkouts_count' => 'Изписвания',
|
||||
'checkins_count' => 'Вписвания',
|
||||
'checkin_and_delete' => 'Checkin and Delete',
|
||||
'checkin_and_delete' => 'Впиши и Изтрий',
|
||||
'user_requests_count' => 'Заявки',
|
||||
'city' => 'Град',
|
||||
'click_here' => 'Натиснете тук',
|
||||
@@ -83,7 +83,7 @@ return [
|
||||
'consumables' => 'Консумативи',
|
||||
'country' => 'Държава',
|
||||
'could_not_restore' => 'Грешка при възстановяване :item_type: :error',
|
||||
'not_deleted' => 'The :item_type was not deleted and therefore cannot be restored',
|
||||
'not_deleted' => ':item_type не е изтрит и не може да бъде възстановен',
|
||||
'create' => 'Създаване на нов',
|
||||
'created' => 'Създадени артикули',
|
||||
'created_asset' => 'създадени активи',
|
||||
@@ -98,7 +98,7 @@ return [
|
||||
'customize_report' => 'Персонализиран отчет',
|
||||
'custom_report' => 'Потребителски справки за активи',
|
||||
'dashboard' => 'Табло',
|
||||
'data_source' => 'Data Source',
|
||||
'data_source' => 'Източник на Данни',
|
||||
'days' => 'дни',
|
||||
'days_to_next_audit' => 'Дни до следващия одит',
|
||||
'date' => 'Дата',
|
||||
@@ -106,7 +106,7 @@ return [
|
||||
'debug_warning_text' => 'Това приложение се изпълнява в режим на производство с разрешено отстраняване на грешки. Това може да изложи чувствителни данни, ако приложението ви е достъпно за външния свят. Забранете режим отстраняване на грешки чрез задаване на стойността <code>APP_DEBUF</code> <code>.env</code> във файла <code>false</code>.',
|
||||
'delete' => 'Изтриване',
|
||||
'delete_confirm' => 'Сигурни ли сте, че желаете изтриването на :item?',
|
||||
'delete_confirm_no_undo' => 'Are you sure, you wish to delete :item? This cannot be undone.',
|
||||
'delete_confirm_no_undo' => 'Сигурни ли сте, че искате да изтриете :item? Това не може да бъде върнато на обратно.',
|
||||
'deleted' => 'Изтрито',
|
||||
'delete_seats' => 'Изтрити работни места за лиценз',
|
||||
'deletion_failed' => 'Неуспешно изтриване',
|
||||
@@ -150,7 +150,7 @@ return [
|
||||
'image_upload' => 'Качване на изображение',
|
||||
'filetypes_accepted_help' => 'Позволенoто разширенe на файлa е :types. Максимално позволения размер е :size.|Позволените разширения на файловете са :types. Максимално позволен размер :size.',
|
||||
'filetypes_size_help' => 'Максимално позволен размер на файла е :size.',
|
||||
'image_filetypes_help' => 'Accepted Filetypes are jpg, webp, png, gif, svg, and avif. The maximum upload size allowed is :size.',
|
||||
'image_filetypes_help' => 'Допустимите файлови типове са jpg, webp, png, gif, svg и avif. Максималният разрешен размер за качване е :size.',
|
||||
'unaccepted_image_type' => 'Снимката не може да се прочете. Типовете файлови разширения са jpg, webp, png, gif и svg. Разширението на този файл е :mimetype.',
|
||||
'import' => 'Зареждане',
|
||||
'import_this_file' => 'Асоциирайте полетата и обработете този файл',
|
||||
@@ -212,14 +212,14 @@ return [
|
||||
'no_results' => 'Няма резултат.',
|
||||
'no' => 'Не',
|
||||
'notes' => 'Бележки',
|
||||
'note_added' => 'Note Added',
|
||||
'options' => 'Options',
|
||||
'preview' => 'Preview',
|
||||
'add_note' => 'Add Note',
|
||||
'note_edited' => 'Note Edited',
|
||||
'edit_note' => 'Edit Note',
|
||||
'note_deleted' => 'Note Deleted',
|
||||
'delete_note' => 'Delete Note',
|
||||
'note_added' => 'Бележката е добавена',
|
||||
'options' => 'Настройки',
|
||||
'preview' => 'Преглед',
|
||||
'add_note' => 'Добави бележка',
|
||||
'note_edited' => 'Бележката е редактирана',
|
||||
'edit_note' => 'Редактиране на бележка',
|
||||
'note_deleted' => 'Бележката е изтрита',
|
||||
'delete_note' => 'Изтрий бележката',
|
||||
'order_number' => 'Номер на поръчка',
|
||||
'only_deleted' => 'Само изтрити активи',
|
||||
'page_menu' => 'Показване на _MENU_ записа',
|
||||
@@ -234,7 +234,7 @@ return [
|
||||
'purchase_date' => 'Дата на закупуване',
|
||||
'qty' => 'Количество',
|
||||
'quantity' => 'Kоличество',
|
||||
'quantity_minimum' => 'You have one item below or almost below minimum quantity levels|You have :count items below or almost below minimum quantity levels',
|
||||
'quantity_minimum' => 'Имате един артикул под или почти под минимум налично количество|Имате :count артикула под или почти под монимум налично количесто',
|
||||
'quickscan_checkin' => 'Бързо сканиране и Вписване',
|
||||
'quickscan_checkin_status' => 'Статус вписване',
|
||||
'ready_to_deploy' => 'Готово за предоставяне',
|
||||
@@ -284,10 +284,10 @@ return [
|
||||
'site_name' => 'Име на системата',
|
||||
'state' => 'Област',
|
||||
'status_labels' => 'Статус етикети',
|
||||
'status_label' => 'Status Label',
|
||||
'status_label' => 'Статус етикет',
|
||||
'status' => 'Статус',
|
||||
'accept_eula' => 'Споразумение за приемане',
|
||||
'show_or_hide_eulas' => 'Show/Hide EULAs',
|
||||
'show_or_hide_eulas' => 'Покажи/Скрий EULAs',
|
||||
'supplier' => 'Доставчик',
|
||||
'suppliers' => 'Доставчици',
|
||||
'sure_to_delete' => 'Сигурни ли сте, че искате да изтриете',
|
||||
@@ -305,7 +305,7 @@ return [
|
||||
'unknown_admin' => 'Непознат администратор',
|
||||
'username' => 'Потребител',
|
||||
'update' => 'Обновяване',
|
||||
'updating_item' => 'Updating :item',
|
||||
'updating_item' => 'Обновяване :item',
|
||||
'upload_filetypes_help' => 'Позволените файлови разширения са png, gif, jpg, jpeg, doc, docx, pdf, xls, xlsx, txt, lic, xml, zip, rtf и rar. Максималният размер на файла е :size.',
|
||||
'uploaded' => 'Качен',
|
||||
'user' => 'Потребител',
|
||||
@@ -330,10 +330,10 @@ return [
|
||||
'token_expired' => 'Вашата сесия за формуляр изтече. Моля опитайте отново.',
|
||||
'login_enabled' => 'Разрешен вход',
|
||||
'audit_due' => 'За Одит',
|
||||
'audit_due_days' => '{}Assets Due or Overdue for Audit|[1]Assets Due or Overdue for Audit Within a Day|[2,*]Assets Due or Overdue for Audit Within :days Days',
|
||||
'audit_due_days' => '{}Активи чакащи или просрочили Одит|[1]Активи чакащи или просрочили одит, за следващия ден|[2,*]Активи чакащи или просрочили одит за следващите :days дни',
|
||||
'checkin_due' => 'Предстои проверка',
|
||||
'checkin_overdue' => 'Просрочен срок за регистрация',
|
||||
'checkin_due_days' => '{}Due for Checkin|[1]Assets Due for Checkin Within :days Day|[2,*]Assets Due for Checkin Within :days Days',
|
||||
'checkin_due_days' => '{}Чакащи за вписване|[1]Активи чакащи за вписване в следващя :days ден|[2,*]Активи чакащи за вписване за следващите :days дни',
|
||||
'audit_overdue' => 'Просрочен Одит',
|
||||
'accept' => 'Приеми :asset',
|
||||
'i_accept' => 'Съгласен съм',
|
||||
@@ -355,7 +355,7 @@ return [
|
||||
'setup_step_4' => 'Стъпка 4',
|
||||
'setup_config_check' => 'Проверка на конфигурацията',
|
||||
'setup_create_database' => 'Създай таблиците в датабазата',
|
||||
'setup_create_admin' => 'Create an admin user',
|
||||
'setup_create_admin' => 'Създай Админ потребител',
|
||||
'setup_done' => 'Готово!',
|
||||
'bulk_edit_about_to' => 'Вие ще редактирате следното: ',
|
||||
'checked_out' => 'Изписан',
|
||||
@@ -390,8 +390,8 @@ return [
|
||||
'new_license' => 'Нов Лиценз',
|
||||
'new_accessory' => 'Нов аксесоар',
|
||||
'new_consumable' => 'Нов Консуматив',
|
||||
'new_component' => 'New Component',
|
||||
'new_user' => 'New User',
|
||||
'new_component' => 'Нов компонент',
|
||||
'new_user' => 'Нов потребител',
|
||||
'collapse' => 'Свий',
|
||||
'assigned' => 'Възложен',
|
||||
'asset_count' => 'Брой Активи',
|
||||
@@ -427,20 +427,20 @@ return [
|
||||
'bulk_soft_delete' =>'Също маркирай за изтриване потребителите. Историята на тяхните активи ще остане докато не изчистите изтритите записи през административните настройки.',
|
||||
'bulk_checkin_delete_success' => 'Избраните потребители бяха изтрити и техните активи вписани обратно.',
|
||||
'bulk_checkin_success' => 'Активите за избраните потребители бяха вписани обратно.',
|
||||
'set_to_null' => 'Delete values for this selection|Delete values for all :selection_count selections ',
|
||||
'set_to_null' => 'Изтрий стойностите за маркираното|Изтрий стойностите за свички :selection_count маркирания ',
|
||||
'set_users_field_to_null' => 'Изтрий стойноста :field за този потребител|Изтрий стойността :field за всичките :user_count потребителя ',
|
||||
'na_no_purchase_date' => 'N/A - Няма дата на закупуване',
|
||||
'assets_by_status' => 'Статус на Активи',
|
||||
'assets_by_status_type' => 'Статус тип по Активи',
|
||||
'pie_chart_type' => 'Кръгова диаграма на таблото',
|
||||
'hello_name' => 'Здравейте, :name!',
|
||||
'unaccepted_profile_warning' => 'You have one item requiring acceptance. Click here to accept or decline it | You have :count items requiring acceptance. Click here to accept or decline them',
|
||||
'unaccepted_profile_warning' => 'Имате един артикул за приемане. Щракнете тук, за да го приемете или откажете | Имате :count артикула за приемане. Щракнете тук, за да ги приемете или откажете',
|
||||
'start_date' => 'Начална дата',
|
||||
'end_date' => 'Крайна дата',
|
||||
'alt_uploaded_image_thumbnail' => 'Качено умалено изображение',
|
||||
'placeholder_kit' => 'Изберете комплект',
|
||||
'file_not_found' => 'Файлът не е намерен',
|
||||
'log_record_not_found' => 'No record for that log entry was found.',
|
||||
'log_record_not_found' => 'Няма намерени записи.',
|
||||
'preview_not_available' => '(няма преглед)',
|
||||
'setup' => 'Настройка',
|
||||
'pre_flight' => 'Тест',
|
||||
@@ -522,7 +522,7 @@ return [
|
||||
'checked_out_to_fields' => 'Checked Out To полета',
|
||||
'percent_complete' => '% завърешен',
|
||||
'uploading' => 'Качване... ',
|
||||
'upload_error' => 'Грешка при качване на файл. Моля проверете да няма празни редове или повтарящи се колони.',
|
||||
'upload_error' => 'Грешка при качване на файл. Моля проверете да нямате празни редове или повтарящи се колони във вашият CSV файл и дали имате права за качване на сървъра.',
|
||||
'copy_to_clipboard' => 'Копиране в клипборда',
|
||||
'copied' => 'Копирано!',
|
||||
'status_compatibility' => 'Ако артикула е вече асоцииран, не може да се му се смени статуса на забранен за изписване и тази стойност ще бъде игнорирана.',
|
||||
@@ -567,62 +567,62 @@ return [
|
||||
'something_went_wrong' => 'При обработката нещо се обърка.',
|
||||
'close' => 'Затвори',
|
||||
'expires' => 'Изтича',
|
||||
'map_fields'=> 'Map :item_type Fields',
|
||||
'map_fields'=> 'Зачисли полетата към :item_type',
|
||||
'remaining_var' => 'остават :count',
|
||||
'label' => 'Label',
|
||||
'import_asset_tag_exists' => 'An asset with the asset tag :asset_tag already exists and an update was not requested. No change was made.',
|
||||
'countries_manually_entered_help' => 'Values with an asterisk (*) were manually entered and do not match existing ISO 3166 dropdown values',
|
||||
'accessories_assigned' => 'Assigned Accessories',
|
||||
'user_managed_passwords' => 'Password Management',
|
||||
'user_managed_passwords_disallow' => 'Disallow users from managing their own passwords',
|
||||
'user_managed_passwords_allow' => 'Allow users to manage their own passwords',
|
||||
'from' => 'From',
|
||||
'label' => 'Етикет',
|
||||
'import_asset_tag_exists' => 'Актив с етикет :asset_tag вече съществува и обновяването не е необходимо. Не са извършени промени.',
|
||||
'countries_manually_entered_help' => 'Стойностите със звезда (*) са ръчно създадени и не са от ISO 3166 стойности',
|
||||
'accessories_assigned' => 'Зачислени Аксесоари',
|
||||
'user_managed_passwords' => 'Управление на пароли',
|
||||
'user_managed_passwords_disallow' => 'Забраняване на потребителите да управляват собствените си пароли',
|
||||
'user_managed_passwords_allow' => 'Позволяване на потребителите да управляват собствените си пароли',
|
||||
'from' => 'От',
|
||||
'by' => 'От',
|
||||
|
||||
// Add form placeholders here
|
||||
'placeholders' => [
|
||||
'notes' => 'Add a note',
|
||||
'notes' => 'Добавете бележка',
|
||||
],
|
||||
|
||||
'breadcrumb_button_actions' => [
|
||||
'edit_item' => 'Edit :name',
|
||||
'checkout_item' => 'Checkout :name',
|
||||
'checkin_item' => 'Checkin :name',
|
||||
'edit_item' => 'Редактирай :name',
|
||||
'checkout_item' => 'Изпиши :name',
|
||||
'checkin_item' => 'Впиши :name',
|
||||
],
|
||||
|
||||
'skins' => [
|
||||
'site_default' => 'Site Default',
|
||||
'default_blue' => 'Default Blue',
|
||||
'blue_dark' => 'Blue (Dark Mode)',
|
||||
'green' => 'Green Dark',
|
||||
'green_dark' => 'Green (Dark Mode)',
|
||||
'red' => 'Red Dark',
|
||||
'red_dark' => 'Red (Dark Mode)',
|
||||
'orange' => 'Orange Dark',
|
||||
'orange_dark' => 'Orange (Dark Mode)',
|
||||
'black' => 'Black',
|
||||
'black_dark' => 'Black (Dark Mode)',
|
||||
'purple' => 'Purple',
|
||||
'purple_dark' => 'Purple (Dark Mode)',
|
||||
'yellow' => 'Yellow',
|
||||
'yellow_dark' => 'Yellow (Dark Mode)',
|
||||
'high_contrast' => 'High Contrast',
|
||||
'site_default' => 'Настройки по подразбиране на сайта',
|
||||
'default_blue' => 'По подразбиране Синьо',
|
||||
'blue_dark' => 'Синьо (тъмен режим)',
|
||||
'green' => 'Тъмно Зелено',
|
||||
'green_dark' => 'Зелено (тъмен режим)',
|
||||
'red' => 'Тъмно Червено',
|
||||
'red_dark' => 'Червено (тъмен режим)',
|
||||
'orange' => 'Тъмно Оранжево',
|
||||
'orange_dark' => 'Оранжево (тъмен режим)',
|
||||
'black' => 'Черно',
|
||||
'black_dark' => 'Черно (тъмен режим)',
|
||||
'purple' => 'Лилаво',
|
||||
'purple_dark' => 'Лилаво (тъмен режим)',
|
||||
'yellow' => 'Жълто',
|
||||
'yellow_dark' => 'Жълто (тъмен режим)',
|
||||
'high_contrast' => 'Висок контраст',
|
||||
|
||||
],
|
||||
|
||||
'select_all_none' => 'Select/Unselect All',
|
||||
'generic_model_not_found' => 'That :model was not found or you do not have permission to access it',
|
||||
'deleted_models' => 'Deleted Asset Models',
|
||||
'deleted_users' => 'Deleted Users',
|
||||
'cost_each' => ':amount each',
|
||||
'remove_current_image' => 'Remove current :type image',
|
||||
'select_all_none' => 'Маркирай всички',
|
||||
'generic_model_not_found' => ':model не беше намерен или вие нямате права да го достъпите',
|
||||
'deleted_models' => 'Изтрити Модели',
|
||||
'deleted_users' => 'Изтрити Потребители',
|
||||
'cost_each' => ':amount от всеки',
|
||||
'remove_current_image' => 'Премахни текущата :type снимка',
|
||||
|
||||
'seeding' => [
|
||||
'manufacturers' => [
|
||||
'button' => 'Create Manufacturers',
|
||||
'prompt' => 'You do not have any manufacturers yet. Would you like to seed a list of common manufacturers? (THIS WILL OVERWRITE EXISTING MANUFACTURERS, including those that have been soft-deleted.)',
|
||||
'success' => 'Manufacturers seeded successfully',
|
||||
'error' => 'Could not seed manufacturers. A manufacturer record already exists and seeding would overwrite it.|Could not seed manufacturers. :count manufacturer records already exist and seeding would overwrite them.',
|
||||
'button' => 'Създаване на производители',
|
||||
'prompt' => 'Нямате създадени никакви производители все още. Изкатели да се създадат най-често срещаните пройзводители по подразбиране? (Това ще презапише всички съществуващи и вече създадени производители, включително тези който са били изтрити и са в коша.)',
|
||||
'success' => 'Създаването на производителите е успешно',
|
||||
'error' => 'Създаването на производителите върна грешка. Запис на производител вече съществува и това действие ще го презапише.|Създаването на производителите върна грешка. Има :count производителя вече създадени и това действие ще ги презапише.',
|
||||
],
|
||||
],
|
||||
|
||||
|
||||
+122
-122
@@ -13,148 +13,148 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'accepted' => 'The :attribute field must be accepted.',
|
||||
'accepted_if' => 'The :attribute field must be accepted when :other is :value.',
|
||||
'active_url' => 'The :attribute field must be a valid URL.',
|
||||
'after' => 'The :attribute field must be a date after :date.',
|
||||
'after_or_equal' => 'The :attribute field must be a date after or equal to :date.',
|
||||
'alpha' => 'The :attribute field must only contain letters.',
|
||||
'alpha_dash' => 'The :attribute field must only contain letters, numbers, dashes, and underscores.',
|
||||
'alpha_num' => 'The :attribute field must only contain letters and numbers.',
|
||||
'array' => 'The :attribute field must be an array.',
|
||||
'ascii' => 'The :attribute field must only contain single-byte alphanumeric characters and symbols.',
|
||||
'before' => 'The :attribute field must be a date before :date.',
|
||||
'before_or_equal' => 'The :attribute field must be a date before or equal to :date.',
|
||||
'accepted' => 'Полето :attribute трябва да бъде прието.',
|
||||
'accepted_if' => 'Полето :attribute трябва да бъде прието, когато :other е :value.',
|
||||
'active_url' => 'Полето :attribute трябва да съдържа валиден URL.',
|
||||
'after' => 'Полето :attribute трябва да бъде дата след :date.',
|
||||
'after_or_equal' => 'Полето :attribute трябва да бъде дата след или равна на :date.',
|
||||
'alpha' => 'Полето :attribute трябва да съдържа само букви.',
|
||||
'alpha_dash' => 'Полето :attribute трябва да съдържа само букви, цифри, тирета и подчертавания.',
|
||||
'alpha_num' => 'Полето :attribute трябва да съдържа само букви и цифри.',
|
||||
'array' => 'Полето :attribute трябва да е масив.',
|
||||
'ascii' => 'Полето :attribute трябва да съдържа еднобайтови буквено-цифрови знаци и символи.',
|
||||
'before' => 'Полето :attribute трябва да бъде дата преди :date.',
|
||||
'before_or_equal' => 'Полето :attribute трябва да бъде дата преди или равна на :date.',
|
||||
'between' => [
|
||||
'array' => 'The :attribute field must have between :min and :max items.',
|
||||
'file' => 'The :attribute field must be between :min and :max kilobytes.',
|
||||
'numeric' => 'The :attribute field must be between :min and :max.',
|
||||
'string' => 'The :attribute field must be between :min and :max characters.',
|
||||
'array' => 'Полето :attribute трябва да има между :min и :max .',
|
||||
'file' => 'Полето :attribute трябва да бъде между :min и :max килобайта.',
|
||||
'numeric' => 'Полето :attribute трябва да бъде между :min и :max .',
|
||||
'string' => 'Полето :attribute трябва да бъде между :min и :max символа.',
|
||||
],
|
||||
'boolean' => 'The :attribute field must be true or false.',
|
||||
'can' => 'The :attribute field contains an unauthorized value.',
|
||||
'confirmed' => 'The :attribute field confirmation does not match.',
|
||||
'contains' => 'The :attribute field is missing a required value.',
|
||||
'current_password' => 'The password is incorrect.',
|
||||
'date' => 'The :attribute field must be a valid date.',
|
||||
'date_equals' => 'The :attribute field must be a date equal to :date.',
|
||||
'date_format' => 'The :attribute field must match the format :format.',
|
||||
'decimal' => 'The :attribute field must have :decimal decimal places.',
|
||||
'declined' => 'The :attribute field must be declined.',
|
||||
'declined_if' => 'The :attribute field must be declined when :other is :value.',
|
||||
'different' => 'The :attribute field and :other must be different.',
|
||||
'digits' => 'The :attribute field must be :digits digits.',
|
||||
'digits_between' => 'The :attribute field must be between :min and :max digits.',
|
||||
'dimensions' => 'The :attribute field has invalid image dimensions.',
|
||||
'boolean' => 'Полето :attribute трябва да бъде Да или Не.',
|
||||
'can' => 'Полето :attribute съдържа неприемлива стойност.',
|
||||
'confirmed' => 'Полето :attribute не съвпада.',
|
||||
'contains' => 'Полето :attribute липсва необходимата стойност.',
|
||||
'current_password' => 'Паролата е грешна.',
|
||||
'date' => 'Полето :attribute трябва да съдържа валидна дата.',
|
||||
'date_equals' => 'Полето :attribute трябва да бъде дата равна на :date.',
|
||||
'date_format' => 'Полето :attribute трябва да има формат :format.',
|
||||
'decimal' => 'Полето :attribute трябва да има :decimal десетични знака.',
|
||||
'declined' => 'Полето :attribute трябва да бъде отказано.',
|
||||
'declined_if' => 'Полето :attribute трябва да бъде отказано, когато :other е :value.',
|
||||
'different' => 'Полето :attribute и :other трябва да са различни.',
|
||||
'digits' => 'Полето :attribute трябва да съдържа :digits цифри.',
|
||||
'digits_between' => 'Полето :attribute трябва да бъде между :min и :max цифри.',
|
||||
'dimensions' => 'Полето :attribute има невалидни размери на снимката.',
|
||||
'distinct' => 'Полето: atribut има дублираща се стойност.',
|
||||
'doesnt_end_with' => 'The :attribute field must not end with one of the following: :values.',
|
||||
'doesnt_start_with' => 'The :attribute field must not start with one of the following: :values.',
|
||||
'email' => 'The :attribute field must be a valid email address.',
|
||||
'ends_with' => 'The :attribute field must end with one of the following: :values.',
|
||||
'doesnt_end_with' => 'Полето :attribute трябва да не завършва на: :values.',
|
||||
'doesnt_start_with' => 'Полето :attribute трябва да не започва с: :values.',
|
||||
'email' => 'Полето :attribute трябва да съдържа валиден е-майл адрес.',
|
||||
'ends_with' => 'Полето :attribute трябва да завършва на: :values.',
|
||||
'enum' => 'Избраният :attribute е невалиден.',
|
||||
'exists' => 'Избраният :attribute е невалиден.',
|
||||
'extensions' => 'The :attribute field must have one of the following extensions: :values.',
|
||||
'file' => 'The :attribute field must be a file.',
|
||||
'extensions' => 'Полето :attribute трябва да има едно от следните разширения: :values.',
|
||||
'file' => 'Полето :attribute трябва да бъде файл.',
|
||||
'filled' => 'Полето на атрибута: трябва да има стойност.',
|
||||
'gt' => [
|
||||
'array' => 'The :attribute field must have more than :value items.',
|
||||
'file' => 'The :attribute field must be greater than :value kilobytes.',
|
||||
'numeric' => 'The :attribute field must be greater than :value.',
|
||||
'string' => 'The :attribute field must be greater than :value characters.',
|
||||
'array' => 'Полето :attribute трябва да съдържа повече от :value стойности.',
|
||||
'file' => 'Полето :attribute трябва да бъде по-голямо от :value килобайта.',
|
||||
'numeric' => 'Полето :attribute трябва да бъде по-голямо от :value.',
|
||||
'string' => 'Полето :attribute трябва да бъде по-голямо от :value символа.',
|
||||
],
|
||||
'gte' => [
|
||||
'array' => 'The :attribute field must have :value items or more.',
|
||||
'file' => 'The :attribute field must be greater than or equal to :value kilobytes.',
|
||||
'numeric' => 'The :attribute field must be greater than or equal to :value.',
|
||||
'string' => 'The :attribute field must be greater than or equal to :value characters.',
|
||||
'array' => 'Полето :attribute трябва да има :value или повече неща.',
|
||||
'file' => 'Полето :attribute трябва да бъде повече или равно на :value килобайта.',
|
||||
'numeric' => 'Полето :attribute трябва да бъде повече или равно на :value.',
|
||||
'string' => 'Полето :attribute трябва да бъде повече или равно на :value символа.',
|
||||
],
|
||||
'hex_color' => 'The :attribute field must be a valid hexadecimal color.',
|
||||
'image' => 'The :attribute field must be an image.',
|
||||
'hex_color' => 'Полето :attribute трябва да съдържа валиден шестнадесетичен цвят.',
|
||||
'image' => 'Полето :attribute трябва да бъде снимка.',
|
||||
'import_field_empty' => 'Стойността за :fieldname не може да бъде празна.',
|
||||
'in' => 'Избраният :attribute е невалиден.',
|
||||
'in_array' => 'The :attribute field must exist in :other.',
|
||||
'integer' => 'The :attribute field must be an integer.',
|
||||
'ip' => 'The :attribute field must be a valid IP address.',
|
||||
'ipv4' => 'The :attribute field must be a valid IPv4 address.',
|
||||
'ipv6' => 'The :attribute field must be a valid IPv6 address.',
|
||||
'json' => 'The :attribute field must be a valid JSON string.',
|
||||
'list' => 'The :attribute field must be a list.',
|
||||
'lowercase' => 'The :attribute field must be lowercase.',
|
||||
'in_array' => 'Полето :attribute трябва да се съдържа в :other.',
|
||||
'integer' => 'Полето :attribute трябва да бъде цяло число.',
|
||||
'ip' => 'Полето :attribute трябва да бъде валиден IP адрес.',
|
||||
'ipv4' => 'Полето :attribute трябва да бъде валиден IPv4 адрес.',
|
||||
'ipv6' => 'Полето :attribute трябва да бъде валиден IPv6 адрес.',
|
||||
'json' => 'Полето :attribute трябва да бъде валиден JSON низ.',
|
||||
'list' => 'Полето :attribute трябва да бъде списък.',
|
||||
'lowercase' => 'Полето :attribute трябва да бъде с малки букви.',
|
||||
'lt' => [
|
||||
'array' => 'The :attribute field must have less than :value items.',
|
||||
'file' => 'The :attribute field must be less than :value kilobytes.',
|
||||
'numeric' => 'The :attribute field must be less than :value.',
|
||||
'string' => 'The :attribute field must be less than :value characters.',
|
||||
'array' => 'Полето :attribute трябва да бъде по-малко от :value .',
|
||||
'file' => 'Полето :attribute трябва да бъде по-малко от :value килобайта.',
|
||||
'numeric' => 'Полето :attribute трябва да бъде по-малко от :value.',
|
||||
'string' => 'Полето :attribute трябва да бъде помалко от :value символа.',
|
||||
],
|
||||
'lte' => [
|
||||
'array' => 'The :attribute field must not have more than :value items.',
|
||||
'file' => 'The :attribute field must be less than or equal to :value kilobytes.',
|
||||
'numeric' => 'The :attribute field must be less than or equal to :value.',
|
||||
'string' => 'The :attribute field must be less than or equal to :value characters.',
|
||||
'array' => 'Полето :attribute не трябва да съдържа повече от :value стойности.',
|
||||
'file' => 'Полето :attribute трябва да бъде по-малко или равно на :value килобайта.',
|
||||
'numeric' => 'Полето :attribute трябва да бъде по-малко или равно на :value.',
|
||||
'string' => 'Полето :attribute трябва да бъде по-малко или равно на :value символа.',
|
||||
],
|
||||
'mac_address' => 'The :attribute field must be a valid MAC address.',
|
||||
'mac_address' => 'Полето :attribute трябва да бъде валиден MAC адрес.',
|
||||
'max' => [
|
||||
'array' => 'The :attribute field must not have more than :max items.',
|
||||
'file' => 'The :attribute field must not be greater than :max kilobytes.',
|
||||
'numeric' => 'The :attribute field must not be greater than :max.',
|
||||
'string' => 'The :attribute field must not be greater than :max characters.',
|
||||
'array' => 'Полето :attribute не трябва да е повече от :max .',
|
||||
'file' => 'Полето :attribute не трябва да е повече от :max килобайта.',
|
||||
'numeric' => 'Полето :attribute не трябва да е повече от :max.',
|
||||
'string' => 'Полето :attribute не трябва да е повече от :max символа.',
|
||||
],
|
||||
'max_digits' => 'The :attribute field must not have more than :max digits.',
|
||||
'mimes' => 'The :attribute field must be a file of type: :values.',
|
||||
'mimetypes' => 'The :attribute field must be a file of type: :values.',
|
||||
'max_digits' => 'Полето :attribute не трябва да съдържа повече от :max цифри.',
|
||||
'mimes' => 'Полето :attribute трябва да бъде файл от тип: :values.',
|
||||
'mimetypes' => 'Полето :attribute трябва да бъде файл от тип: :values.',
|
||||
'min' => [
|
||||
'array' => 'The :attribute field must have at least :min items.',
|
||||
'file' => 'The :attribute field must be at least :min kilobytes.',
|
||||
'numeric' => 'The :attribute field must be at least :min.',
|
||||
'string' => 'The :attribute field must be at least :min characters.',
|
||||
'array' => 'Полето :attribute трябва да съдържа най-малко :min стойности.',
|
||||
'file' => 'Полето :attribute трябва да бъде най-малко :min килобайта.',
|
||||
'numeric' => 'Полето :attribute трябва да бъде най-малко :min.',
|
||||
'string' => 'Полето :attribute трябва да бъде минимум :min символа.',
|
||||
],
|
||||
'min_digits' => 'The :attribute field must have at least :min digits.',
|
||||
'missing' => 'The :attribute field must be missing.',
|
||||
'missing_if' => 'The :attribute field must be missing when :other is :value.',
|
||||
'missing_unless' => 'The :attribute field must be missing unless :other is :value.',
|
||||
'missing_with' => 'The :attribute field must be missing when :values is present.',
|
||||
'missing_with_all' => 'The :attribute field must be missing when :values are present.',
|
||||
'multiple_of' => 'The :attribute field must be a multiple of :value.',
|
||||
'min_digits' => 'Полето :attribute трябва да бъде минимум :min цифри.',
|
||||
'missing' => 'Полето :attribute трябва да липсва.',
|
||||
'missing_if' => 'Полето :attribute трябва да липсва, когато :other е :value.',
|
||||
'missing_unless' => 'Полето :attribute трябва да липсва, освен когато :other e :value.',
|
||||
'missing_with' => 'Полето :attribute трябва да липсва, когато :values е налице.',
|
||||
'missing_with_all' => 'Полето :attribute трябва да липсва, когато :values е налице.',
|
||||
'multiple_of' => 'Полето :attribute трябва да е кратно на :value.',
|
||||
'not_in' => 'Избраният :attribute е невалиден.',
|
||||
'not_regex' => 'The :attribute field format is invalid.',
|
||||
'numeric' => 'The :attribute field must be a number.',
|
||||
'not_regex' => 'Полето :attribute е с невалиден формат.',
|
||||
'numeric' => 'Полето :attribute трябва да бъде число.',
|
||||
'password' => [
|
||||
'letters' => 'The :attribute field must contain at least one letter.',
|
||||
'mixed' => 'The :attribute field must contain at least one uppercase and one lowercase letter.',
|
||||
'numbers' => 'The :attribute field must contain at least one number.',
|
||||
'symbols' => 'The :attribute field must contain at least one symbol.',
|
||||
'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.',
|
||||
'letters' => 'Полето :attribute трябва да съдръжа поне една буква.',
|
||||
'mixed' => 'Полето :attribute трябва да съдържа поне една главна и една малка буква.',
|
||||
'numbers' => 'Полето :attribute трябва да съдържа поне една цифра.',
|
||||
'symbols' => 'Полето :attribute трябва да съдържа поне един символ.',
|
||||
'uncompromised' => 'Избраната :attribute e намерена в хакнати пароли. Моля изберете друга :attribute.',
|
||||
],
|
||||
'percent' => 'The depreciation minimum must be between 0 and 100 when depreciation type is percentage.',
|
||||
'percent' => 'Минималната стойност на амортизацията трябва да бъде между 0 и 100, когато типът амортизация е процент.',
|
||||
|
||||
'present' => 'Полето на атрибута трябва да е налице.',
|
||||
'present_if' => 'The :attribute field must be present when :other is :value.',
|
||||
'present_unless' => 'The :attribute field must be present unless :other is :value.',
|
||||
'present_with' => 'The :attribute field must be present when :values is present.',
|
||||
'present_with_all' => 'The :attribute field must be present when :values are present.',
|
||||
'prohibited' => 'The :attribute field is prohibited.',
|
||||
'prohibited_if' => 'The :attribute field is prohibited when :other is :value.',
|
||||
'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.',
|
||||
'prohibits' => 'The :attribute field prohibits :other from being present.',
|
||||
'regex' => 'The :attribute field format is invalid.',
|
||||
'present_if' => 'Полето :attribute трябва да е попълнено, когато :other е :value.',
|
||||
'present_unless' => 'Полето :attribute трябва да е попълнено, освен когато :other е :value.',
|
||||
'present_with' => 'Полето :attribute трябва да е попълнено, когато :values е налице.',
|
||||
'present_with_all' => 'Полето :attribute трябва да е попълнено, когато :values са на лице.',
|
||||
'prohibited' => 'Полето :attribute е забранено.',
|
||||
'prohibited_if' => 'Полето :attribute е забранено, когато :other е :value.',
|
||||
'prohibited_unless' => 'Полето :attribute е забранено, освен когато :other е в :values.',
|
||||
'prohibits' => 'Полето :attribute забранява :other да бъде налично.',
|
||||
'regex' => 'Полето :attribute е с невалиден формат.',
|
||||
'required' => 'Полето :attribute е задължително.',
|
||||
'required_array_keys' => 'The :attribute field must contain entries for: :values.',
|
||||
'required_array_keys' => 'Полето :attribute трябва да съдържа записи за: :values.',
|
||||
'required_if' => 'Полето :attribute е задължително, когато :other е :value.',
|
||||
'required_if_accepted' => 'The :attribute field is required when :other is accepted.',
|
||||
'required_if_declined' => 'The :attribute field is required when :other is declined.',
|
||||
'required_if_accepted' => 'Полето :attribute е задължително, когато :other e приет.',
|
||||
'required_if_declined' => 'Полето :attribute е задължително, когато :other e отхвърлен.',
|
||||
'required_unless' => 'Полето: атрибут се изисква, освен ако: другият не е в: стойности.',
|
||||
'required_with' => ':attribute е задължителен, когато са избрани :values.',
|
||||
'required_with_all' => 'The :attribute field is required when :values are present.',
|
||||
'required_with_all' => 'Полето :attribute е задъклжително, когато :values имат стойност.',
|
||||
'required_without' => ':attribute е задължителен, когато не са избрани :values.',
|
||||
'required_without_all' => 'Полето: атрибут се изисква, когато няма стойности: стойности.',
|
||||
'same' => 'The :attribute field must match :other.',
|
||||
'same' => 'Полето :attribute трябва да съвпада с :other.',
|
||||
'size' => [
|
||||
'array' => 'The :attribute field must contain :size items.',
|
||||
'file' => 'The :attribute field must be :size kilobytes.',
|
||||
'numeric' => 'The :attribute field must be :size.',
|
||||
'string' => 'The :attribute field must be :size characters.',
|
||||
'array' => 'Полето :attribute трябва да съдържа :size елементи.',
|
||||
'file' => 'Полето :attribute трябва да бъде с големина :size килобайта.',
|
||||
'numeric' => 'Полето :attribute трябва да бъде :size.',
|
||||
'string' => 'Полето :attribute трябва да бъде с дължина :size символа.',
|
||||
],
|
||||
'starts_with' => 'The :attribute field must start with one of the following: :values.',
|
||||
'starts_with' => 'Полето :attribute трябва да започва с: :values.',
|
||||
'string' => 'Атрибутът: трябва да е низ.',
|
||||
'two_column_unique_undeleted' => ':attribute трябва да бъде уникален за :table1 и :table2. ',
|
||||
'unique_undeleted' => ':attribute трябва да бъде уникален.',
|
||||
@@ -165,14 +165,14 @@ return [
|
||||
'numbers' => 'Паролата трябва да съдържа поне една цифра.',
|
||||
'case_diff' => 'Паролата трябва да съдържа главни и малки букви.',
|
||||
'symbols' => 'Паролата трябва да съдържа символи.',
|
||||
'timezone' => 'The :attribute field must be a valid timezone.',
|
||||
'timezone' => 'Полето :attribute трябва да бъде валидна часова зона.',
|
||||
'unique' => ':attribute вече е вписан.',
|
||||
'uploaded' => 'Атрибутът: не успя да качи.',
|
||||
'uppercase' => 'The :attribute field must be uppercase.',
|
||||
'url' => 'The :attribute field must be a valid URL.',
|
||||
'ulid' => 'The :attribute field must be a valid ULID.',
|
||||
'uuid' => 'The :attribute field must be a valid UUID.',
|
||||
'fmcs_location' => 'Full multiple company support and location scoping is enabled in the Admin Settings, and the selected location and selected company are not compatible.',
|
||||
'uppercase' => 'Полето :attribute трябва да бъде с главни букви.',
|
||||
'url' => 'Полето :attribute трябва да съдържа валиден URL.',
|
||||
'ulid' => 'Полето :attribute трябва да бъде валиден ULID.',
|
||||
'uuid' => 'Полето :attribute трябва да съдържа валиден UUID.',
|
||||
'fmcs_location' => 'Пълна поддръжка за множество компаний и местоположения е включена в админ настройките, но избраната локация и компания не са съвместими.',
|
||||
|
||||
|
||||
/*
|
||||
@@ -196,8 +196,8 @@ return [
|
||||
'hashed_pass' => 'Текущата ви парола е неправилна',
|
||||
'dumbpwd' => 'Тази парола е твърде често срещана.',
|
||||
'statuslabel_type' => 'Трябва да изберете валиден тип етикет на състоянието',
|
||||
'custom_field_not_found' => 'This field does not seem to exist, please double check your custom field names.',
|
||||
'custom_field_not_found_on_model' => 'This field seems to exist, but is not available on this Asset Model\'s fieldset.',
|
||||
'custom_field_not_found' => 'Това поле не съществува, моля проверете името на полето по избор.',
|
||||
'custom_field_not_found_on_model' => 'Това поле вече съществува, но не е налично за избрания дълготраен актив.',
|
||||
|
||||
// date_format validation with slightly less stupid messages. It duplicates a lot, but it gets the job done :(
|
||||
// We use this because the default error message for date_format reflects php Y-m-d, which non-PHP
|
||||
@@ -212,10 +212,10 @@ return [
|
||||
'invalid_value_in_field' => 'В това поле е включена невалидна стойност',
|
||||
|
||||
'ldap_username_field' => [
|
||||
'not_in' => '<code>sAMAccountName</code> (mixed case) will likely not work. You should use <code>samaccountname</code> (lowercase) instead.'
|
||||
'not_in' => '<code>sAMAccountName</code> (mixed case) няма да работи. Трябва да използвате <code>samaccountname</code> (lowercase) вместо това.'
|
||||
],
|
||||
'ldap_auth_filter_query' => ['not_in' => '<code>uid=samaccountname</code> is probably not a valid auth filter. You probably want <code>uid=</code> '],
|
||||
'ldap_filter' => ['regex' => 'This value should probably not be wrapped in parentheses.'],
|
||||
'ldap_auth_filter_query' => ['not_in' => '<code>uid=samaccountname</code> не е валиден филтър за автентикация. Ползвайте <code>uid=</code> '],
|
||||
'ldap_filter' => ['regex' => 'Стойността не трябва да е в кавички.'],
|
||||
|
||||
],
|
||||
/*
|
||||
@@ -240,8 +240,8 @@ return [
|
||||
|
||||
'generic' => [
|
||||
'invalid_value_in_field' => 'В това поле е включена невалидна стойност',
|
||||
'required' => 'This field is required',
|
||||
'email' => 'Please enter a valid email address',
|
||||
'required' => 'Това поле е задължително',
|
||||
'email' => 'Моля, въведете валиден имейл адрес',
|
||||
],
|
||||
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ return [
|
||||
'manage' => 'Manage',
|
||||
'field' => 'Field',
|
||||
'about_fieldsets_title' => 'About Fieldsets',
|
||||
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used used for specific asset model types.',
|
||||
'about_fieldsets_text' => 'Fieldsets allow you to create groups of custom fields that are frequently re-used for specific asset model types.',
|
||||
'custom_format' => 'Custom Regex format...',
|
||||
'encrypt_field' => 'Encrypt the value of this field in the database',
|
||||
'encrypt_field_help' => 'WARNING: Encrypting a field makes it unsearchable.',
|
||||
|
||||
@@ -49,12 +49,11 @@ return [
|
||||
'error_redirect' => 'ERROR: 301/302 :endpoint returns a redirect. For security reasons, we don’t follow redirects. Please use the actual endpoint.',
|
||||
'error_misc' => 'Something went wrong. :( ',
|
||||
'webhook_fail' => ' webhook notification failed: Check to make sure the URL is still valid.',
|
||||
'webhook_channel_not_found' => ' webhook channel not found.'
|
||||
'webhook_channel_not_found' => ' webhook channel not found.',
|
||||
'ms_teams_deprecation' => 'The selected Microsoft Teams webhook URL will be deprecated Dec 31st, 2025. Please use a workflow URL. Microsoft\'s documentation on creating a workflow can be found <a href="https://support.microsoft.com/en-us/office/create-incoming-webhooks-with-workflows-for-microsoft-teams-8ae491c7-0394-4861-ba59-055e33f75498" target="_blank"> here.</a>',
|
||||
],
|
||||
|
||||
'location_scoping' => [
|
||||
'not_saved' => 'Your settings were not saved.',
|
||||
'mismatch' => 'There is 1 item in the database that need your attention before you can enable location scoping.|There are :count items in the database that need your attention before you can enable location scoping.',
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
'about' => 'About Status Labels',
|
||||
'about' => 'About Status Types',
|
||||
'archived' => 'Arxivat',
|
||||
'create' => 'Create Status Label',
|
||||
'color' => 'Chart Color',
|
||||
'default_label' => 'Default Label',
|
||||
'default_label_help' => 'This is used to ensure your most commonly used status labels appear at the top of the select box when creating/editing assets.',
|
||||
'deployable' => 'Deployable',
|
||||
'info' => 'Status labels are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for deployable, pending and archived assets.',
|
||||
'info' => 'Status label types are used to describe the various states your assets could be in. They may be out for repair, lost/stolen, etc. You can create new status labels for your deployable, pending and archived assets according to your own workflow. For more information, <a href="https://snipe-it.readme.io/docs/overview#status-labels" target="_blank">see the documentation <i class="fa fa-external-link"></i></a>.',
|
||||
'name' => 'Status Name',
|
||||
'pending' => 'Pending',
|
||||
'status_type' => 'Status Type',
|
||||
|
||||
@@ -522,7 +522,7 @@ return [
|
||||
'checked_out_to_fields' => 'Checked Out To Fields',
|
||||
'percent_complete' => '% completar',
|
||||
'uploading' => 'Uploading... ',
|
||||
'upload_error' => 'Error uploading file. Please check that there are no empty rows and that no column names are duplicated.',
|
||||
'upload_error' => 'Error uploading file. Please check that you have no empty rows or duplicated column names in your CSV, and that the server permissions allow uploads.',
|
||||
'copy_to_clipboard' => 'Copy to Clipboard',
|
||||
'copied' => 'Copied!',
|
||||
'status_compatibility' => 'If assets are already assigned, they cannot be changed to a non-deployable status type and this value change will be skipped.',
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user