Compare commits

...

35 Commits

Author SHA1 Message Date
snipe
eba145503b Bumped version 2017-09-06 19:02:05 -07:00
snipe
ae8c9d6afc Updated translations 2017-09-06 18:05:32 -07:00
snipe
faeca4139d Added new languages, commented out ones with 0% translated 2017-09-06 17:51:11 -07:00
snipe
47909b93f7 Fixed deleted users/restore users view 2017-09-06 17:11:43 -07:00
snipe
472658b2fe Fixes #3924 - missing/donked language string 2017-09-06 17:11:23 -07:00
snipe
42a03a0436 Merge branch 'develop' of github.com:snipe/snipe-it into develop 2017-09-06 16:25:07 -07:00
Daniel Meltzer
ae0573b3da Fix asset create (#3929)
* Fix accidental commit of ImporterTest.

* Move the name() method to the presenter

This fixes some weird collisions between laravels voodoo and our
presenter voodoo that confused php.  It's also probably a cleaner place
to put it.  Should fix #3927

* Add missing parenthesis

* Add heading to tables on locations/view page.
2017-09-06 16:24:43 -07:00
snipe
34f816097e Fixed missing quotation mark 2017-09-06 15:43:07 -07:00
snipe
c651c9f1ed Merge branch 'develop' of github.com:snipe/snipe-it into develop 2017-09-05 18:35:43 -07:00
snipe
7c390cee2c Bumped version 2017-09-05 18:35:39 -07:00
Daniel Meltzer
987536930c Assorted fixes (#3923)
* Fix some n+1 problems

* Use route in notification dropdown to make sure we link to correct page

* Work on better UI support for checkout to non-user.  Fix links on index bootstrap table, work towards eliminating assignedUser

* Remove Asset::assigneduser() relationship.  Instead add a checkedOutToUser() method and/or port to using assignedTo()

* Adjust string to fit new reality

* Fix #3780.  Move the consumables getDataView method to the ApiController.  Not entirely RESTful, but it's a weird method that probably doesn't need its own controller and the functionality would be strange to stack on the userscontroller...

* Fix file uploads to assets and restore the delete route.

* Add asset maintence edit action to index.

* Suppliers asset list should link to the related asset, not to the supplier with same ID.

* Asset models page should use polymorphic formatter on assigned to to better handle assorted item types.

* Comment out more assigneduser fallacy until we figure out the query builder approach to searching for location text.
2017-09-05 17:54:58 -07:00
snipe
10f322198f Move audited count to top of table 2017-08-31 21:31:07 -07:00
snipe
761371509d Use notifiables for slack audit notification 2017-08-31 21:30:38 -07:00
snipe
3518ea7e7d Fixes #606 - email notifications for expected checkins 2017-08-31 21:18:05 -07:00
snipe
c92eed2b3e Small HTML email tweaks 2017-08-31 21:17:02 -07:00
snipe
0054ce3071 Fixes #3907 2017-08-31 13:45:48 -07:00
snipe
b0f74466bb Removed dd 2017-08-31 11:15:52 -07:00
snipe
b4a0484295 Merge branch 'develop' of github.com:snipe/snipe-it into develop 2017-08-31 11:15:03 -07:00
Daniel Meltzer
bb874012d9 Progress towards better email notifications (#3911)
Working mail from notification.  Still requires testing/cleaning

Add tests around checkout notification.

This also removes the ability to check out an asset to a location|asset
that requires acceptance/a Eula.  For 4.1 we may think about how to
support such a thing, but at present it seems to make sense to only alow
such assets to be checked out to users, who can be responsible for the
items.
2017-08-31 11:14:21 -07:00
snipe
bb8583eb14 Remove lower casing for LDAP array re: #3910 2017-08-31 11:00:08 -07:00
snipe
8d2c229bc3 Move LDAP validation into form request 2017-08-31 10:44:00 -07:00
snipe
48e6208214 Fixes #3907 - do not require username on user if LDAP import 2017-08-31 10:43:36 -07:00
snipe
22233e3ba6 Bulk asset audit form (needs more testing) 2017-08-29 16:00:22 -07:00
snipe
e439f15a64 Fixed some date math for auditing 2017-08-28 17:20:20 -07:00
snipe
42175782a5 Only pull logo if there is a value 2017-08-26 17:43:00 -07:00
snipe
c7a21e0e4d Production asset build 2017-08-26 17:39:59 -07:00
snipe
d98ffd94f9 Localized modal titles with correct headers 2017-08-26 16:16:41 -07:00
Brady Wetherington
6ad5da44f3 Formalize modals (#3898)
* Refactor Modal JS into standalone file, remove duplicated JS and HTML

* Finish fixing Bulk-checkout and checkout
2017-08-26 16:06:52 -07:00
snipe
479f422e68 Added default if no audit settings are in place 2017-08-26 15:27:50 -07:00
snipe
e10cdd57a5 Removed old getassetloist method 2017-08-26 15:22:04 -07:00
snipe
bf157773c8 Also related to #3888 2017-08-26 15:21:38 -07:00
snipe
fba3949530 Fixes #3888 - broken preview of existing assets 2017-08-26 15:21:10 -07:00
snipe
abc3dea8ac Fixed wonky datepicker on bulk checkout 2017-08-26 14:16:16 -07:00
snipe
51d74ac06d Auduting improvements 2017-08-25 18:40:20 -07:00
snipe
af835d6efc Additional setting validation for new fields 2017-08-25 17:59:01 -07:00
388 changed files with 6170 additions and 3494 deletions

View File

@@ -0,0 +1,64 @@
<?php
namespace App\Console\Commands;
use App\Models\Asset;
use Illuminate\Console\Command;
use App\Notifications\ExpectedCheckinNotification;
use Carbon\Carbon;
class SendExpectedCheckinAlerts extends Command
{
/**
* The console command name.
*
* @var string
*/
protected $name = 'snipeit:expected-checkin';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Check for overdue or upcoming expected checkins.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function fire()
{
$whenNotify = Carbon::now()->addDays(7);
$assets = Asset::with('assignedTo')->whereNotNull('expected_checkin')->where('expected_checkin', '<=', $whenNotify)->get();
$this->info($whenNotify.' is deadline');
$this->info($assets->count().' assets');
foreach ($assets as $asset) {
if ($asset->assignedTo && $asset->checkoutOutToUser()) {
$asset->assignedTo->notify((new ExpectedCheckinNotification($asset)));
//$this->info($asset);
}
}
}
}

View File

@@ -17,6 +17,7 @@ class Kernel extends ConsoleKernel
Commands\CreateAdmin::class,
Commands\SendExpirationAlerts::class,
Commands\SendInventoryAlerts::class,
Commands\SendExpectedCheckinAlerts::class,
Commands\ObjectImportCommand::class,
Commands\Versioning::class,
Commands\SystemBackup::class,
@@ -38,6 +39,7 @@ class Kernel extends ConsoleKernel
$schedule->command('snipeit:inventory-alerts')->daily();
$schedule->command('snipeit:expiring-alerts')->daily();
$schedule->command('snipeit:expected-checkins')->daily();
$schedule->command('snipeit:backup')->weekly();
$schedule->command('backup:clean')->daily();
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Exceptions;
use Exception;
class CheckoutNotAllowed extends Exception
{
public function __toString()
{
"A checkout is not allowed under these circumstances";
}
}

View File

@@ -260,7 +260,7 @@ class AccessoriesController extends Controller
'assigned_to' => $request->get('assigned_to')
]);
$logaction = $accessory->logCheckout(e(Input::get('note')));
$logaction = $accessory->logCheckout(e(Input::get('note')), $user);
DB::table('accessories_users')->where('assigned_to', '=', $accessory->assigned_to)->where('accessory_id', '=', $accessory->id)->first();

View File

@@ -1,16 +1,17 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\AssetMaintenance;
use Carbon\Carbon;
use App\Models\Company;
use App\Models\Asset;
use App\Helpers\Helper;
use Auth;
use Gate;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Transformers\AssetMaintenancesTransformer;
use App\Models\Asset;
use App\Models\AssetMaintenance;
use App\Models\Company;
use Auth;
use Carbon\Carbon;
use Gate;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Input;
/**
* This controller handles all actions related to Asset Maintenance for

View File

@@ -84,9 +84,8 @@ class AssetsController extends Controller
}
$assets = Company::scopeCompanyables(Asset::select('assets.*'))->with(
'assetLoc', 'assetstatus', 'defaultLoc', 'assetlog', 'company',
'model.category', 'model.manufacturer', 'model.fieldset', 'assigneduser','supplier');
'assetloc', 'assetstatus', 'defaultLoc', 'assetlog', 'company',
'model.category', 'model.manufacturer', 'model.fieldset','supplier');
// If we should search on everything
if (($request->has('search')) && (count($filter) == 0)) {
$assets->TextSearch($request->input('search'));
@@ -97,7 +96,6 @@ class AssetsController extends Controller
}
}
// These are used by the API to query against specific ID numbers
if ($request->has('status_id')) {
$assets->where('status_id', '=', $request->input('status_id'));
@@ -507,23 +505,41 @@ class AssetsController extends Controller
* @since [v4.0]
* @return JsonResponse
*/
public function audit(Request $request, $id) {
public function audit(Request $request) {
$this->authorize('audit', Asset::class);
$rules = array(
'id' => 'required'
'asset_tag' => 'required',
'location_id' => 'exists:locations,id|nullable|numeric',
'next_audit_date' => 'date|nullable'
);
$validator = \Validator::make($request->all(), $rules);
$asset = Asset::findOrFail($id);
$asset->next_audit_date = $request->input('next_audit_date');
if ($asset->save()) {
$asset->logAudit(request('note'));
return response()->json(Helper::formatStandardApiResponse('success', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.audit.success')));
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors()->all()));
}
$asset = Asset::where('asset_tag','=', $request->input('asset_tag'))->first();
if ($asset) {
$asset->next_audit_date = $request->input('next_audit_date');
if ($asset->save()) {
$log = $asset->logAudit(request('note'),request('location_id'));
return response()->json(Helper::formatStandardApiResponse('success', [
'asset_tag'=> e($asset->asset_tag),
'note'=> e($request->input('note')),
'next_audit_date' => Helper::getFormattedDateObject($log->calcNextAuditDate())
], trans('admin/hardware/message.audit.success')));
}
}
return response()->json(Helper::formatStandardApiResponse('error', ['asset_tag'=> e($request->input('asset_tag'))], 'Asset with tag '.$request->input('asset_tag').' not found'));
}
}

View File

@@ -148,4 +148,47 @@ class ConsumablesController extends Controller
$consumable->delete();
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/consumables/message.delete.success')));
}
/**
* Returns a JSON response containing details on the users associated with this consumable.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @see ConsumablesController::getView() method that returns the form.
* @since [v1.0]
* @param int $consumableId
* @return array
*/
public function getDataView($consumableId)
{
//$consumable = Consumable::find($consumableID);
$consumable = Consumable::with(array('consumableAssignments'=>
function ($query) {
$query->orderBy('created_at', 'DESC');
},
'consumableAssignments.admin'=> function ($query) {
},
'consumableAssignments.user'=> function ($query) {
},
))->find($consumableId);
// $consumable->load('consumableAssignments.admin','consumableAssignments.user');
if (!Company::isCurrentUserHasAccess($consumable)) {
return ['total' => 0, 'rows' => []];
}
$this->authorize('view', Component::class);
$rows = array();
foreach ($consumable->consumableAssignments as $consumable_assignment) {
$rows[] = [
'name' => $consumable_assignment->user->present()->nameUrl(),
'created_at' => ($consumable_assignment->created_at->format('Y-m-d H:i:s')=='-0001-11-30 00:00:00') ? '' : $consumable_assignment->created_at->format('Y-m-d H:i:s'),
'admin' => ($consumable_assignment->admin) ? $consumable_assignment->admin->present()->nameUrl() : '',
];
}
$consumableCount = $consumable->users->count();
$data = array('total' => $consumableCount, 'rows' => $rows);
return $data;
}
}

View File

@@ -21,7 +21,7 @@ class LicensesController extends Controller
public function index(Request $request)
{
$this->authorize('view', License::class);
$licenses = Company::scopeCompanyables(License::with('company', 'licenseSeatsRelation', 'manufacturer'));
$licenses = Company::scopeCompanyables(License::with('company', 'licenseSeatsRelation', 'manufacturer', 'supplier'));
if ($request->has('search')) {
$licenses = $licenses->TextSearch($request->input('search'));

View File

@@ -19,7 +19,7 @@ class ReportsController extends Controller
public function index(Request $request)
{
$actionlogs = Actionlog::with('item', 'user', 'target');
$actionlogs = Actionlog::with('item', 'user', 'target','location');
if ($request->has('search')) {
$actionlogs = $actionlogs->TextSearch(e($request->input('search')));

View File

@@ -9,6 +9,7 @@ use App\Models\Company;
use App\Models\User;
use App\Helpers\Helper;
use App\Http\Requests\SaveUserRequest;
use App\Models\Asset;
class UsersController extends Controller
{
@@ -51,6 +52,12 @@ class UsersController extends Controller
$users = $users->TextSearch($request->input('search'));
}
if (($request->has('deleted')) && ($request->input('deleted')=='true')) {
$users = $users->GetDeleted();
}
if ($request->has('company_id')) {
$users = $users->where('company_id', '=', $request->input('company_id'));
}
@@ -182,4 +189,19 @@ class UsersController extends Controller
}
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete')));
}
/**
* Return JSON containing a list of assets assigned to a user.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.0]
* @param $userId
* @return string JSON
*/
public function assets($id)
{
$this->authorize('view', User::class);
$assets = Asset::where('assigned_to', '=', $id)->with('model')->get();
return response()->json($assets);
}
}

View File

@@ -537,17 +537,18 @@ class AssetsController extends Controller
$this->authorize('checkin', $asset);
$admin = Auth::user();
$user = $asset->assignedUser;
if($asset->assignedType() == Asset::USER) {
$user = $asset->assignedTo;
}
if (is_null($target = $asset->assignedTo)) {
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkin.already_checked_in'));
}
// This is just used for the redirect
$return_to = $asset->assigned_to;
$asset->expected_checkin = null;
$asset->last_checkout = null;
$asset->assigned_to = null;
$asset->assignedTo()->disassociate($asset);
$asset->assigned_type = null;
$asset->accepted = null;
$asset->name = e(Input::get('name'));
@@ -566,7 +567,7 @@ class AssetsController extends Controller
$data['item_serial'] = $asset->serial;
$data['note'] = $logaction->note;
if ((($asset->checkin_email()=='1')) && (isset($user)) && (!config('app.lock_passwords'))) {
if ((($asset->checkin_email()=='1')) && (isset($user)) && (!empty($user->email)) && (!config('app.lock_passwords'))) {
Mail::send('emails.checkin-asset', $data, function ($m) use ($user) {
$m->to($user->email, $user->first_name . ' ' . $user->last_name);
$m->replyTo(config('mail.reply_to.address'), config('mail.reply_to.name'));
@@ -575,7 +576,7 @@ class AssetsController extends Controller
}
if ($backto=='user') {
return redirect()->to("admin/users/".$return_to.'/view')->with('success', trans('admin/hardware/message.checkin.success'));
return redirect()->to("admin/users/".$user->id.'/view')->with('success', trans('admin/hardware/message.checkin.success'));
}
return redirect()->route("hardware.index")->with('success', trans('admin/hardware/message.checkin.success'));
}
@@ -957,7 +958,7 @@ class AssetsController extends Controller
* @since [v1.0]
* @return View
*/
public function getDeleteFile($assetId = null, $fileId = null)
public function deleteFile($assetId = null, $fileId = null)
{
$asset = Asset::find($assetId);
$this->authorize('update', $asset);
@@ -1238,25 +1239,43 @@ class AssetsController extends Controller
return redirect()->to("hardware/bulk-checkout")->with('error', trans('admin/hardware/message.checkout.error'))->withErrors($errors);
}
public function quickScan(Request $request)
{
$this->authorize('audit', Asset::class);
$dt = Carbon::now()->addMonths(12)->toDateString();
return view('hardware/quickscan')->with('next_audit_date', $dt)->with('locations_list', Helper::locationsList());
}
public function audit(Request $request, $id)
{
$this->authorize('audit', Asset::class);
$dt = Carbon::now()->addMonths(12)->toDateString();
$asset = Asset::findOrFail($id);
return view('hardware/audit')->with('asset', $asset)->with('next_audit_date', $dt);
return view('hardware/audit')->with('asset', $asset)->with('next_audit_date', $dt)->with('locations_list', Helper::locationsList());
}
public function auditStore(Request $request, $id)
{
$this->authorize('audit', Asset::class);
$rules = array(
'location_id' => 'exists:locations,id|nullable|numeric',
'next_audit_date' => 'date|nullable'
);
$validator = \Validator::make($request->all(), $rules);
if ($validator->fails()) {
return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors()->all()));
}
$asset = Asset::findOrFail($id);
$asset->next_audit_date = $request->input('next_audit_date');
if ($asset->save()) {
$asset->logAudit(request('note'));
$asset->logAudit(request('note'),request('location_id'));
return redirect()->to("hardware")->with('success', trans('admin/hardware/message.audit.success'));
}
}

View File

@@ -283,7 +283,7 @@ class ComponentsController extends Controller
'asset_id' => $asset_id
]);
$component->logCheckout(e(Input::get('note')), $asset_id);
$component->logCheckout(e(Input::get('note')), $asset);
return redirect()->route('components.index')->with('success', trans('admin/components/message.checkout.success'));
}

View File

@@ -250,7 +250,7 @@ class ConsumablesController extends Controller
'assigned_to' => e(Input::get('assigned_to'))
]);
$logaction = $consumable->logCheckout(e(Input::get('note')));
$logaction = $consumable->logCheckout(e(Input::get('note')), $user);
$data['log_id'] = $logaction->id;
$data['eula'] = $consumable->getEula();
$data['first_name'] = $user->first_name;
@@ -273,47 +273,4 @@ class ConsumablesController extends Controller
}
/**
* Returns a JSON response containing details on the users associated with this consumable.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @see ConsumablesController::getView() method that returns the form.
* @since [v1.0]
* @param int $consumableId
* @return array
*/
public function getDataView($consumableId)
{
//$consumable = Consumable::find($consumableID);
$consumable = Consumable::with(array('consumableAssigments'=>
function ($query) {
$query->orderBy('created_at', 'DESC');
},
'consumableAssigments.admin'=> function ($query) {
},
'consumableAssigments.user'=> function ($query) {
},
))->find($consumableId);
// $consumable->load('consumableAssigments.admin','consumableAssigments.user');
if (!Company::isCurrentUserHasAccess($consumable)) {
return ['total' => 0, 'rows' => []];
}
$this->authorize('view', Component::class);
$rows = array();
foreach ($consumable->consumableAssigments as $consumable_assignment) {
$rows[] = [
'name' => $consumable_assignment->user->present()->nameUrl(),
'created_at' => ($consumable_assignment->created_at->format('Y-m-d H:i:s')=='-0001-11-30 00:00:00') ? '' : $consumable_assignment->created_at->format('Y-m-d H:i:s'),
'admin' => ($consumable_assignment->admin) ? $consumable_assignment->admin->present()->nameUrl() : '',
];
}
$consumableCount = $consumable->users->count();
$data = array('total' => $consumableCount, 'rows' => $rows);
return $data;
}
}

View File

@@ -291,22 +291,22 @@ class LicensesController extends Controller
// Ooops.. something went wrong
return redirect()->back()->withInput()->withErrors($validator);
}
$target = null;
if ($assigned_to!='') {
// Check if the user exists
if (is_null($is_assigned_to = User::find($assigned_to))) {
if (is_null($target = User::find($assigned_to))) {
// Redirect to the asset management page with error
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.user_does_not_exist'));
}
}
if ($asset_id!='') {
if (is_null($asset = Asset::find($asset_id))) {
if (is_null($target = Asset::find($asset_id))) {
// Redirect to the asset management page with error
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.asset_does_not_exist'));
}
if (($asset->assigned_to!='') && (($asset->assigned_to!=$assigned_to)) && ($assigned_to!='')) {
if (($target->assigned_to!='') && (($target->assigned_to!=$assigned_to)) && ($target!='')) {
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.owner_doesnt_match_asset'));
}
}
@@ -332,7 +332,7 @@ class LicensesController extends Controller
// Was the asset updated?
if ($licenseSeat->save()) {
$licenseSeat->logCheckout($request->input('note'));
$licenseSeat->logCheckout($request->input('note'), $target);
$data['license_id'] =$licenseSeat->license_id;
$data['note'] = $request->input('note');

View File

@@ -186,7 +186,7 @@ class ReportsController extends Controller
{
// Grab all the assets
$assets = Asset::with('model', 'assignedTo', 'assetstatus', 'defaultLoc', 'assetlog', 'company')
$assets = Asset::with( 'assignedTo', 'assetstatus', 'defaultLoc', 'assetloc', 'assetlog', 'company', 'model.category', 'model.depreciation')
->orderBy('created_at', 'DESC')->get();
return view('reports/depreciation', compact('assets'));
@@ -390,7 +390,7 @@ class ReportsController extends Controller
*/
public function postCustom()
{
$assets = Asset::orderBy('created_at', 'DESC')->with('company', 'assigneduser', 'assetloc', 'defaultLoc', 'assigneduser.userloc', 'model', 'supplier', 'assetstatus', 'model.manufacturer')->get();
$assets = Asset::orderBy('created_at', 'DESC')->with('company', 'assignedTo', 'assetloc', 'defaultLoc', 'model', 'supplier', 'assetstatus', 'model.manufacturer')->get();
$customfields = CustomField::get();
$rows = [ ];
@@ -552,8 +552,8 @@ class ReportsController extends Controller
if (e(Input::get('username')) == '1') {
// Only works if we're checked out to a user, not anything else.
if ($asset->assigneduser) {
$row[] = '"' .e($asset->assigneduser->username). '"';
if ($asset->checkedOutToUser()) {
$row[] = '"' .e($asset->assignedTo->username). '"';
} else {
$row[] = ''; // Empty string if unassigned
}
@@ -561,8 +561,8 @@ class ReportsController extends Controller
if (e(Input::get('employee_num')) == '1') {
// Only works if we're checked out to a user, not anything else.
if ($asset->assigneduser) {
$row[] = '"' .e($asset->assigneduser->employee_num). '"';
if ($asset->checkedOutToUser()) {
$row[] = '"' .e($asset->assignedTo->employee_num). '"';
} else {
$row[] = ''; // Empty string if unassigned
}

View File

@@ -20,6 +20,7 @@ use Auth;
use App\Models\User;
use App\Http\Requests\SetupUserRequest;
use App\Http\Requests\ImageUploadRequest;
use App\Http\Requests\SettingsLdapRequest;
/**
* This controller handles all actions related to Settings for
@@ -562,10 +563,12 @@ class SettingsController extends Controller
$alert_email = rtrim($request->input('alert_email'), ',');
$alert_email = trim($alert_email);
$setting->alert_email = e($alert_email);
$setting->alert_email = $alert_email;
$setting->alerts_enabled = $request->input('alerts_enabled', '0');
$setting->alert_interval = $request->input('alert_interval');
$setting->alert_threshold = $request->input('alert_threshold');
$setting->audit_interval = $request->input('audit_interval');
$setting->audit_warning_days = $request->input('audit_warning_days');
if ($setting->save()) {
return redirect()->route('settings.index')

View File

@@ -1151,21 +1151,7 @@ class UsersController extends Controller
}
return redirect()->route('ldap/user')->with('success', "LDAP Import successful.")->with('summary', $summary);
}
/**
* Return JSON containing a list of assets assigned to a user.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.0]
* @param $userId
* @return string JSON
*/
public function getAssetList($userId)
{
$this->authorize('view', User::class);
$assets = Asset::where('assigned_to', '=', $userId)->with('model')->get();
return response()->json($assets);
}
/**
* Exports users to CSV

View File

@@ -68,8 +68,8 @@ class ViewAssetsController extends Controller
public function getRequestableIndex()
{
$assets = Asset::with('model', 'defaultLoc', 'assetloc', 'assignedTo')->Hardware()->RequestableAssets()->get();
$models = AssetModel::with('category')->RequestableModels()->get();
$assets = Asset::with('model', 'defaultLoc', 'assetloc', 'assignedTo', 'requests')->Hardware()->RequestableAssets()->get();
$models = AssetModel::with('category', 'requests', 'assets')->RequestableModels()->get();
return view('account/requestable-assets', compact('user', 'assets', 'models'));
}

View File

@@ -34,14 +34,14 @@ class SaveUserRequest extends Request
case 'POST':
{
$rules['first_name'] = 'required|string|min:1';
$rules['username'] = 'required|string|min:1';
$rules['username'] = 'required_unless:ldap_import,1|string|min:1';
$rules['password'] = Setting::passwordComplexityRulesSaving('store');
}
// Save all fields
case 'PUT':
$rules['first_name'] = 'required|string|min:1';
$rules['username'] = 'required|string|min:1';
$rules['username'] = 'required_unless:ldap_import,1|string|min:1';
$rules['password'] = Setting::passwordComplexityRulesSaving('update');
// Save only what's passed

View File

@@ -0,0 +1,50 @@
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
use Session;
class SettingsLdapRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
$rules = [
"ldap_server" => 'sometimes|required_if:ldap_enabled,1|url|nullable',
"ldap_uname" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_basedn" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_filter" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_username_field" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_fname_field" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_lname_field" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_auth_filter_query" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_version" => 'sometimes|required_if:ldap_enabled,1|nullable',
];
return $rules;
}
public function response(array $errors)
{
$this->session()->flash('errors', Session::get('errors', new \Illuminate\Support\ViewErrorBag)
->put('default', new \Illuminate\Support\MessageBag($errors)));
\Input::flash();
return parent::response($errors);
}
}

View File

@@ -2,6 +2,7 @@
namespace App\Http\Transformers;
use App\Models\Actionlog;
use App\Models\Setting;
use Gate;
use Illuminate\Database\Eloquent\Collection;
use App\Helpers\Helper;
@@ -12,24 +13,32 @@ class ActionlogsTransformer
public function transformActionlogs (Collection $actionlogs, $total)
{
$array = array();
$settings = Setting::getSettings();
foreach ($actionlogs as $actionlog) {
$array[] = self::transformActionlog($actionlog);
$array[] = self::transformActionlog($actionlog, $settings);
}
return (new DatatablesTransformer)->transformDatatables($array, $total);
}
public function transformActionlog (Actionlog $actionlog)
public function transformActionlog (Actionlog $actionlog, $settings = null)
{
$array = [
'id' => (int) $actionlog->id,
'icon' => $actionlog->present()->icon(),
'image' => (method_exists($actionlog->item, 'getImageUrl')) ? $actionlog->item->getImageUrl() : null,
'item' => ($actionlog->item) ? [
'id' => (int) $actionlog->item->id,
'name' => e($actionlog->item->getDisplayNameAttribute()),
'type' => e($actionlog->itemType()),
] : null,
'location' => ($actionlog->location) ? [
'id' => (int) $actionlog->location->id,
'name' => e($actionlog->location->name)
] : null,
'created_at' => Helper::getFormattedDateObject($actionlog->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($actionlog->updated_at, 'datetime'),
'next_audit_date' => ($actionlog->itemType()=='asset') ? Helper::getFormattedDateObject($actionlog->item->next_audit_date, 'datetime'): null,
'next_audit_date' => ($actionlog->itemType()=='asset') ? Helper::getFormattedDateObject($actionlog->calcNextAuditDate(), 'date'): null,
'days_to_next_audit' => $actionlog->daysUntilNextAudit($settings->audit_interval, $actionlog->item),
'action_type' => $actionlog->present()->actionType(),
'admin' => ($actionlog->user) ? [
'id' => (int) $actionlog->user->id,

View File

@@ -38,6 +38,7 @@ class AssetMaintenancesTransformer
];
$permissions_array['available_actions'] = [
'update' => (bool) Gate::allows('update', Asset::class),
'delete' => (bool) Gate::allows('delete', Asset::class),
];

View File

@@ -62,14 +62,7 @@ class AssetsTransformer
'name'=> e($asset->defaultLoc->name)
] : null,
'image' => ($asset->getImageUrl()) ? $asset->getImageUrl() : null,
'assigned_to' => ($asset->assigneduser) ? [
'id' => (int) $asset->assigneduser->id,
'username' => e($asset->assigneduser->username),
'name' => e($asset->assigneduser->getFullNameAttribute()),
'first_name'=> e($asset->assigneduser->first_name),
'last_name'=> e($asset->assigneduser->last_name),
'employee_number' => e($asset->assigneduser->employee_num),
] : null,
'assigned_to' => $this->transformAssignedTo($asset),
'warranty' => ($asset->warranty_months > 0) ? e($asset->warranty_months . ' ' . trans('admin/hardware/form.months')) : null,
'warranty_expires' => ($asset->warranty_months > 0) ? Helper::getFormattedDateObject($asset->warranty_expires, 'date') : null,
'created_at' => Helper::getFormattedDateObject($asset->created_at, 'datetime'),
@@ -130,4 +123,24 @@ class AssetsTransformer
{
return (new DatatablesTransformer)->transformDatatables($assets);
}
public function transformAssignedTo($asset)
{
if ($asset->checkedOutToUser()) {
return $asset->assignedTo ? [
'id' => (int) $asset->assignedTo->id,
'username' => e($asset->assignedTo->username),
'name' => e($asset->assignedTo->getFullNameAttribute()),
'first_name'=> e($asset->assignedTo->first_name),
'last_name'=> e($asset->assignedTo->last_name),
'employee_number' => e($asset->assignedTo->employee_num),
'type' => 'user'
] : null;
}
return $asset->assignedTo ? [
'id' => $asset->assignedTo->id,
'name' => $asset->assignedTo->display_name,
'type' => $asset->assignedType()
] : null;
}
}

View File

@@ -56,9 +56,10 @@ class UsersTransformer
];
$permissions_array['available_actions'] = [
'update' => Gate::allows('update', User::class) ? true : false,
'delete' => Gate::allows('delete', User::class) ? true : false,
'clone' => Gate::allows('create', User::class) ? true : false,
'update' => (Gate::allows('update', User::class) && ($user->deleted_at=='')) ? true : false,
'delete' => (Gate::allows('delete', User::class) && ($user->deleted_at=='')) ? true : false,
'clone' => (Gate::allows('create', User::class) && ($user->deleted_at=='')) ,
'restore' => (Gate::allows('create', User::class) && ($user->deleted_at!='')) ? true : false,
];
$array += $permissions_array;

View File

@@ -136,14 +136,12 @@ abstract class Importer
* @param $default string
* @return string
*/
public function findCsvMatch(array $array, $key, $default = '')
public function findCsvMatch(array $array, $key, $default = null)
{
$val = $default;
if ($customKey = $this->lookupCustomKey($key)) {
$key = $customKey;
}
$key = $this->lookupCustomKey($key);
$this->log("Custom Key: ${key}");
if (array_key_exists($key, $array)) {
@@ -169,7 +167,8 @@ abstract class Importer
$this->log("Found a match in our custom map: {$key} is " . $this->fieldMap[$key]);
return $this->fieldMap[$key];
}
return null;
// Otherwise no custom key, return original.
return $key;
}
/**

View File

@@ -90,7 +90,6 @@ class ItemImporter extends Importer
$item = collect($this->item);
// First Filter the item down to the model's fillable fields
$item = $item->only($model->getFillable());
// Then iterate through the item and, if we are updating, remove any blank values.
if ($updating) {
$item = $item->reject(function ($value) {

View File

@@ -5,6 +5,7 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Auth;
use Response;
use Carbon;
/**
* Model for the Actionlog (the table that keeps a historical log of
@@ -123,6 +124,10 @@ class Actionlog extends SnipeModel
return $this->belongsTo('\App\Models\ActionLog', 'thread_id');
}
public function location() {
return $this->belongsTo('\App\Models\Location', 'location_id' )->withTrashed();
}
/**
* Check if the file exists, and if it does, force a download
**/
@@ -149,6 +154,33 @@ class Actionlog extends SnipeModel
}
}
public function daysUntilNextAudit($monthInterval = 12, $asset = null) {
$now = Carbon::now();
$last_audit_date = $this->created_at;
$next_audit = $last_audit_date->addMonth($monthInterval);
$next_audit_days = $now->diffInDays($next_audit);
// Override the default setting for interval if the asset has its own next audit date
if (($asset) && ($asset->next_audit_date)) {
$override_default_next = \Carbon::parse($asset->next_audit_date);
$next_audit_days = $override_default_next->diffInDays($now);
}
return $next_audit_days;
}
public function calcNextAuditDate($monthInterval = 12, $asset = null) {
$last_audit_date = Carbon::parse($this->created_at);
// If there is an asset-specific next date already given,
if (($asset) && ($asset->next_audit_date)) {
return \Carbon::parse($asset->next_audit_date);
}
return \Carbon::parse($last_audit_date)->addMonths($monthInterval)->toDateString();
}
/**
* getListingOfActionLogsChronologicalOrder
*

View File

@@ -1,6 +1,7 @@
<?php
namespace App\Models;
use App\Exceptions\CheckoutNotAllowed;
use App\Http\Traits\UniqueUndeletedTrait;
use App\Presenters\Presentable;
use AssetPresenter;
@@ -10,6 +11,7 @@ use Config;
use Illuminate\Database\Eloquent\SoftDeletes;
use Log;
use Watson\Validating\ValidatingTrait;
use Illuminate\Notifications\Notifiable;
/**
* Model for Assets.
@@ -19,7 +21,7 @@ use Watson\Validating\ValidatingTrait;
class Asset extends Depreciable
{
protected $presenter = 'App\Presenters\AssetPresenter';
use Loggable, Requestable, Presentable;
use Loggable, Requestable, Presentable, Notifiable;
use SoftDeletes;
const LOCATION = 'location';
@@ -66,6 +68,7 @@ class Asset extends Depreciable
'asset_tag' => 'required|min:1|max:255|unique_undeleted',
'status' => 'integer',
'purchase_cost' => 'numeric|nullable',
'next_audit_date' => 'date|nullable',
];
/**
@@ -140,7 +143,7 @@ class Asset extends Depreciable
* @return bool
*/
//FIXME: The admin parameter is never used. Can probably be removed.
public function checkOut($target, $admin, $checkout_at = null, $expected_checkin = null, $note = null, $name = null)
public function checkOut($target, $admin = null, $checkout_at = null, $expected_checkin = null, $note = null, $name = null)
{
if (!$target) {
return false;
@@ -160,41 +163,19 @@ class Asset extends Depreciable
}
if ($this->requireAcceptance()) {
if(get_class($target) != User::class) {
throw new CheckoutNotAllowed;
}
$this->accepted="pending";
}
if ($this->save()) {
$this->logCheckout($note, $target);
// if ((($this->requireAcceptance()=='1') || ($this->getEula())) && ($user->email!='')) {
// $this->checkOutNotifyMail($log->id, $user, $checkout_at, $expected_checkin, $note);
// }
return true;
}
return false;
}
public function checkOutNotifyMail($log_id, $user, $checkout_at, $expected_checkin, $note)
{
$data['log_id'] = $log_id;
$data['eula'] = $this->getEula();
$data['first_name'] = $user->first_name;
$data['item_name'] = $this->present()->name();
$data['checkout_date'] = $checkout_at;
$data['expected_checkin'] = $expected_checkin;
$data['item_tag'] = $this->asset_tag;
$data['note'] = $note;
$data['item_serial'] = $this->serial;
$data['require_acceptance'] = $this->requireAcceptance();
if ((($this->requireAcceptance()=='1') || ($this->getEula())) && (!config('app.lock_passwords'))) {
\Mail::send('emails.accept-asset', $data, function ($m) use ($user) {
$m->to($user->email, $user->first_name . ' ' . $user->last_name);
$m->replyTo(config('mail.reply_to.address'), config('mail.reply_to.name'));
$m->subject(trans('mail.Confirm_asset_delivery'));
});
}
}
public function getDetailedNameAttribute()
{
if ($this->assignedTo) {
@@ -246,16 +227,14 @@ class Asset extends Depreciable
->orderBy('created_at', 'desc');
}
/**
* Even though we allow allow for checkout to things beyond users
* this method is an easy way of seeing if we are checked out to a user.
* @return mixed
*/
public function assigneduser()
public function checkedOutToUser()
{
return $this->belongsTo('\App\Models\User', 'assigned_to')
->withTrashed();
return $this->assignedType() === self::USER;
}
public function assignedTo()
@@ -279,14 +258,13 @@ class Asset extends Depreciable
}
if ($this->assignedType() == self::LOCATION) {
return $this->assignedTo();
} elseif (!$this->assignedTo) {
return $this->defaultLoc();
} elseif ($this->assignedType() == self::USER) {
return $this->assignedTo->userLoc();
}
if ($this->assignedType() == self::USER) {
return $this->assignedTo->userLoc();
}
if (!$this->assignedTo) {
return $this->defaultLoc();
}
}
return $this->defaultLoc();
}
@@ -548,7 +526,7 @@ class Asset extends Depreciable
/**
* Query builder scope for pending assets
* Query builder scope for searching location
*
* @param \Illuminate\Database\Query\Builder $query Query builder instance
*
@@ -558,8 +536,17 @@ class Asset extends Depreciable
public function scopeAssetsByLocation($query, $location)
{
return $query->where(function ($query) use ($location) {
$query->whereHas('assigneduser', function ($query) use ($location) {
$query->where('users.location_id', '=', $location->id);
$query->whereHas('assignedTo', function ($query) use ($location) {
$query->where([
['users.location_id', '=', $location->id],
['assets.assigned_type', '=', User::class]
])->orWhere([
['locations.id', '=', $location->id],
['assets.assigned_type', '=', Location::class]
])->orWhere([
['assets.rtd_location_id', '=', $location->id],
['assets.assigned_type', '=', Asset::class]
]);
})->orWhere(function ($query) use ($location) {
$query->where('assets.rtd_location_id', '=', $location->id);
$query->whereNull('assets.assigned_to');
@@ -779,18 +766,26 @@ class Asset extends Depreciable
$query->whereHas('defaultLoc', function ($query) use ($search) {
$query->where('locations.name', 'LIKE', '%'.$search.'%');
});
})->orWhere(function ($query) use ($search) {
$query->whereHas('assigneduser', function ($query) use ($search) {
$query->where(function ($query) use ($search) {
$query->where('users.first_name', 'LIKE', '%'.$search.'%')
->orWhere('users.last_name', 'LIKE', '%'.$search.'%')
->orWhere(function ($query) use ($search) {
$query->whereHas('userloc', function ($query) use ($search) {
$query->where('locations.name', 'LIKE', '%'.$search.'%');
});
});
});
});
//FIXME: This needs attention to work with checkout to not-users.
// })->orWhere(function ($query) use ($search) {
// $query->whereHas('assignedTo', function ($query) use ($search) {
// $query->where(function ($query) use ($search) {
// $query->where('assets.assigned_type', '=', User::class)
// ->join('users', 'users.id', '=', 'assets.assigned_to')
// ->where(function($query) use ($search) {
// $query->where('users.first_name', 'LIKE', '%'.$search.'%')
// ->orWhere('users.last_name', 'LIKE', '%'.$search.'%');
// });
// })->orWhere(function ($query) use ($search) {
// $query->where('assets.assigned_type', '=', Location::class)
// ->join('locations', 'locations.id', '=', 'assets.assigned_to')
// ->where('locations.name', 'LIKE', '%'.$search.'%');
// })->orWhere(function ($query) use ($search) {
// $query->where('assets.assigned_type', '=', Asset::class)
// ->join('assets as assigned_asset', 'assigned_assets.id', '=', 'assets.assigned_to')
// ->where('assigned_assets.name', 'LIKE', '%'.$search.'%');
// });
// });
})->orWhere('assets.name', 'LIKE', '%'.$search.'%')
->orWhere('assets.asset_tag', 'LIKE', '%'.$search.'%')
->orWhere('assets.serial', 'LIKE', '%'.$search.'%')
@@ -1093,13 +1088,15 @@ class Asset extends Depreciable
$query->whereHas('defaultLoc', function ($query) use ($search) {
$query->where('locations.id', '=', $search);
});
})->orWhere(function ($query) use ($search) {
$query->whereHas('assigneduser', function ($query) use ($search) {
$query->whereHas('userloc', function ($query) use ($search) {
$query->where('locations.id', '=', $search);
});
});
});
// FIXME: This needs porting to checkout to non-user.
// ->orWhere(function ($query) use ($search) {
// $query->whereHas('assigneduser', function ($query) use ($search) {
// $query->whereHas('userloc', function ($query) use ($search) {
// $query->where('locations.id', '=', $search);
// });
// });
// });
}

View File

@@ -73,7 +73,7 @@ class Consumable extends SnipeModel
return $this->belongsTo('\App\Models\User', 'user_id');
}
public function consumableAssigments()
public function consumableAssignments()
{
return $this->hasMany('\App\Models\ConsumableAssignment');
}

View File

@@ -110,7 +110,7 @@ class Ldap extends Model
return false;
}
if (!$user = array_change_key_case(ldap_get_attributes($connection, $entry), CASE_LOWER)) {
if (!$user = ldap_get_attributes($connection, $entry)) {
return false;
}

View File

@@ -30,11 +30,56 @@ trait Loggable
* @since [v3.4]
* @return \App\Models\Actionlog
*/
public function logCheckout($note, $target = null /*target is overridable for components*/)
public function logCheckout($note, $target /* What are we checking out to? */)
{
$log = new Actionlog;
$log = $this->determineLogItemType($log);
$log->user_id = Auth::user()->id;
// We need to special case licenses because of license_seat vs license. So much for clean polymorphism :)
if (!isset($target)) {
throw new Exception('All checkout logs require a target');
return;
}
$log->target_type = get_class($target);
$log->target_id = $target->id;
$class = get_class($target);
if ($class == Location::class) {
// We can checkout to a location
$log->location_id = $target->id;
} else if ($class== Asset::class) {
$log->location_id = $target->rtd_location_id;
} else {
$log->location_id = $target->location_id;
}
$log->note = $note;
$log->logaction('checkout');
$params = [
'item' => $this,
'target' => $target,
'admin' => $log->user,
'note' => $note,
'log_id' => $log->id
];
if ($settings = Setting::getSettings()) {
$settings->notify(new CheckoutNotification($params));
}
if (method_exists($target, 'notify')) {
$target->notify(new CheckoutNotification($params));
}
return $log;
}
/**
* Helper method to determine the log item type
*/
private function determineLogItemType($log)
{
// We need to special case licenses because of license_seat vs license. So much for clean polymorphism :
if (static::class == LicenseSeat::class) {
$log->item_type = License::class;
$log->item_id = $this->license_id;
@@ -43,52 +88,8 @@ trait Loggable
$log->item_id = $this->id;
}
$log->user_id = Auth::user()->id;
// @FIXME This needs to be generalized with new asset checkout.
if(isset($target)) {
$log->target_type = get_class($target);
$log->target_id = $target->id;
} else {
if (!is_null($this->asset_id)) {
$log->target_type = Asset::class;
$log->target_id = $this->asset_id;
} elseif (!is_null($this->assigned_to)) {
$log->target_type = User::class;
$log->target_id = $this->assigned_to;
}
}
$item = call_user_func(array($log->target_type, 'find'), $log->target_id);
if($this->assignedTo) {
$item = $this->assignedTo;
}
$class = get_class($item);
if($class == Location::class) {
// We can checkout to a location
$log->location_id = $item->id;
} else if ($class== Asset::class) {
$log->location_id = $item->rtd_location_id;
} else {
$log->location_id = $item->location_id;
}
$log->note = $note;
$log->logaction('checkout');
$params = [
'item' => $log->item,
'target' => $log->target,
'admin' => $log->user,
'note' => $note
];
if ($settings = Setting::getSettings()) {
$settings->notify(new CheckoutNotification($params));
}
return $log;
}
/**
* @author Daniel Meltzer <parallelgrapefruit@gmail.com
* @since [v3.4]
@@ -127,9 +128,10 @@ trait Loggable
* @since [v4.0]
* @return \App\Models\Actionlog
*/
public function logAudit($note)
public function logAudit($note, $location_id)
{
$log = new Actionlog;
$location = Location::find($location_id);
if (static::class == LicenseSeat::class) {
$log->item_type = License::class;
$log->item_id = $this->license_id;
@@ -137,7 +139,7 @@ trait Loggable
$log->item_type = static::class;
$log->item_id = $this->id;
}
$log->location_id = null;
$log->location_id = ($location_id) ? $location_id : null;
$log->note = $note;
$log->user_id = Auth::user()->id;
$log->logaction('audit');
@@ -145,6 +147,7 @@ trait Loggable
$params = [
'item' => $log->item,
'admin' => $log->user,
'location' => ($location) ? $location->name : '',
'note' => $note
];
Setting::getSettings()->notify(new AuditNotification($params));
@@ -153,6 +156,7 @@ trait Loggable
}
/**
* @author Daniel Meltzer <parallelgrapefruit@gmail.com
* @since [v3.5]

View File

@@ -19,9 +19,9 @@ trait Requestable
public function isRequestedBy(User $user)
{
return $this->requests()
->where('user_id', $user->id)
->exists();
$requests = $this->requests->where('user_id', $user->id);
return $requests->count() > 0;
}
public function scopeRequestedBy($query, User $user)

View File

@@ -34,17 +34,10 @@ class Setting extends Model
'labels_fontsize' => 'numeric|min:5',
'labels_pagewidth' => 'numeric|nullable',
'labels_pageheight' => 'numeric|nullable',
"ldap_server" => 'sometimes|required_if:ldap_enabled,1|url|nullable',
"ldap_uname" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_basedn" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_filter" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_username_field" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_fname_field" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_lname_field" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_auth_filter_query" => 'sometimes|required_if:ldap_enabled,1|nullable',
"ldap_version" => 'sometimes|required_if:ldap_enabled,1|nullable',
"thumbnail_max_h" => 'numeric|max:500|min:25',
"pwd_secure_min" => "numeric|required|min:5",
"audit_warning_days" => "numeric|nullable",
"audit_interval" => "numeric|nullable",
];
protected $fillable = ['site_name','email_domain','email_format','username_format'];

View File

@@ -56,8 +56,9 @@ class AuditNotification extends Notification
'By' => '<'.$admin_user->present()->viewUrl().'|'.$admin_user->present()->fullName().'>'
];
array_key_exists('note', $this->params) && $fields['Notes'] = $this->params['note'];
array_key_exists('location', $this->params) && $fields['Location'] = $this->params['location'];
$attachment->title($item->name, $item->present()->viewUrl())
$attachment->title($item->present()->name, $item->present()->viewUrl())
->fields($fields);
});
}
@@ -69,10 +70,7 @@ class AuditNotification extends Notification
*/
public function toMail($notifiable)
{
return (new MailMessage)
->line('The introduction to the notification.')
->action('Notification Action', 'https://laravel.com')
->line('Thank you for using our application!');
}
/**

View File

@@ -5,10 +5,11 @@ namespace App\Notifications;
use App\Models\Setting;
use App\Models\SnipeModel;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Messages\SlackMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Messages\SlackMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Support\Facades\Mail;
class CheckoutNotification extends Notification
{
@@ -43,11 +44,12 @@ class CheckoutNotification extends Notification
}
$item = $this->params['item'];
if ((method_exists($item, 'requireAcceptance') && ($item->requireAcceptance()=='1'))
|| (method_exists($item, 'getEula') && ($item->getEula()))
) {
$notifyBy[] = 'mail';
}
$notifyBy[]='mail';
// if ((method_exists($item, 'requireAcceptance') && ($item->requireAcceptance()=='1'))
// || (method_exists($item, 'getEula') && ($item->getEula()))
// ) {
// $notifyBy[] = 'mail';
// }
return $notifyBy;
}
@@ -79,10 +81,30 @@ class CheckoutNotification extends Notification
*/
public function toMail($notifiable)
{
//TODO: Expand for non assets.
$item = $this->params['item'];
$admin_user = $this->params['admin'];
$target = $this->params['target'];
$data = [
'eula' => method_exists($item, 'getEula') ? $item->getEula() : '',
'first_name' => $target->present()->fullName(),
'item_name' => $item->present()->name(),
'checkout_date' => $item->last_checkout,
'expected_checkin' => $item->expected_checkin,
'item_tag' => $item->asset_tag,
'note' => $this->params['note'],
'item_serial' => $item->serial,
'require_acceptance' => $item->requireAcceptance(),
'log_id' => $this->params['log_id'],
];
return (new MailMessage)
->line('The introduction to the notification.')
->action('Notification Action', 'https://laravel.com')
->line('Thank you for using our application!');
->view('emails.accept-asset', $data)
->subject(trans('mail.Confirm_asset_delivery'));
// \Mail::send('emails.accept-asset', $data, function ($m) use ($target) {
// $m->to($target->email, $target->first_name . ' ' . $target->last_name);
// $m->replyTo(config('mail.reply_to.address'), config('mail.reply_to.name'));
// $m->subject(trans('mail.Confirm_asset_delivery'));
// });
}
/**

View File

@@ -0,0 +1,86 @@
<?php
namespace App\Notifications;
use App\Models\Setting;
use App\Models\SnipeModel;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Support\Facades\Mail;
use Carbon\Carbon;
class ExpectedCheckinNotification extends Notification
{
use Queueable;
/**
* @var
*/
private $params;
/**
* Create a new notification instance.
*
* @param $params
*/
public function __construct($params)
{
$this->params = $params;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
$notifyBy = [];
$item = $this->params['item'];
$notifyBy[]='mail';
return $notifyBy;
}
public function toSlack($notifiable)
{
}
/**
* Get the mail representation of the notification.
*
* @param mixed $asset
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($params)
{
$formatted_due = Carbon::parse($this->params->expected_checkin)->format('D, M j, Y');
return (new MailMessage)
->error()
->subject('Reminder: '.$this->params->present()->name().' checkin deadline approaching')
->line('Hi, '.$this->params->assignedto->first_name)
->greeting('An asset checked out to you is due to be checked back in on '.$formatted_due.'.')
->line('Asset: '.$this->params->present()->name())
->line('Serial: '.$this->params->serial)
->line('Asset Tag: '.$this->params->asset_tag)
->action('View Your Assets', route('view-assets'));
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
//
];
}
}

View File

@@ -98,7 +98,7 @@ class AssetPresenter extends Presenter
"sortable" => true,
"title" => trans('admin/hardware/form.checkedout_to'),
"visible" => true,
"formatter" => "usersLinkObjFormatter"
"formatter" => "polymorphicItemFormatter"
], [
"field" => "employee_number",
"searchable" => false,

View File

@@ -65,6 +65,11 @@ abstract class Presenter
return '';
}
public function name()
{
return $this->model->name;
}
public function __get($property)
{
if (method_exists($this, $property)) {

View File

@@ -1,7 +1,7 @@
<?php
return array (
'app_version' => 'v4.0',
'build_version' => 'beta3',
'hash_version' => '22',
'full_hash' => 'v4.0-beta3-22-gbd02b9e',
'app_version' => 'v4',
'build_version' => 'beta5',
'hash_version' => '7',
'full_hash' => 'v4-beta5-7-gae8c9d6',
);

View File

@@ -20,7 +20,7 @@ $factory->defineAs(Actionlog::class, 'asset-checkout', function (Faker\Generator
$user = factory(App\Models\User::class)->create(['company_id' => $company->id]);
$target = factory(App\Models\User::class)->create(['company_id' => $company->id]);
// $item = factory(App\Models\Asset::class)->create(['company_id' => $company->id]);
// dd($item);
return [
'user_id' => $user->id,
'action_type' => 'checkout',

View File

@@ -1,6 +1,8 @@
<?php
use App\Models\Asset;
use App\Models\AssetModel;
use App\Models\Category;
/*
|--------------------------------------------------------------------------
@@ -69,6 +71,13 @@ $factory->state(Asset::class, 'assigned-to-asset', function ($faker) {
];
});
$factory->state(Asset::class, 'requires-acceptance', function ($faker) {
$cat = factory(Category::class)->states('asset-category', 'requires-acceptance')->create();
$model = factory(AssetModel::class)->create(['category_id' => $cat->id]);
return [
'model_id' => $model->id
];
});
$factory->define(App\Models\AssetModel::class, function (Faker\Generator $faker) {
return [

View File

@@ -15,7 +15,7 @@ $factory->define(App\Models\Category::class, function (Faker\Generator $faker) {
'name' => $faker->text(20),
'category_type' => $faker->randomElement(['asset', 'accessory', 'component', 'consumable']),
'eula_text' => $faker->paragraph(),
'require_acceptance' => $faker->boolean(),
'require_acceptance' => false,
'use_default_eula' => $faker->boolean(),
'checkin_email' => $faker->boolean()
];
@@ -44,3 +44,9 @@ $factory->state(App\Models\Category::class, 'consumable-category', function ($fa
'category_type' => 'consumable',
];
});
$factory->state(App\Models\Category::class, 'requires-acceptance', function ($faker) {
return [
'require_acceptance' => true,
];
});

View File

@@ -0,0 +1,34 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddAuditingToSettings extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('settings', function (Blueprint $table) {
$table->integer('audit_interval')->nullable()->default(NULL);
$table->integer('audit_warning_days')->nullable()->default(NULL);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('settings', function (Blueprint $table) {
$table->dropColumn('audit_interval');
$table->dropColumn('audit_warning_days');
});
}
}

View File

@@ -1,80 +0,0 @@
var elixir = require('laravel-elixir');
require('laravel-elixir-codeception-standalone');
require('laravel-elixir-phpcs');
require('laravel-elixir-vue-2');
var bowerPath = './bower_components';
/*
|--------------------------------------------------------------------------
| Elixir Asset Management
|--------------------------------------------------------------------------
|
| Elixir provides a clean, fluent API for defining some basic Gulp tasks
| for your Laravel application. By default, we are compiling the Sass
| file for our application, as well as publishing vendor resources.
|
*/
elixir(function(mix) {
mix.less(
[
'app.less',
bowerPath + '/iCheck/skins/minimal/*',
'AdminLTE.less',
'skins/skin-blue.less',
'overrides.less'
], 'public/assets/css/')
.copy(bowerPath + '/bootstrap-less/assets/fonts/bootstrap/**', 'public/assets/fonts')
.copy(bowerPath + '/font-awesome/fonts/*', 'public/build/fonts');
mix.webpack(
// jQuery is loaded from vue.js webpack process
'./resources/assets/js/vue.js',
'./resources/assets/js/vue-dist.js'
);
mix.scripts([
bowerPath + '/tether/dist/js/tether.js',
'vue-dist.js',
bowerPath + '/jquery-ui/jquery-ui.js',
bowerPath + '/jquery-slimscroll/jquery.slimscroll.js',
bowerPath + '/jquery.iframe-transport/jquery.iframe-transport.js',
bowerPath + '/blueimp-file-upload/js/jquery.fileupload.js',
bowerPath + '/fastclick/lib/fastclick.js',
bowerPath + '/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js',
bowerPath + '/bootstrap-datepicker/dist/js/bootstrap-datepicker.js',
bowerPath + '/iCheck/icheck.js',
bowerPath + '/select2/dist/js/select2.full.js',
bowerPath + '/ekko-lightbox/dist/ekko-lightbox.js',
'snipeit.js',
'app.js'
],'public/assets/js');
mix.version(['assets/css/app.css','assets/js/all.js']);
// mix.codeception(null, { flags: '--report' });
// mix.phpcs([
// 'app/**/*.php',
// 'tests/unit/*.php',
// 'tests/functional/*.php',
// 'tests/acceptance/*.php'
// ], {
// bin: 'vendor/bin/phpcs',
// standard: 'PSR2'
// });
});

28
public/js/dist/all.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,127 @@
/*
*
* Snipe-IT Universal Modal support
*
* Enables modal dialogs to create sub-resources throughout Snipe-IT
*
*/
/*
HOW TO USE
Create a Button looking like this:
<a href='{{ route('modal.user') }}' data-toggle="modal" data-target="#createModal" data-dependency="user" data-select='assigned_to' class="btn btn-sm btn-default">New</a>
If you don't have access to Blade commands (like {{ and }}, etc), you can hard-code a URL as the 'href'
data-toggle="modal" - required for Bootstrap Modals
data-target="#createModal" - fixed ID for the modal, do not change
data-dependency="user" - which Snipe-IT model you're going to be creating.
data-select="assigned_to" - What is the *ID* of the select-dropdown that you're going to be adding to, if the modal-create was a
success? Be on the lookout for duplicate ID's, it will confuse this library!
class="btn btn-sm btn-default" - makes it look button-ey, feel free to change :)
*/
$(function () {
console.warn("Loading up Modal functionality.");
//handle modal-add-interstitial calls
var model, select;
if($('#createModal').length == 0) {
$('body').append('<div class="modal fade" id="createModal"></div><!-- /.modal -->');
}
$('#createModal').on("show.bs.modal", function (event) {
var link = $(event.relatedTarget);
model = link.data("dependency");
select = link.data("select");
// console.warn("Uh, href is: "+link.attr('href'));
// console.dir(link);
$('#createModal').load(link.attr('href'),function () {
//do we need to re-select2 this, after load? Probably.
$('#createModal').find('select.select2').select2();
});
});
$('#createModal').on('click','#modal-save', function () {
console.warn("MODAL SAVE CALLED FOR MODAL!");
var data = {};
console.warn("We are about to SAVE!!! for model: "+model+" and select ID: "+select);
$('.modal-body input:visible').each(function (index, elem) {
console.warn("["+index+"]: "+elem.id+" = "+$(elem).val());
var bits = elem.id.split("-");
if (bits[0] === "modal") {
data[bits[1]] = $(elem).val();
}
});
//this can probably get replaced with a normal 'serialize' instead
$('.modal-body select:visible').each(function (index, elem) {
var bits = elem.id.split("-");
data[bits[1]] = $(elem).val();
});
data._token = Laravel.csrfToken;
console.log(data);
$.ajax({
type: 'POST',
url: "/api/v1/" + model + "s",
headers: {
"X-Requested-With": 'XMLHttpRequest',
"X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
},
data: data,
success: function (result) {
// {"status":"error","messages":{"name":["The name field is required."]}}
if(result.status == "error") {
var error_message="";
for(var field in result.messages) {
error_message+="Problem(s) with field '"+field+"': "+result.messages[field].join(", ");
}
//window.alert("Error adding "+model+": "+error_message);
$('#modal_error_msg').html(error_message).show();
return false;
}
var id = result.payload.id;
var name = result.payload.name || (result.payload.first_name + " " + result.payload.last_name);
if(!id || !name) {
console.error("Could not find resulting name or ID from modal-create. Name: "+name+", id: "+id);
return false;
}
$('#createModal').modal('hide');
$('#createModal').html("");
// "select" is the original drop-down menu that someone
// clicked 'add' on to add a new 'thing'
// this code adds the newly created object to that select
var selector = document.getElementById(select);
if(!selector) {
console.error("Could not find original <select> element with an id of: "+select);
return false;
}
//console.log(document.getElementById(select));
console.dir(selector);
selector.options[selector.length] = new Option(name, id);
selector.selectedIndex = selector.length - 1;
$(selector).trigger("change");
if(fetchCustomFields) {
fetchCustomFields();
}
},
error: function (result) {
// console.log('Error: ' + result.responseJSON.error.message );
msg = result.responseJSON.messages || result.responseJSON.error;
$('#modal_error_msg').html("Server Error: "+msg).show();
//window.alert("Unable to add new " + model + " - error: " + msg);
}
});
});
});

View File

@@ -12,8 +12,8 @@
'success' => 'Asset Maintenance created successfully.'
],
'edit' => [
'error' => 'Asset Maintenance was not created, please try again.',
'success' => 'Asset Maintenance created successfully.'
'error' => 'Asset Maintenance was not edited, please try again.',
'success' => 'Asset Maintenance edited successfully.'
],
'asset_maintenance_incomplete' => 'Not Completed Yet',
'warranty' => 'Warranty',

View File

@@ -7,7 +7,7 @@ return array(
'asset' => 'Asset',
'bulk_checkout' => 'Checkout Assets to User',
'checkin' => 'Checkin Asset',
'checkout' => 'Checkout Asset to User',
'checkout' => 'Checkout Asset',
'clone' => 'Clone Asset',
'deployable' => 'Deployable',
'deleted' => 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',

View File

@@ -24,6 +24,12 @@ return array(
'success' => 'Asset restored successfully.'
),
'audit' => array(
'error' => 'Asset audit was unsuccessful. Please try again.',
'success' => 'Asset audit successfully logged.'
),
'deletefile' => array(
'error' => 'File not deleted. Please try again.',
'success' => 'File successfully deleted.',

View File

@@ -10,6 +10,10 @@ return array(
'alert_interval' => 'Expiring Alerts Threshold (in days)',
'alert_inv_threshold' => 'Inventory Alert Threshold',
'asset_ids' => 'Asset IDs',
'audit_interval' => 'Audit Interval',
'audit_interval_help' => 'If you are required to regularly physically audit your assets, enter the interval in months.',
'audit_warning_days' => 'Audit Warning Threshold',
'audit_warning_days_help' => 'How many days in advance should we warn you when assets are due for auditing?',
'auto_increment_assets' => 'Generate auto-incrementing asset IDs',
'auto_increment_prefix' => 'Prefix (optional)',
'auto_incrementing_help' => 'Enable auto-incrementing asset IDs first to set this',

View File

@@ -13,6 +13,7 @@ return array(
'filetype_info' => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
'history_user' => 'History for :name',
'info' => 'Info',
'restore_user' => 'Click here to restore them.',
'last_login' => 'Last Login',
'ldap_config_text' => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
'software_user' => 'Software Checked out to :name',

View File

@@ -18,11 +18,15 @@
'asset_report' => 'Asset Report',
'asset_tag' => 'Asset Tag',
'assets_available' => 'assets available',
'audit' => 'Audit',
'audit_report' => 'Audit Log',
'assets' => 'Assets',
'avatar_delete' => 'Delete Avatar',
'avatar_upload' => 'Upload Avatar',
'back' => 'Back',
'bad_data' => 'Nothing found. Maybe bad data?',
'bulkaudit' => 'Bulk Audit',
'bulkaudit_status' => 'Audit Status',
'bulk_checkout' => 'Bulk Checkout',
'cancel' => 'Cancel',
'categories' => 'Categories',
@@ -52,6 +56,8 @@
'current' => 'Current',
'custom_report' => 'Custom Asset Report',
'dashboard' => 'Dashboard',
'days' => 'days',
'days_to_next_audit' => 'Days to Next Audit',
'date' => 'Date',
'debug_warning' => 'Warning!',
'debug_warning_text' => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
@@ -117,6 +123,8 @@
'moreinfo' => 'More Info',
'name' => 'Name',
'next' => 'Next',
'next_audit_date' => 'Next Audit Date',
'last_audit' => 'Last Audit',
'new' => 'new!',
'no_depreciation' => 'No Depreciation',
'no_results' => 'No Results.',

View File

@@ -13,62 +13,91 @@ return array(
|
*/
"accepted" => "The :attribute must be accepted.",
"active_url" => "The :attribute is not a valid URL.",
"after" => "The :attribute must be a date after :date.",
"alpha" => "The :attribute may only contain letters.",
"alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.",
"alpha_num" => "The :attribute may only contain letters and numbers.",
"before" => "The :attribute must be a date before :date.",
"between" => array(
"numeric" => "The :attribute must be between :min - :max.",
"file" => "The :attribute must be between :min - :max kilobytes.",
"string" => "The :attribute must be between :min - :max characters.",
),
"boolean" => "The :attribute must be true or false.",
"confirmed" => "The :attribute confirmation does not match.",
"date" => "The :attribute is not a valid date.",
"date_format" => "The :attribute does not match the format :format.",
"different" => "The :attribute and :other must be different.",
"digits" => "The :attribute must be :digits digits.",
"digits_between" => "The :attribute must be between :min and :max digits.",
"email" => "The :attribute format is invalid.",
"exists" => "The selected :attribute is invalid.",
"email_array" => "One or more email addresses is invalid.",
"hashed_pass" => "Your current password is incorrect",
'dumbpwd' => 'That password is too common.',
"image" => "The :attribute must be an image.",
"in" => "The selected :attribute is invalid.",
"integer" => "The :attribute must be an integer.",
"ip" => "The :attribute must be a valid IP address.",
"max" => array(
"numeric" => "The :attribute may not be greater than :max.",
"file" => "The :attribute may not be greater than :max kilobytes.",
"string" => "The :attribute may not be greater than :max characters.",
),
"mimes" => "The :attribute must be a file of type: :values.",
"min" => array(
"numeric" => "The :attribute must be at least :min.",
"file" => "The :attribute must be at least :min kilobytes.",
"string" => "The :attribute must be at least :min characters.",
),
"not_in" => "The selected :attribute is invalid.",
"numeric" => "The :attribute must be a number.",
"regex" => "The :attribute format is invalid.",
"required" => "The :attribute field is required.",
"required_if" => "The :attribute field is required when :other is :value.",
"required_with" => "The :attribute field is required when :values is present.",
"required_without" => "The :attribute field is required when :values is not present.",
"same" => "The :attribute and :other must match.",
"size" => array(
"numeric" => "The :attribute must be :size.",
"file" => "The :attribute must be :size kilobytes.",
"string" => "The :attribute must be :size characters.",
),
"unique" => "The :attribute has already been taken.",
"url" => "The :attribute format is invalid.",
"statuslabel_type" => "You must select a valid status label type",
"unique_undeleted" => "The :attribute must be unique.",
'accepted' => 'The :attribute must be accepted.',
'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.',
'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
'alpha' => 'The :attribute may only contain letters.',
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
'alpha_num' => 'The :attribute may only contain letters and numbers.',
'array' => 'The :attribute must be an array.',
'before' => 'The :attribute must be a date before :date.',
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
'between' => [
'numeric' => 'The :attribute must be between :min and :max.',
'file' => 'The :attribute must be between :min and :max kilobytes.',
'string' => 'The :attribute must be between :min and :max characters.',
'array' => 'The :attribute must have between :min and :max items.',
],
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute confirmation does not match.',
'date' => 'The :attribute is not a valid date.',
'date_format' => 'The :attribute does not match the format :format.',
'different' => 'The :attribute and :other must be different.',
'digits' => 'The :attribute must be :digits digits.',
'digits_between' => 'The :attribute must be between :min and :max digits.',
'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'email' => 'The :attribute must be a valid email address.',
'exists' => 'The selected :attribute is invalid.',
'file' => 'The :attribute must be a file.',
'filled' => 'The :attribute field must have a value.',
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field does not exist in :other.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
'ipv4' => 'The :attribute must be a valid IPv4 address.',
'ipv6' => 'The :attribute must be a valid IPv6 address.',
'json' => 'The :attribute must be a valid JSON string.',
'max' => [
'numeric' => 'The :attribute may not be greater than :max.',
'file' => 'The :attribute may not be greater than :max kilobytes.',
'string' => 'The :attribute may not be greater than :max characters.',
'array' => 'The :attribute may not have more than :max items.',
],
'mimes' => 'The :attribute must be a file of type: :values.',
'mimetypes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => 'The :attribute must be at least :min.',
'file' => 'The :attribute must be at least :min kilobytes.',
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
],
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'present' => 'The :attribute field must be present.',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute and :other must match.',
'size' => [
'numeric' => 'The :attribute must be :size.',
'file' => 'The :attribute must be :size kilobytes.',
'string' => 'The :attribute must be :size characters.',
'array' => 'The :attribute must contain :size items.',
],
'string' => 'The :attribute must be a string.',
'timezone' => 'The :attribute must be a valid zone.',
'unique' => 'The :attribute has already been taken.',
'uploaded' => 'The :attribute failed to upload.',
'url' => 'The :attribute format is invalid.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
/*
@@ -82,8 +111,14 @@ return array(
|
*/
'custom' => array(),
'alpha_space' => "The :attribute field contains a character that is not allowed.",
'custom' => [
'alpha_space' => "The :attribute field contains a character that is not allowed.",
"email_array" => "One or more email addresses is invalid.",
"hashed_pass" => "Your current password is incorrect",
'dumbpwd' => 'That password is too common.',
"statuslabel_type" => "You must select a valid status label type",
"unique_undeleted" => "The :attribute must be unique.",
],
/*
|--------------------------------------------------------------------------
@@ -96,6 +131,6 @@ return array(
|
*/
'attributes' => array(),
'attributes' => [],
);

View File

@@ -12,8 +12,8 @@
'success' => 'تم إنشاء سند صيانة الأصل بنجاح.'
],
'edit' => [
'error' => 'Asset Maintenance was not created, please try again.',
'success' => 'Asset Maintenance created successfully.'
'error' => 'Asset Maintenance was not edited, please try again.',
'success' => 'Asset Maintenance edited successfully.'
],
'asset_maintenance_incomplete' => 'لم يكتمل بعد',
'warranty' => 'الضمان',

View File

@@ -28,7 +28,7 @@ return array(
'fieldset' => array(
'does_not_exist' => 'Fieldset does not exist',
'does_not_exist' => 'مجموعة الحقول غير موجودة',
'create' => array(
'error' => 'لم يتم إنشاء مجموعة-الحقول، الرجاء المحاولة مرة اخرى.',

View File

@@ -2,20 +2,20 @@
return array(
'does_not_exist' => 'Department does not exist.',
'assoc_users' => 'This department is currently associated with at least one user and cannot be deleted. Please update your users to no longer reference this department and try again. ',
'does_not_exist' => 'القسم الاداري غير موجود.',
'assoc_users' => 'هذا القسم الإداري مرتبط حاليا مع مستخدم واحد على الأقل ولا يمكن حذفه. الرجاء تحديث تفاصيل المستخدمين حيث لا تحتوي هذا القسم وحاول مرة أخرى. ',
'create' => array(
'error' => 'Department was not created, please try again.',
'success' => 'Department created successfully.'
'error' => 'لم يتم إنشاء القسم الإداري، الرجاء المحاولة مرة أخرى.',
'success' => 'تم انشاء القسم الاداري بنجاح.'
),
'update' => array(
'error' => 'Department was not updated, please try again',
'success' => 'Department updated successfully.'
'error' => 'لم يتم تحديث القسم الإداري، الرجاء المحاولة مرة أخرى',
'success' => 'تم تحديث القسم الاداري بنجاح.'
),
'delete' => array(
'confirm' => 'Are you sure you wish to delete this department?',
'error' => 'There was an issue deleting the department. Please try again.',
'success' => 'The department was deleted successfully.'
'confirm' => 'هل أنت متأكد من رغبتك في حذف هذا القسم؟',
'error' => 'حدثت مشكلة اثناء عملية حذف القسم الاداري. الرجاء المحاولة مرة اُخرى.',
'success' => 'تم حذف القسم الاداري بنجاح.'
)
);

View File

@@ -2,10 +2,10 @@
return array(
'id' => 'ID',
'name' => 'Department Name',
'manager' => 'Manager',
'location' => 'Location',
'create' => 'Create Department',
'update' => 'Update Department',
'id' => 'رقم التعريف',
'name' => 'اسم القسم الإداري',
'manager' => 'المدير',
'location' => 'الموقع',
'create' => 'إنشاء قسم اداري',
'update' => 'تحديث قسم اداري',
);

View File

@@ -2,9 +2,9 @@
return array(
'bulk_delete' => 'تاكيد إجراء حذف متعدد للاُصول',
'bulk_delete_help' => 'Review the assets for bulk deletion below. Once deleted, these assets can be restored, but they will no longer be associated with any users they are currently assigned to.',
'bulk_delete_warn' => 'You are about to delete :asset_count assets.',
'bulk_update' => 'Bulk Update Assets',
'bulk_delete_help' => 'الرجاء مراجعة الأصول المعينة للحذف بالجملة أدناه. بمجرد الحذف، يمكن استعادة هذه الأصول، لكنها لن تكون مقترنة مع أي من المستخدمين اللذين تم تعيين الاصول لهم من قبل.',
'bulk_delete_warn' => 'أنت على وشك حذف اصول asset_count: .',
'bulk_update' => 'تحديث الاصول بالجملة',
'bulk_update_help' => 'This form allows you to update multiple assets at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged. ',
'bulk_update_warn' => 'You are about to edit the properties of :asset_count assets.',
'checkedout_to' => 'Checked Out To',

View File

@@ -7,7 +7,7 @@ return array(
'asset' => 'أصل',
'bulk_checkout' => 'Checkout Assets to User',
'checkin' => 'Checkin Asset',
'checkout' => 'Checkout Asset to User',
'checkout' => 'Checkout Asset',
'clone' => 'استنساخ الأصل',
'deployable' => 'قابل للنشر',
'deleted' => 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',

View File

@@ -24,6 +24,12 @@ return array(
'success' => 'Asset restored successfully.'
),
'audit' => array(
'error' => 'Asset audit was unsuccessful. Please try again.',
'success' => 'Asset audit successfully logged.'
),
'deletefile' => array(
'error' => 'لم يتم حذف الملف. الرجاء المحاولة مرة اخرى.',
'success' => 'تم حذف الملف بنجاح.',

View File

@@ -10,6 +10,10 @@ return array(
'alert_interval' => 'Expiring Alerts Threshold (in days)',
'alert_inv_threshold' => 'Inventory Alert Threshold',
'asset_ids' => 'Asset IDs',
'audit_interval' => 'Audit Interval',
'audit_interval_help' => 'If you are required to regularly physically audit your assets, enter the interval in months.',
'audit_warning_days' => 'Audit Warning Threshold',
'audit_warning_days_help' => 'How many days in advance should we warn you when assets are due for auditing?',
'auto_increment_assets' => 'Generate auto-incrementing asset IDs',
'auto_increment_prefix' => 'البادئة (اختياري)',
'auto_incrementing_help' => 'Enable auto-incrementing asset IDs first to set this',

View File

@@ -13,6 +13,7 @@ return array(
'filetype_info' => 'انواع صيغ الملفات المسوح بها هي png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
'history_user' => 'الأرشيف الخاص بـ :name',
'info' => 'Info',
'restore_user' => 'Click here to restore them.',
'last_login' => 'آخر دخول للمستخدم',
'ldap_config_text' => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
'software_user' => 'البرامج المسجلة لـ :name',

View File

@@ -18,11 +18,15 @@
'asset_report' => 'Asset Report',
'asset_tag' => 'وسم الأصول',
'assets_available' => 'الأصول المتاحة',
'audit' => 'Audit',
'audit_report' => 'Audit Log',
'assets' => 'الأصول',
'avatar_delete' => 'حذف الصورة الرمزية',
'avatar_upload' => 'رفع صورة رمزية',
'back' => 'الرجوع للخلف',
'bad_data' => 'Nothing found. Maybe bad data?',
'bulkaudit' => 'Bulk Audit',
'bulkaudit_status' => 'Audit Status',
'bulk_checkout' => 'Bulk Checkout',
'cancel' => 'إلغاء',
'categories' => 'التصنيفات',
@@ -52,6 +56,8 @@
'current' => 'الحالي',
'custom_report' => 'Custom Asset Report',
'dashboard' => 'Dashboard',
'days' => 'days',
'days_to_next_audit' => 'Days to Next Audit',
'date' => 'التاريخ',
'debug_warning' => 'Warning!',
'debug_warning_text' => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
@@ -117,6 +123,8 @@
'moreinfo' => 'المزيد من المعلومات',
'name' => 'الإسم',
'next' => 'Next',
'next_audit_date' => 'Next Audit Date',
'last_audit' => 'Last Audit',
'new' => 'new!',
'no_depreciation' => 'لا يوجد إستهلاك',
'no_results' => 'لا يوجد نتائج.',

View File

@@ -13,62 +13,91 @@ return array(
|
*/
"accepted" => ":attribute يجب ان يكون مقبولا.",
"active_url" => ":attribute موقع غير صحيح.",
"after" => ":attribute يجب ان يكون تاريخ قبل :date.",
"alpha" => "The :attribute may only contain letters.",
"alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.",
"alpha_num" => "The :attribute may only contain letters and numbers.",
"before" => ":attribute يجب ان يكون تاريخ قبل :date.",
"between" => array(
"numeric" => ":attribute يجب ان يكون بين :min - :max.",
"file" => "The :attribute must be between :min - :max kilobytes.",
"string" => "The :attribute must be between :min - :max characters.",
),
"boolean" => "The :attribute must be true or false.",
"confirmed" => "The :attribute confirmation does not match.",
"date" => ":attribute تاريخ غير صحيح.",
"date_format" => "The :attribute does not match the format :format.",
"different" => "The :attribute and :other must be different.",
"digits" => "The :attribute must be :digits digits.",
"digits_between" => "The :attribute must be between :min and :max digits.",
"email" => "The :attribute format is invalid.",
"exists" => "The selected :attribute is invalid.",
"email_array" => "One or more email addresses is invalid.",
"hashed_pass" => "Your current password is incorrect",
'dumbpwd' => 'That password is too common.',
"image" => "The :attribute must be an image.",
"in" => "The selected :attribute is invalid.",
"integer" => "The :attribute must be an integer.",
"ip" => "The :attribute must be a valid IP address.",
"max" => array(
"numeric" => "The :attribute may not be greater than :max.",
"file" => "The :attribute may not be greater than :max kilobytes.",
"string" => "The :attribute may not be greater than :max characters.",
),
"mimes" => "The :attribute must be a file of type: :values.",
"min" => array(
"numeric" => "The :attribute must be at least :min.",
"file" => "The :attribute must be at least :min kilobytes.",
"string" => "The :attribute must be at least :min characters.",
),
"not_in" => "The selected :attribute is invalid.",
"numeric" => "The :attribute must be a number.",
"regex" => "The :attribute format is invalid.",
"required" => "The :attribute field is required.",
"required_if" => "The :attribute field is required when :other is :value.",
"required_with" => "The :attribute field is required when :values is present.",
"required_without" => "The :attribute field is required when :values is not present.",
"same" => "The :attribute and :other must match.",
"size" => array(
"numeric" => "The :attribute must be :size.",
"file" => "The :attribute must be :size kilobytes.",
"string" => "The :attribute must be :size characters.",
),
"unique" => "The :attribute has already been taken.",
"url" => "The :attribute format is invalid.",
"statuslabel_type" => "You must select a valid status label type",
"unique_undeleted" => "The :attribute must be unique.",
'accepted' => ':attribute يجب ان يكون مقبولا.',
'active_url' => ':attribute موقع غير صحيح.',
'after' => ':attribute يجب ان يكون تاريخ قبل :date.',
'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
'alpha' => 'The :attribute may only contain letters.',
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
'alpha_num' => 'The :attribute may only contain letters and numbers.',
'array' => 'The :attribute must be an array.',
'before' => ':attribute يجب ان يكون تاريخ قبل :date.',
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
'between' => [
'numeric' => ':attribute يجب ان يكون بين :min - :max.',
'file' => 'The :attribute must be between :min and :max kilobytes.',
'string' => 'The :attribute must be between :min and :max characters.',
'array' => 'The :attribute must have between :min and :max items.',
],
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute confirmation does not match.',
'date' => ':attribute تاريخ غير صحيح.',
'date_format' => 'The :attribute does not match the format :format.',
'different' => 'The :attribute and :other must be different.',
'digits' => 'The :attribute must be :digits digits.',
'digits_between' => 'The :attribute must be between :min and :max digits.',
'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'email' => 'The :attribute must be a valid email address.',
'exists' => 'The selected :attribute is invalid.',
'file' => 'The :attribute must be a file.',
'filled' => 'The :attribute field must have a value.',
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field does not exist in :other.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
'ipv4' => 'The :attribute must be a valid IPv4 address.',
'ipv6' => 'The :attribute must be a valid IPv6 address.',
'json' => 'The :attribute must be a valid JSON string.',
'max' => [
'numeric' => 'The :attribute may not be greater than :max.',
'file' => 'The :attribute may not be greater than :max kilobytes.',
'string' => 'The :attribute may not be greater than :max characters.',
'array' => 'The :attribute may not have more than :max items.',
],
'mimes' => 'The :attribute must be a file of type: :values.',
'mimetypes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => 'The :attribute must be at least :min.',
'file' => 'The :attribute must be at least :min kilobytes.',
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
],
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'present' => 'The :attribute field must be present.',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute and :other must match.',
'size' => [
'numeric' => 'The :attribute must be :size.',
'file' => 'The :attribute must be :size kilobytes.',
'string' => 'The :attribute must be :size characters.',
'array' => 'The :attribute must contain :size items.',
],
'string' => 'The :attribute must be a string.',
'timezone' => 'The :attribute must be a valid zone.',
'unique' => 'The :attribute has already been taken.',
'uploaded' => 'The :attribute failed to upload.',
'url' => 'The :attribute format is invalid.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
/*
@@ -82,8 +111,14 @@ return array(
|
*/
'custom' => array(),
'alpha_space' => "The :attribute field contains a character that is not allowed.",
'custom' => [
'alpha_space' => "The :attribute field contains a character that is not allowed.",
"email_array" => "One or more email addresses is invalid.",
"hashed_pass" => "Your current password is incorrect",
'dumbpwd' => 'That password is too common.',
"statuslabel_type" => "You must select a valid status label type",
"unique_undeleted" => "The :attribute must be unique.",
],
/*
|--------------------------------------------------------------------------
@@ -96,6 +131,6 @@ return array(
|
*/
'attributes' => array(),
'attributes' => [],
);

View File

@@ -12,8 +12,8 @@
'success' => 'Поддръжката на актив създадена успешно.'
],
'edit' => [
'error' => 'Asset Maintenance was not created, please try again.',
'success' => 'Asset Maintenance created successfully.'
'error' => 'Asset Maintenance was not edited, please try again.',
'success' => 'Asset Maintenance edited successfully.'
],
'asset_maintenance_incomplete' => 'Все още неприключила',
'warranty' => 'Гаранция',

View File

@@ -2,10 +2,10 @@
return array(
'id' => 'ID',
'id' => 'ИД№',
'name' => 'Department Name',
'manager' => 'Manager',
'location' => 'Location',
'manager' => 'Ръководител',
'location' => 'Местоположение',
'create' => 'Create Department',
'update' => 'Update Department',
);

View File

@@ -7,7 +7,7 @@ return array(
'asset' => 'Актив',
'bulk_checkout' => 'Отписване на активи към потребител',
'checkin' => 'Връщане на актив',
'checkout' => 'Изписване на актив към потребител',
'checkout' => 'Checkout Asset',
'clone' => 'Копиране на актив',
'deployable' => 'Може да бъде предоставен',
'deleted' => 'Активът беше изтрит. <a href="/hardware/:asset_id/restore">Възстановяване</a>.',

View File

@@ -23,6 +23,12 @@ return array(
'success' => 'Активът възстановен успешно.'
),
'audit' => array(
'error' => 'Asset audit was unsuccessful. Please try again.',
'success' => 'Asset audit successfully logged.'
),
'deletefile' => array(
'error' => 'Файлът не беше изтрит. Моля опитайте отново.',
'success' => 'Файлът изтрит успешно.',

View File

@@ -29,8 +29,8 @@ return array(
),
'bulkedit' => array(
'error' => 'No fields were changed, so nothing was updated.',
'success' => 'Models updated.'
'error' => 'Няма полета, който да са се променили, така че нищо не е осъвременено.',
'success' => 'Моделите са осъвременени.'
),
);

View File

@@ -10,6 +10,10 @@ return array(
'alert_interval' => 'Изтичаш праг на известия (в дни)',
'alert_inv_threshold' => 'Праг на известия за запаси',
'asset_ids' => 'ID на активи',
'audit_interval' => 'Audit Interval',
'audit_interval_help' => 'If you are required to regularly physically audit your assets, enter the interval in months.',
'audit_warning_days' => 'Audit Warning Threshold',
'audit_warning_days_help' => 'How many days in advance should we warn you when assets are due for auditing?',
'auto_increment_assets' => 'Автоматично генериране на инвентарни номера на активите',
'auto_increment_prefix' => 'Префикс (незадължително)',
'auto_incrementing_help' => 'Първо включете автоматично генериране на инвентарни номера, за да включите тази опция.',

View File

@@ -13,6 +13,7 @@ return array(
'filetype_info' => 'Позволените типове файлове са png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, и rar.',
'history_user' => 'История за :name',
'info' => 'Информация',
'restore_user' => 'Click here to restore them.',
'last_login' => 'Последен достъп до системата',
'ldap_config_text' => 'LDAP конфигурационните настройки могат да бъдат намерени в Admin > Settings. Избраното (по изобр) местоположение ще бъде настроено за всички въведени потребители.',
'software_user' => 'Софтуерни продукти, изписани на :name',

View File

@@ -19,7 +19,7 @@ return array(
'location' => 'Местоположение',
'lock_passwords' => 'Настройките за вход не могат да бъдат променяни в текущата инсталация.',
'manager' => 'Ръководител',
'managed_locations' => 'Managed Locations',
'managed_locations' => 'Управлявани места',
'name' => 'Име',
'notes' => 'Бележки',
'password_confirm' => 'Потвърждение на паролата',

View File

@@ -18,11 +18,15 @@
'asset_report' => 'Справка за активите',
'asset_tag' => 'Инвентарен номер',
'assets_available' => 'налични активи',
'audit' => 'Audit',
'audit_report' => 'Audit Log',
'assets' => 'Активи',
'avatar_delete' => 'Изтриване на аватар',
'avatar_upload' => 'Качване на аватар',
'back' => 'Назад',
'bad_data' => 'Няма резултати.',
'bulkaudit' => 'Bulk Audit',
'bulkaudit_status' => 'Audit Status',
'bulk_checkout' => 'Общо отписване',
'cancel' => 'Отказ',
'categories' => 'Категории',
@@ -52,6 +56,8 @@
'current' => 'Текущи',
'custom_report' => 'Потребителски справки за активи',
'dashboard' => 'Табло',
'days' => 'days',
'days_to_next_audit' => 'Days to Next Audit',
'date' => 'Дата',
'debug_warning' => 'Предупреждение!',
'debug_warning_text' => 'Това приложение се изпълнява в режим на производство с разрешено отстраняване на грешки. Това може да изложи чувствителни данни, ако приложението ви е достъпно за външния свят. Забранете режим отстраняване на грешки чрез задаване на стойността <code>APP_DEBUF</code> <code>.env</code> във файла <code>false</code>.',
@@ -117,6 +123,8 @@
'moreinfo' => 'Повече информация',
'name' => 'Име',
'next' => 'Следващ',
'next_audit_date' => 'Next Audit Date',
'last_audit' => 'Last Audit',
'new' => 'new!',
'no_depreciation' => 'Без амортизация',
'no_results' => 'Няма резултат.',
@@ -152,7 +160,7 @@
'select_model' => 'Избор на модел',
'select_supplier' => 'Избор на доставчик',
'select_user' => 'Избор на потребител',
'select_date' => 'Select Date (YYYY-MM-DD)',
'select_date' => 'Изберете дата (ГГГГ-ММ-ДД)',
'select_statuslabel' => 'Избор на статус',
'select_company' => 'Изберете компания',
'select_asset' => 'Изберете актив',

View File

@@ -13,62 +13,91 @@ return array(
|
*/
"accepted" => ":attribute трябва да бъде потвърден.",
"active_url" => ":attribute не е валиден URL адрес.",
"after" => ":attribute трябва да бъде дата след :date.",
"alpha" => ":attribute може да съдържа единствено букви.",
"alpha_dash" => ":attribute може да съдържа единствено букви, числа и тире.",
"alpha_num" => ":attribute може да съдържа единствено букви и числа.",
"before" => ":attribute трябва да бъде дата преди :date.",
"between" => array(
"numeric" => ":attribute трябва да бъде между :min и :max.",
"file" => ":attribute трябва да бъде с големина между :min и :max KB.",
"string" => ":attribute трябва да бъде с дължина между :min и :max символа.",
),
"boolean" => ":attribute трябва да е верен или грешен.",
"confirmed" => ":attribute потвърждение не съвпада.",
"date" => ":attribute не е валидна дата.",
"date_format" => ":attribute не съвпада с формата :format.",
"different" => ":attribute и :other трябва да се различават.",
"digits" => ":attribute трябва да бъде с дължина :digits цифри.",
"digits_between" => ":attribute трябва да бъде с дължина между :min и :max цифри.",
"email" => ":attribute е с невалиден формат.",
"exists" => "Избраният :attribute е невалиден.",
"email_array" => "Един или повече email адреси е невалиден.",
"hashed_pass" => "Your current password is incorrect",
'dumbpwd' => 'That password is too common.',
"image" => ":attribute трябва да бъде изображение.",
"in" => "Избраният :attribute е невалиден.",
"integer" => ":attribute трябва да бъде целочислен.",
"ip" => ":attribute трябва да бъде валиден IP адрес.",
"max" => array(
"numeric" => ":attribute не може да бъде по-дълъг от :max.",
"file" => ":attribute не може да бъде по-голям от :max KB.",
"string" => ":attribute не може да бъде по-дълъг от :max символа.",
),
"mimes" => ":attribute трябва да бъде файл с един от следните типове: :values.",
"min" => array(
"numeric" => ":attribute трябва да бъде минимум :min.",
"file" => ":attribute трябва да бъде с големина минимум :min KB.",
"string" => ":attribute трябва да бъде минимум :min символа.",
),
"not_in" => "Избраният :attribute е невалиден.",
"numeric" => ":attribute трябва да бъде число.",
"regex" => "Форматът на :attribute е невалиден.",
"required" => "Полето :attribute е задължително.",
"required_if" => "Полето :attribute е задължително, когато :other е :value.",
"required_with" => ":attribute е задължителен, когато са избрани :values.",
"required_without" => ":attribute е задължителен, когато не са избрани :values.",
"same" => ":attribute и :other трябва да съвпадат.",
"size" => array(
"numeric" => ":attribute трябва да бъде с дължина :size.",
"file" => ":attribute трябва да бъде с големина :size KB.",
"string" => ":attribute трябва да бъде с дължина :size символа.",
),
"unique" => ":attribute вече е вписан.",
"url" => "Форматът на :attribute е невалиден.",
"statuslabel_type" => "Трябва да изберете валиден тип етикет за статус",
"unique_undeleted" => ":attribute трябва да е единствен по рода си.",
'accepted' => ':attribute трябва да бъде потвърден.',
'active_url' => ':attribute не е валиден URL адрес.',
'after' => ':attribute трябва да бъде дата след :date.',
'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
'alpha' => ':attribute може да съдържа единствено букви.',
'alpha_dash' => ':attribute може да съдържа единствено букви, числа и тире.',
'alpha_num' => ':attribute може да съдържа единствено букви и числа.',
'array' => 'The :attribute must be an array.',
'before' => ':attribute трябва да бъде дата преди :date.',
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
'between' => [
'numeric' => ':attribute трябва да бъде между :min и :max.',
'file' => ':attribute трябва да бъде с големина между :min и :max KB.',
'string' => ':attribute трябва да бъде с дължина между :min и :max символа.',
'array' => 'The :attribute must have between :min and :max items.',
],
'boolean' => ':attribute трябва да е верен или грешен.',
'confirmed' => ':attribute потвърждение не съвпада.',
'date' => ':attribute не е валидна дата.',
'date_format' => ':attribute не съвпада с формата :format.',
'different' => ':attribute и :other трябва да се различават.',
'digits' => ':attribute трябва да бъде с дължина :digits цифри.',
'digits_between' => ':attribute трябва да бъде с дължина между :min и :max цифри.',
'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'email' => ':attribute е с невалиден формат.',
'exists' => 'Избраният :attribute е невалиден.',
'file' => 'The :attribute must be a file.',
'filled' => 'The :attribute field must have a value.',
'image' => ':attribute трябва да бъде изображение.',
'in' => 'Избраният :attribute е невалиден.',
'in_array' => 'The :attribute field does not exist in :other.',
'integer' => ':attribute трябва да бъде целочислен.',
'ip' => ':attribute трябва да бъде валиден IP адрес.',
'ipv4' => 'The :attribute must be a valid IPv4 address.',
'ipv6' => 'The :attribute must be a valid IPv6 address.',
'json' => 'The :attribute must be a valid JSON string.',
'max' => [
'numeric' => ':attribute не може да бъде по-дълъг от :max.',
'file' => ':attribute не може да бъде по-голям от :max KB.',
'string' => ':attribute не може да бъде по-дълъг от :max символа.',
'array' => 'The :attribute may not have more than :max items.',
],
'mimes' => ':attribute трябва да бъде файл с един от следните типове: :values.',
'mimetypes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => ':attribute трябва да бъде минимум :min.',
'file' => ':attribute трябва да бъде с големина минимум :min KB.',
'string' => ':attribute трябва да бъде минимум :min символа.',
'array' => 'The :attribute must have at least :min items.',
],
'not_in' => 'Избраният :attribute е невалиден.',
'numeric' => ':attribute трябва да бъде число.',
'present' => 'The :attribute field must be present.',
'regex' => 'Форматът на :attribute е невалиден.',
'required' => 'Полето :attribute е задължително.',
'required_if' => 'Полето :attribute е задължително, когато :other е :value.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => ':attribute е задължителен, когато са избрани :values.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => ':attribute е задължителен, когато не са избрани :values.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => ':attribute и :other трябва да съвпадат.',
'size' => [
'numeric' => ':attribute трябва да бъде с дължина :size.',
'file' => ':attribute трябва да бъде с големина :size KB.',
'string' => ':attribute трябва да бъде с дължина :size символа.',
'array' => 'The :attribute must contain :size items.',
],
'string' => 'The :attribute must be a string.',
'timezone' => 'The :attribute must be a valid zone.',
'unique' => ':attribute вече е вписан.',
'uploaded' => 'The :attribute failed to upload.',
'url' => 'Форматът на :attribute е невалиден.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
/*
@@ -82,8 +111,14 @@ return array(
|
*/
'custom' => array(),
'alpha_space' => ":attribute съдържа символи, които са забранени.",
'custom' => [
'alpha_space' => "The :attribute field contains a character that is not allowed.",
"email_array" => "One or more email addresses is invalid.",
"hashed_pass" => "Your current password is incorrect",
'dumbpwd' => 'That password is too common.',
"statuslabel_type" => "You must select a valid status label type",
"unique_undeleted" => "The :attribute must be unique.",
],
/*
|--------------------------------------------------------------------------
@@ -96,6 +131,6 @@ return array(
|
*/
'attributes' => array(),
'attributes' => [],
);

View File

@@ -12,8 +12,8 @@
'success' => 'Údržba zařízení byla v pořádku vytvořena.'
],
'edit' => [
'error' => 'Asset Maintenance was not created, please try again.',
'success' => 'Asset Maintenance created successfully.'
'error' => 'Asset Maintenance was not edited, please try again.',
'success' => 'Asset Maintenance edited successfully.'
],
'asset_maintenance_incomplete' => 'Prozatím nedokončeno',
'warranty' => 'Záruka',

View File

@@ -7,7 +7,7 @@ return array(
'asset' => 'Majetek',
'bulk_checkout' => 'Předat majetek uživateli',
'checkin' => 'Převzít majetek',
'checkout' => 'Předat majetek uživateli',
'checkout' => 'Checkout Asset',
'clone' => 'Klonovat majetek',
'deployable' => 'Připraveno k nasazení',
'deleted' => 'Toto zařízení bylo odstraněno. <a href="/hardware/:asset_id/restore">Klepněte zde pro jeho obnovení</a>.',

View File

@@ -24,6 +24,12 @@ return array(
'success' => 'Majetek byl v pořádku obnoven.'
),
'audit' => array(
'error' => 'Asset audit was unsuccessful. Please try again.',
'success' => 'Asset audit successfully logged.'
),
'deletefile' => array(
'error' => 'Soubor se nesmazal, prosím zkuste to znovu.',
'success' => 'Soubor byl úspěšně smazán.',

View File

@@ -10,6 +10,10 @@ return array(
'alert_interval' => 'Mez upozornění na vypršení (ve dnech)',
'alert_inv_threshold' => 'Mez upozornění skladu',
'asset_ids' => 'ID majetku',
'audit_interval' => 'Audit Interval',
'audit_interval_help' => 'If you are required to regularly physically audit your assets, enter the interval in months.',
'audit_warning_days' => 'Audit Warning Threshold',
'audit_warning_days_help' => 'How many days in advance should we warn you when assets are due for auditing?',
'auto_increment_assets' => 'Vygenerovat zvyšující se ID majetku',
'auto_increment_prefix' => 'Předpona (volitnelná)',
'auto_incrementing_help' => 'Nastavte nejdříve automaticky se zvyšující ID majetku pro nastavení tohoto',

View File

@@ -13,6 +13,7 @@ return array(
'filetype_info' => 'Povolené přílohy: png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
'history_user' => 'Historie:',
'info' => 'Informace',
'restore_user' => 'Click here to restore them.',
'last_login' => 'Poslední přihlášení',
'ldap_config_text' => 'Nastavení konfigurace LDAP lze nalézt v menu Správce> Nastavení. Vybrané (volitelně) místo bude nastaven pro všechny importované uživatele.',
'software_user' => 'Software vydaný pro :name',

View File

@@ -18,11 +18,15 @@
'asset_report' => 'Report majetku',
'asset_tag' => 'Označení majetku',
'assets_available' => 'dostupných zařízení',
'audit' => 'Audit',
'audit_report' => 'Audit Log',
'assets' => 'Zařízení',
'avatar_delete' => 'Smazat avatara',
'avatar_upload' => 'Nahrát avatara',
'back' => 'Zpět',
'bad_data' => 'Nic nebylo nalezeno. Možná zadáváte špatná data?',
'bulkaudit' => 'Bulk Audit',
'bulkaudit_status' => 'Audit Status',
'bulk_checkout' => 'Hromadný výdej',
'cancel' => 'Storno',
'categories' => 'Kategorie',
@@ -52,6 +56,8 @@
'current' => 'Aktuální',
'custom_report' => 'Vlastní report majetku',
'dashboard' => 'Nástěnka',
'days' => 'days',
'days_to_next_audit' => 'Days to Next Audit',
'date' => 'Datum',
'debug_warning' => 'Varování!',
'debug_warning_text' => 'Tato aplikace běží ve výrobním režimu s povoleným laděním. To znamená že citlivá data mohou být přístupná vnějšímu světu. Deaktivujte režim ladění nastavením hodnoty <code>APP_DEBUG</code> v souboru <code>.env</code> na <code>false</code>.',
@@ -117,6 +123,8 @@
'moreinfo' => 'Další informace',
'name' => 'Název',
'next' => 'Další',
'next_audit_date' => 'Next Audit Date',
'last_audit' => 'Last Audit',
'new' => 'nový!',
'no_depreciation' => 'Žádná amortizace',
'no_results' => 'Žádné výsledky.',

View File

@@ -13,62 +13,91 @@ return array(
|
*/
"accepted" => "Je potřeba potvrdit :attribute.",
"active_url" => ":attribute není platnou URL.",
"after" => ":attribute nemůže být dříve než :date.",
"alpha" => ":attribute může obsahovat pouze písmena.",
"alpha_dash" => ":attribute může obsahovat pouze písmena, čísla, a pomlčky.",
"alpha_num" => ":attribute může obsahovat pouze písmena čísla.",
"before" => ":attribute nemůže být později než :date.",
"between" => array(
"numeric" => ":attribute musí být mezi :min - :max.",
"file" => ":attribute musí být mezi :min - :max kilobajtů.",
"string" => ":attribute smí obsahovat pouze :min - :max znaků.",
),
"boolean" => ":attribute musí být true nebo false.",
"confirmed" => "Potvrzení :attribute se neshoduje.",
"date" => ":attribute není platným datem.",
"date_format" => "Atribut :attribute nesouhlasí s formátem :format.",
"different" => ":attribute a :other se musí lišit.",
"digits" => ":attribute musí být :digits číslo.",
"digits_between" => ":attribute musí být mezi hodnotami :min a :max.",
"email" => "Formát :attribute je neplatný.",
"exists" => "Zvolený :attribute je neplatný.",
"email_array" => "Jedna nebo více e-mailových adres je neplatná.",
"hashed_pass" => "Your current password is incorrect",
'dumbpwd' => 'That password is too common.',
"image" => ":attribute musí být obrázek.",
"in" => "Zvolený :attribute je neplatný.",
"integer" => ":attribute musí být celočíselný.",
"ip" => ":attribute musí být platná IP adresa.",
"max" => array(
"numeric" => ":attribute nesmí být větší než :max.",
"file" => ":attribute nesmí být větší než :max kilobajtů.",
"string" => ":attribute nesmí být větší než :max znaků.",
),
"mimes" => ":attribute musí být soubor typu: :values.",
"min" => array(
"numeric" => ":attribute musí být minimálne :min.",
"file" => ":attribute musí být minimálně :min kilobajtů.",
"string" => ":attribute musí mít minimálně :min znaků.",
),
"not_in" => "Zvolený :attribute je neplatný.",
"numeric" => ":attribute musí být číslo.",
"regex" => "Formát :attribute je neplatný.",
"required" => "Pole :attribute je požadováno.",
"required_if" => "Položka :attribute je vyžadována, když :other je :value.",
"required_with" => "Hodnota :attribute je vyžadována, když je přítomno :values.",
"required_without" => "Hodnota :attribute je vyžadována, když není přítomno :values.",
"same" => ":attribute a :other se musí shodovat.",
"size" => array(
"numeric" => ":attribute musí být :size.",
"file" => ":attribute musí být :size kilobajtů.",
"string" => ":attribute musí mít :size znaků.",
),
"unique" => ":attribute byl již vybrán.",
"url" => "Formát :attribute je neplatný.",
"statuslabel_type" => "Musíte vybrat platný status typu štítku",
"unique_undeleted" => ":attribute musí být jedinečný.",
'accepted' => 'Je potřeba potvrdit :attribute.',
'active_url' => ':attribute není platnou URL.',
'after' => ':attribute nemůže být dříve než :date.',
'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
'alpha' => ':attribute může obsahovat pouze písmena.',
'alpha_dash' => ':attribute může obsahovat pouze písmena, čísla, a pomlčky.',
'alpha_num' => ':attribute může obsahovat pouze písmena čísla.',
'array' => 'The :attribute must be an array.',
'before' => ':attribute nemůže být později než :date.',
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
'between' => [
'numeric' => ':attribute musí být mezi :min - :max.',
'file' => ':attribute musí být mezi :min - :max kilobajtů.',
'string' => ':attribute smí obsahovat pouze :min - :max znaků.',
'array' => 'The :attribute must have between :min and :max items.',
],
'boolean' => ':attribute musí být true nebo false.',
'confirmed' => 'Potvrzení :attribute se neshoduje.',
'date' => ':attribute není platným datem.',
'date_format' => 'Atribut :attribute nesouhlasí s formátem :format.',
'different' => ':attribute a :other se musí lišit.',
'digits' => ':attribute musí být :digits číslo.',
'digits_between' => ':attribute musí být mezi hodnotami :min a :max.',
'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'email' => 'Formát :attribute je neplatný.',
'exists' => 'Zvolený :attribute je neplatný.',
'file' => 'The :attribute must be a file.',
'filled' => 'The :attribute field must have a value.',
'image' => ':attribute musí být obrázek.',
'in' => 'Zvolený :attribute je neplatný.',
'in_array' => 'The :attribute field does not exist in :other.',
'integer' => ':attribute musí být celočíselný.',
'ip' => ':attribute musí být platná IP adresa.',
'ipv4' => 'The :attribute must be a valid IPv4 address.',
'ipv6' => 'The :attribute must be a valid IPv6 address.',
'json' => 'The :attribute must be a valid JSON string.',
'max' => [
'numeric' => ':attribute nesmí být větší než :max.',
'file' => ':attribute nesmí být větší než :max kilobajtů.',
'string' => ':attribute nesmí být větší než :max znaků.',
'array' => 'The :attribute may not have more than :max items.',
],
'mimes' => ':attribute musí být soubor typu: :values.',
'mimetypes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => ':attribute musí být minimálne :min.',
'file' => ':attribute musí být minimálně :min kilobajtů.',
'string' => ':attribute musí mít minimálně :min znaků.',
'array' => 'The :attribute must have at least :min items.',
],
'not_in' => 'Zvolený :attribute je neplatný.',
'numeric' => ':attribute musí být číslo.',
'present' => 'The :attribute field must be present.',
'regex' => 'Formát :attribute je neplatný.',
'required' => 'Pole :attribute je požadováno.',
'required_if' => 'Položka :attribute je vyžadována, když :other je :value.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'Hodnota :attribute je vyžadována, když je přítomno :values.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => 'Hodnota :attribute je vyžadována, když není přítomno :values.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => ':attribute a :other se musí shodovat.',
'size' => [
'numeric' => ':attribute musí být :size.',
'file' => ':attribute musí být :size kilobajtů.',
'string' => ':attribute musí mít :size znaků.',
'array' => 'The :attribute must contain :size items.',
],
'string' => 'The :attribute must be a string.',
'timezone' => 'The :attribute must be a valid zone.',
'unique' => ':attribute byl již vybrán.',
'uploaded' => 'The :attribute failed to upload.',
'url' => 'Formát :attribute je neplatný.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
/*
@@ -82,8 +111,14 @@ return array(
|
*/
'custom' => array(),
'alpha_space' => "Pole :attribute obsahuje nepovolené znaky.",
'custom' => [
'alpha_space' => "The :attribute field contains a character that is not allowed.",
"email_array" => "One or more email addresses is invalid.",
"hashed_pass" => "Your current password is incorrect",
'dumbpwd' => 'That password is too common.',
"statuslabel_type" => "You must select a valid status label type",
"unique_undeleted" => "The :attribute must be unique.",
],
/*
|--------------------------------------------------------------------------
@@ -96,6 +131,6 @@ return array(
|
*/
'attributes' => array(),
'attributes' => [],
);

View File

@@ -12,8 +12,8 @@
'success' => 'Aktivets vedligeholdelse blev oprettet med succes.'
],
'edit' => [
'error' => 'Asset Maintenance was not created, please try again.',
'success' => 'Asset Maintenance created successfully.'
'error' => 'Asset Maintenance was not edited, please try again.',
'success' => 'Asset Maintenance edited successfully.'
],
'asset_maintenance_incomplete' => 'Ikke afsluttet endnu',
'warranty' => 'Garanti',

View File

@@ -7,7 +7,7 @@ return array(
'asset' => 'Asset',
'bulk_checkout' => 'Checkout Assets to User',
'checkin' => 'Checkin Asset',
'checkout' => 'Checkout Asset to User',
'checkout' => 'Checkout Asset',
'clone' => 'Clone Asset',
'deployable' => 'Deployable',
'deleted' => 'This asset has been deleted. <a href="/hardware/:asset_id/restore">Click here to restore it</a>.',

View File

@@ -24,6 +24,12 @@ return array(
'success' => 'Asset restored successfully.'
),
'audit' => array(
'error' => 'Asset audit was unsuccessful. Please try again.',
'success' => 'Asset audit successfully logged.'
),
'deletefile' => array(
'error' => 'File not deleted. Please try again.',
'success' => 'File successfully deleted.',

View File

@@ -10,6 +10,10 @@ return array(
'alert_interval' => 'Expiring Alerts Threshold (in days)',
'alert_inv_threshold' => 'Inventory Alert Threshold',
'asset_ids' => 'Asset IDs',
'audit_interval' => 'Audit Interval',
'audit_interval_help' => 'If you are required to regularly physically audit your assets, enter the interval in months.',
'audit_warning_days' => 'Audit Warning Threshold',
'audit_warning_days_help' => 'How many days in advance should we warn you when assets are due for auditing?',
'auto_increment_assets' => 'Generate auto-incrementing asset IDs',
'auto_increment_prefix' => 'Prefix (optional)',
'auto_incrementing_help' => 'Enable auto-incrementing asset IDs first to set this',

View File

@@ -13,6 +13,7 @@ return array(
'filetype_info' => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, and rar.',
'history_user' => 'History for :name',
'info' => 'Info',
'restore_user' => 'Click here to restore them.',
'last_login' => 'Last Login',
'ldap_config_text' => 'LDAP configuration settings can be found Admin > Settings. The (optional) selected location will be set for all imported users.',
'software_user' => 'Software Checked out to :name',

View File

@@ -18,11 +18,15 @@
'asset_report' => 'Aktiv Rapport',
'asset_tag' => 'Aktiv Mærkat',
'assets_available' => 'aktiver tilgængelige',
'audit' => 'Audit',
'audit_report' => 'Audit Log',
'assets' => 'Aktiver',
'avatar_delete' => 'Slet avatar',
'avatar_upload' => 'Upload Avatar',
'back' => 'Tilbage',
'bad_data' => 'Intet fundet. Måske dårlig data?',
'bulkaudit' => 'Bulk Audit',
'bulkaudit_status' => 'Audit Status',
'bulk_checkout' => 'Masseudtjekning',
'cancel' => 'Annuller',
'categories' => 'Kategorier',
@@ -52,6 +56,8 @@
'current' => 'Aktuelle',
'custom_report' => 'Tilpasset Aktiv Rapport',
'dashboard' => 'Oversigtspanel',
'days' => 'days',
'days_to_next_audit' => 'Days to Next Audit',
'date' => 'Dato',
'debug_warning' => 'Warning!',
'debug_warning_text' => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the <code>APP_DEBUG</code> value in your <code>.env</code> file to <code>false</code>.',
@@ -117,6 +123,8 @@
'moreinfo' => 'Mere Info',
'name' => 'Navn',
'next' => 'Næste',
'next_audit_date' => 'Next Audit Date',
'last_audit' => 'Last Audit',
'new' => 'ny!',
'no_depreciation' => 'Ingen Afskrivning',
'no_results' => 'Ingen Resultater.',

View File

@@ -13,62 +13,91 @@ return array(
|
*/
"accepted" => ":attribute skal være accepteret.",
"active_url" => ":attribute er ikke en gyldig URL.",
"after" => ":attribute skal være en dato efter :date.",
"alpha" => ":attribute må kun indeholde bogstaver.",
"alpha_dash" => ":attribute må kun indeholde bogstaver, tal eller bindestreger.",
"alpha_num" => ":attribute må kun indeholde bogstaver eller tal.",
"before" => ":attribute skal være en dato før :date.",
"between" => array(
"numeric" => ":attribute skal være imellem :min - :max.",
"file" => ":attribute skal være imellem :min - :max kilobytes.",
"string" => ":attribute skal være imellem :min - :max tegn.",
),
"boolean" => "The :attribute must be true or false.",
"confirmed" => "The :attribute confirmation does not match.",
"date" => ":attribute er ikke en gyldig dato.",
"date_format" => ":attribute svarer ikke til formatet :format.",
"different" => ":attribute og :other skal være forskellige.",
"digits" => ":attribute skal være :digits cifre.",
"digits_between" => ":attribute skal være imellem :min og :max cifre.",
"email" => ":attribute formatet er ugylidgt.",
"exists" => "Den valgte :attribute er ugyldig.",
"email_array" => "En eller flere email-adresser er ugyldige.",
"hashed_pass" => "Your current password is incorrect",
'dumbpwd' => 'That password is too common.',
"image" => ":attribute skal være et billede.",
"in" => "Det valgte :attribute er ugyldigt.",
"integer" => ":attribute skal være et heltal.",
"ip" => ":attribute skal være en gyldig IP adresse.",
"max" => array(
"numeric" => ":attribute må ikke overstige :max.",
"file" => ":attribute må ikke overstige :max. kilobytes.",
"string" => ":attribute må ikke overstige :max. tegn.",
),
"mimes" => ":attribute skal være en fil af typen: :values.",
"min" => array(
"numeric" => ":attribute skal mindst være :min.",
"file" => ":attribute skal mindst være :min kilobytes.",
"string" => ":attribute skal mindst være :min tegn.",
),
"not_in" => "Den valgte :attribute er ugyldig.",
"numeric" => ":attribute skal være et tal.",
"regex" => ":attribute formatet er ugyldigt.",
"required" => ":attribute feltet er krævet.",
"required_if" => ":attribute feltet er krævet når :other er :value.",
"required_with" => ":attribute er krævet når :values forekommer.",
"required_without" => ":attribute er krævet når :values ikke forekommer.",
"same" => ":attribute og :other skal være ens.",
"size" => array(
"numeric" => ":attribute skal være :size.",
"file" => ":attribute skal være :size kilobytes.",
"string" => ":attribute skal være :size tegn.",
),
"unique" => ":attribute er allerede taget.",
"url" => ":attribute formatet er ugyldigt.",
"statuslabel_type" => "Du skal vælge en gyldig statusmærke type",
"unique_undeleted" => ":attribute skal være unik.",
'accepted' => ':attribute skal være accepteret.',
'active_url' => ':attribute er ikke en gyldig URL.',
'after' => ':attribute skal være en dato efter :date.',
'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
'alpha' => ':attribute må kun indeholde bogstaver.',
'alpha_dash' => ':attribute må kun indeholde bogstaver, tal eller bindestreger.',
'alpha_num' => ':attribute må kun indeholde bogstaver eller tal.',
'array' => 'The :attribute must be an array.',
'before' => ':attribute skal være en dato før :date.',
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
'between' => [
'numeric' => ':attribute skal være imellem :min - :max.',
'file' => ':attribute skal være imellem :min - :max kilobytes.',
'string' => ':attribute skal være imellem :min - :max tegn.',
'array' => 'The :attribute must have between :min and :max items.',
],
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute confirmation does not match.',
'date' => ':attribute er ikke en gyldig dato.',
'date_format' => ':attribute svarer ikke til formatet :format.',
'different' => ':attribute og :other skal være forskellige.',
'digits' => ':attribute skal være :digits cifre.',
'digits_between' => ':attribute skal være imellem :min og :max cifre.',
'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'email' => ':attribute formatet er ugylidgt.',
'exists' => 'Den valgte :attribute er ugyldig.',
'file' => 'The :attribute must be a file.',
'filled' => 'The :attribute field must have a value.',
'image' => ':attribute skal være et billede.',
'in' => 'Det valgte :attribute er ugyldigt.',
'in_array' => 'The :attribute field does not exist in :other.',
'integer' => ':attribute skal være et heltal.',
'ip' => ':attribute skal være en gyldig IP adresse.',
'ipv4' => 'The :attribute must be a valid IPv4 address.',
'ipv6' => 'The :attribute must be a valid IPv6 address.',
'json' => 'The :attribute must be a valid JSON string.',
'max' => [
'numeric' => ':attribute må ikke overstige :max.',
'file' => ':attribute må ikke overstige :max. kilobytes.',
'string' => ':attribute må ikke overstige :max. tegn.',
'array' => 'The :attribute may not have more than :max items.',
],
'mimes' => ':attribute skal være en fil af typen: :values.',
'mimetypes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => ':attribute skal mindst være :min.',
'file' => ':attribute skal mindst være :min kilobytes.',
'string' => ':attribute skal mindst være :min tegn.',
'array' => 'The :attribute must have at least :min items.',
],
'not_in' => 'Den valgte :attribute er ugyldig.',
'numeric' => ':attribute skal være et tal.',
'present' => 'The :attribute field must be present.',
'regex' => ':attribute formatet er ugyldigt.',
'required' => ':attribute feltet er krævet.',
'required_if' => ':attribute feltet er krævet når :other er :value.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => ':attribute er krævet når :values forekommer.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => ':attribute er krævet når :values ikke forekommer.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => ':attribute og :other skal være ens.',
'size' => [
'numeric' => ':attribute skal være :size.',
'file' => ':attribute skal være :size kilobytes.',
'string' => ':attribute skal være :size tegn.',
'array' => 'The :attribute must contain :size items.',
],
'string' => 'The :attribute must be a string.',
'timezone' => 'The :attribute must be a valid zone.',
'unique' => ':attribute er allerede taget.',
'uploaded' => 'The :attribute failed to upload.',
'url' => ':attribute formatet er ugyldigt.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
/*
@@ -82,8 +111,14 @@ return array(
|
*/
'custom' => array(),
'alpha_space' => ":attribute feltet indeholder en karakter der ikke er tilladt.",
'custom' => [
'alpha_space' => "The :attribute field contains a character that is not allowed.",
"email_array" => "One or more email addresses is invalid.",
"hashed_pass" => "Your current password is incorrect",
'dumbpwd' => 'That password is too common.',
"statuslabel_type" => "You must select a valid status label type",
"unique_undeleted" => "The :attribute must be unique.",
],
/*
|--------------------------------------------------------------------------
@@ -96,6 +131,6 @@ return array(
|
*/
'attributes' => array(),
'attributes' => [],
);

View File

@@ -12,8 +12,8 @@
'success' => 'Wartungsvertrag erfolgreich erstellt.'
],
'edit' => [
'error' => 'Asset Maintenance was not created, please try again.',
'success' => 'Asset Maintenance created successfully.'
'error' => 'Asset Maintenance was not edited, please try again.',
'success' => 'Asset Maintenance edited successfully.'
],
'asset_maintenance_incomplete' => 'Wartungsvertrag noch nicht komplett ausgefüllt',
'warranty' => 'Garantie',

View File

@@ -28,7 +28,7 @@ return array(
'fieldset' => array(
'does_not_exist' => 'Fieldset does not exist',
'does_not_exist' => 'Feldsatz existiert nicht',
'create' => array(
'error' => 'Feldsatz wurde nicht erstellt. Bitte erneut versuchen.',

View File

@@ -7,7 +7,7 @@ return array(
'asset' => 'Asset',
'bulk_checkout' => 'Assets an Benutzer herausgeben',
'checkin' => 'Asset zurücknehmen',
'checkout' => 'Asset an Benutzer herausgeben',
'checkout' => 'Checkout Asset',
'clone' => 'Asset duplizieren',
'deployable' => 'Einsetzbar',
'deleted' => 'Dieses Asset wurde gelöscht. <a href="/hardware/:asset_id/restore">Zur Wiederherstellung hier klicken</a>.',

View File

@@ -24,6 +24,12 @@ return array(
'success' => 'Asset erfolgreich wiederhergestellt.'
),
'audit' => array(
'error' => 'Asset audit was unsuccessful. Please try again.',
'success' => 'Asset audit successfully logged.'
),
'deletefile' => array(
'error' => 'Datei wurde nicht gelöscht. Bitte noch einmal Probieren.',
'success' => 'Datei erfolgreich gelöscht.',

View File

@@ -10,6 +10,10 @@ return array(
'alert_interval' => 'Ablauf Alarmschwelle (in Tagen)',
'alert_inv_threshold' => 'Inventar Alarmschwelle',
'asset_ids' => 'Asset IDs',
'audit_interval' => 'Audit Interval',
'audit_interval_help' => 'If you are required to regularly physically audit your assets, enter the interval in months.',
'audit_warning_days' => 'Audit Warning Threshold',
'audit_warning_days_help' => 'How many days in advance should we warn you when assets are due for auditing?',
'auto_increment_assets' => 'Erzeugen von fortlaufenden Asset IDs',
'auto_increment_prefix' => 'Präfix (optional)',
'auto_incrementing_help' => 'Aktiviere zuerst fortlaufende Asset IDs um dies zu setzen',
@@ -63,8 +67,8 @@ return array(
'ldap_email' => 'LDAP E-Mail',
'load_remote_text' => 'Remote Skripte',
'load_remote_help_text' => 'Diese Installation von Snipe-IT kann Skripte von außerhalb laden.',
'login_note' => 'Login Note',
'login_note_help' => 'Optionally include a few sentences on your login screen, for example to assist people who have found a lost or stolen device. This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
'login_note' => 'Anmeldenotiz',
'login_note_help' => 'Fügen Sie optional ein paar Sätze zu Ihrem Anmeldebildschirm hinzu, beispielsweise um Personen zu helfen, welche ein verlorenes oder gestohlenes Gerät gefunden haben. Dieses Feld akzeptiert <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
'logo' => 'Logo',
'full_multiple_companies_support_help_text' => 'Beschränkung von Benutzern (inklusive Administratoren) die einer Firma zugewiesen sind zu den Assets der Firma.',
'full_multiple_companies_support_text' => 'Volle Mehrmandanten-Unterstützung für Firmen',
@@ -73,12 +77,12 @@ return array(
'php' => 'PHP Version',
'php_gd_info' => 'Um QR-Codes anzeigen zu können muss php-gd installiert sein, siehe Installationshinweise.',
'php_gd_warning' => 'PHP Image Processing and GD Plugin ist NICHT installiert.',
'pwd_secure_complexity' => 'Password Complexity',
'pwd_secure_complexity_help' => 'Select whichever password complexity rules you wish to enforce.',
'pwd_secure_min' => 'Password minimum characters',
'pwd_secure_min_help' => 'Minimum permitted value is 5',
'pwd_secure_uncommon' => 'Prevent common passwords',
'pwd_secure_uncommon_help' => 'This will disallow users from using common passwords from the top 10,000 passwords reported in breaches.',
'pwd_secure_complexity' => 'Passwortkomplexität',
'pwd_secure_complexity_help' => 'Wählen Sie aus, welche Komplexitätsregeln Sie für Passwörter erzwingen möchten.',
'pwd_secure_min' => 'Minimale Passwortlänge',
'pwd_secure_min_help' => 'Minimal zulässiger Wert ist 5',
'pwd_secure_uncommon' => 'Gebräuchliche Passwörter verhindern',
'pwd_secure_uncommon_help' => 'Verhindert die Verwendung der 10.000 häufigsten Passwörter aus im Internet geleakten Quellen.',
'qr_help' => 'Schalte zuerst QR Codes an um dies zu setzen',
'qr_text' => 'QR Code Text',
'setting' => 'Einstellung',
@@ -113,8 +117,8 @@ return array(
'width_w' => 'b',
'height_h' => 'h',
'text_pt' => 'pt',
'thumbnail_max_h' => 'Max thumbnail height',
'thumbnail_max_h_help' => 'Maximum height in pixels that thumbnails may display in the listing view. Min 25, max 500.',
'thumbnail_max_h' => 'Maximale Höhe der Miniaturansicht',
'thumbnail_max_h_help' => 'Maximale Höhe für Miniaturansichten in der Listenansicht in Pixel. Min. 25, Max. 500.',
'two_factor' => 'Zwei-Faktor-Authentifizierung',
'two_factor_secret' => 'Zwei-Faktor Code',
'two_factor_enrollment' => 'Zwei-Faktor Registrierung',

View File

@@ -13,6 +13,7 @@ return array(
'filetype_info' => 'Erlaubte Dateitypen sind png, gif, jpg, jpeg, doc, docx, pdf, txt, zip, und rar.',
'history_user' => 'Historie von :name',
'info' => 'Info',
'restore_user' => 'Click here to restore them.',
'last_login' => 'Letzte Anmeldung',
'ldap_config_text' => 'Die LDAP Konfigurations Einstellungen finden Sie hier Admin -> Einstellungen. Der (optional) wählbare Standort wird für alle importierten Benutzer gesetzt.',
'software_user' => 'Software herausgegeben an :name',

View File

@@ -31,7 +31,7 @@ return array(
'create' => 'Beim Erstellen des Benutzers ist ein Fehler aufgetreten. Bitte probieren Sie es noch einmal.',
'update' => 'Beim Aktualisieren des Benutzers ist ein Fehler aufgetreten. Bitte probieren Sie es noch einmal.',
'delete' => 'Beim Entfernen des Benutzers ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.',
'delete_has_assets' => 'This user has items assigned and could not be deleted.',
'delete_has_assets' => 'Der Benutzer konnte nicht gelöscht werden, da ihm Gegenstände zugeordnet sind.',
'unsuspend' => 'Es gab ein Problem beim reaktivieren des Benutzers. Bitte versuche es erneut.',
'import' => 'Es gab ein Problem beim importieren der Benutzer. Bitte noch einmal versuchen.',
'asset_already_accepted' => 'Dieses Asset wurde bereits akzeptiert.',
@@ -41,7 +41,7 @@ return array(
'ldap_could_not_bind' => 'Konnte keine Verbindung zum LDAP Server herstellen. Bitte LDAP Einstellungen in der LDAP Konfigurationsdatei prüfen. <br>Fehler vom LDAP Server: ',
'ldap_could_not_search' => 'Konnte LDAP Server nicht suchen. Bitte LDAP Einstellungen in der LDAP Konfigurationsdatei prüfen. <br>Fehler vom LDAP Server:',
'ldap_could_not_get_entries' => 'Konnte keine Einträge vom LDAP Server abrufen. Bitte LDAP Einstellungen in der LDAP Konfigurationsdatei prüfen. <br>Fehler vom LDAP Server:',
'password_ldap' => 'The password for this account is managed by LDAP/Active Directory. Please contact your IT department to change your password. ',
'password_ldap' => 'Das Passwort für diesen Account wird vom LDAP/Active Directory verwaltet. Bitte kontaktieren Sie Ihre IT-Abteilung, um Ihr Passwort zu ändern. ',
),
'deletefile' => array(

View File

@@ -19,7 +19,7 @@ return array(
'location' => 'Ort',
'lock_passwords' => 'Die Login-Daten können auf dieser Installation nicht geändert werden.',
'manager' => 'Manager',
'managed_locations' => 'Managed Locations',
'managed_locations' => 'Verwaltete Standorte',
'name' => 'Name',
'notes' => 'Notizen',
'password_confirm' => 'Kennwort bestätigen',

View File

@@ -18,11 +18,15 @@
'asset_report' => 'Asset Bericht',
'asset_tag' => 'Asset Tag',
'assets_available' => 'verfügbare Assets',
'audit' => 'Audit',
'audit_report' => 'Audit Log',
'assets' => 'Assets',
'avatar_delete' => 'Avatar löschen',
'avatar_upload' => 'Avatar hochladen',
'back' => 'Zurück',
'bad_data' => 'Nichts gefunden. Vielleicht defekte Daten?',
'bulkaudit' => 'Bulk Audit',
'bulkaudit_status' => 'Audit Status',
'bulk_checkout' => 'Massen-Checkout',
'cancel' => 'Abbrechen',
'categories' => 'Kategorien',
@@ -52,6 +56,8 @@
'current' => 'Aktuell',
'custom_report' => 'Spezieller Asset Report',
'dashboard' => 'Dashboard',
'days' => 'days',
'days_to_next_audit' => 'Days to Next Audit',
'date' => 'Purchase Date',
'debug_warning' => 'Warnung!',
'debug_warning_text' => 'Diese Anwendung läuft im Produktionsmodus mit debugging aktiviert. Dies kann sensible Daten verfügbar machen, wenn Ihre Anwendung öffentlich zugänglich ist. Deaktivieren Sie den Debug-Modus, indem Sie den <code>APP_DEBUG</code>-Wert in der <code>.env</code> Datei auf <code>false</code> setzen.',
@@ -117,6 +123,8 @@
'moreinfo' => 'Mehr Informationen',
'name' => 'Location Name',
'next' => 'Nächstes',
'next_audit_date' => 'Next Audit Date',
'last_audit' => 'Last Audit',
'new' => 'Neu!',
'no_depreciation' => 'Do Not Depreciate',
'no_results' => 'Keine Treffer.',

View File

@@ -13,62 +13,91 @@ return array(
|
*/
"accepted" => ":attribute muss akzeptiert werden.",
"active_url" => ":attribute ist keine gültige URL.",
"after" => ":attribute muss ein Datum nach dem :date sein.",
"alpha" => ":attribute darf nur aus Buchstaben bestehen.",
"alpha_dash" => ":attribute darf nur aus Buchstaben, Zahlen und Gedankenstrichen bestehen.",
"alpha_num" => ":attribute darf nur aus Buchstaben und Zahlen bestehen.",
"before" => ":attribute muss ein Datum vor dem :date sein.",
"between" => array(
"numeric" => ":attribute muss zwischen :min und :max liegen.",
"file" => ":attribute darf nur zwischen :min und :max kilobytes groß sein.",
"string" => ":attribute muss mindestens :min und maximal :max Zeichen enthalten.",
),
"boolean" => ":attribute muss wahr oder falsch sein.",
"confirmed" => ":attribute Bestätigung stimmt nicht überein.",
"date" => ":attribute ist kein gültiges Datum.",
"date_format" => ":attribute passt nicht zur :format Formatierung.",
"different" => ":attribute und :other müssen sich unterscheiden.",
"digits" => ":attribute muss :digits Stellen haben.",
"digits_between" => ":attribute soll mindestens :min und darf maximal :max Stellen haben.",
"email" => "Das Format von :attribute ist ungültig.",
"exists" => "Das ausgewählte :attribute ist ungültig.",
"email_array" => "Eine oder mehrere Email Adressen sind ungültig.",
"hashed_pass" => "Your current password is incorrect",
'dumbpwd' => 'That password is too common.',
"image" => ":attribute muss ein Bild sein.",
"in" => "Auswahl :attribute ist ungültig.",
"integer" => ":attribute muss eine ganze Zahl sein.",
"ip" => ":attribute muss eine gültige IP Adresse sein.",
"max" => array(
"numeric" => ":attribute darf nicht größer als :max sein.",
"file" => ":attribute darf nicht größer als :max Kilobyte sein.",
"string" => ":attribute darf nicht mehr als :max Zeichen sein.",
),
"mimes" => ":attribute muss eine Datei des Typs :values sein.",
"min" => array(
"numeric" => ":attribute muss kleiner als :min sein.",
"file" => ":attribute muss mindestens :min Kilobyte groß sein.",
"string" => ":attribute benötigt mindestens :min Zeichen.",
),
"not_in" => "Auswahl :attribute ist ungültig.",
"numeric" => ":attribute muss eine Zahl sein.",
"regex" => ":attribute Format ungültig.",
"required" => ":attribute Feld muss ausgefüllt sein.",
"required_if" => ":attribute wird benötigt wenn :other :value entspricht.",
"required_with" => ":attribute wird benötigt wenn :value ausgewählt ist.",
"required_without" => ":attribute wird benötigt wenn :value nicht ausgewählt ist.",
"same" => ":attribute und :other müssen übereinstimmen.",
"size" => array(
"numeric" => ":attribute muss :size groß sein.",
"file" => ":attribute muss :size Kilobyte groß sein.",
"string" => ":attribute muss :size Zeichen haben.",
),
"unique" => ":attribute schon benutzt.",
"url" => ":attribute Format ist ungültig.",
"statuslabel_type" => "Gültigen Status Beschriftungstyp auswählen!",
"unique_undeleted" => ":attribute muss eindeutig sein.",
'accepted' => ':attribute muss akzeptiert werden.',
'active_url' => ':attribute ist keine gültige URL.',
'after' => ':attribute muss ein Datum nach dem :date sein.',
'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
'alpha' => ':attribute darf nur aus Buchstaben bestehen.',
'alpha_dash' => ':attribute darf nur aus Buchstaben, Zahlen und Gedankenstrichen bestehen.',
'alpha_num' => ':attribute darf nur aus Buchstaben und Zahlen bestehen.',
'array' => 'The :attribute must be an array.',
'before' => ':attribute muss ein Datum vor dem :date sein.',
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
'between' => [
'numeric' => ':attribute muss zwischen :min und :max liegen.',
'file' => ':attribute darf nur zwischen :min und :max kilobytes groß sein.',
'string' => ':attribute muss mindestens :min und maximal :max Zeichen enthalten.',
'array' => 'The :attribute must have between :min and :max items.',
],
'boolean' => ':attribute muss wahr oder falsch sein.',
'confirmed' => ':attribute Bestätigung stimmt nicht überein.',
'date' => ':attribute ist kein gültiges Datum.',
'date_format' => ':attribute passt nicht zur :format Formatierung.',
'different' => ':attribute und :other müssen sich unterscheiden.',
'digits' => ':attribute muss :digits Stellen haben.',
'digits_between' => ':attribute soll mindestens :min und darf maximal :max Stellen haben.',
'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'email' => 'Das Format von :attribute ist ungültig.',
'exists' => 'Das ausgewählte :attribute ist ungültig.',
'file' => 'The :attribute must be a file.',
'filled' => 'The :attribute field must have a value.',
'image' => ':attribute muss ein Bild sein.',
'in' => 'Auswahl :attribute ist ungültig.',
'in_array' => 'The :attribute field does not exist in :other.',
'integer' => ':attribute muss eine ganze Zahl sein.',
'ip' => ':attribute muss eine gültige IP Adresse sein.',
'ipv4' => 'The :attribute must be a valid IPv4 address.',
'ipv6' => 'The :attribute must be a valid IPv6 address.',
'json' => 'The :attribute must be a valid JSON string.',
'max' => [
'numeric' => ':attribute darf nicht größer als :max sein.',
'file' => ':attribute darf nicht größer als :max Kilobyte sein.',
'string' => ':attribute darf nicht mehr als :max Zeichen sein.',
'array' => 'The :attribute may not have more than :max items.',
],
'mimes' => ':attribute muss eine Datei des Typs :values sein.',
'mimetypes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => ':attribute muss kleiner als :min sein.',
'file' => ':attribute muss mindestens :min Kilobyte groß sein.',
'string' => ':attribute benötigt mindestens :min Zeichen.',
'array' => 'The :attribute must have at least :min items.',
],
'not_in' => 'Auswahl :attribute ist ungültig.',
'numeric' => ':attribute muss eine Zahl sein.',
'present' => 'The :attribute field must be present.',
'regex' => ':attribute Format ungültig.',
'required' => ':attribute Feld muss ausgefüllt sein.',
'required_if' => ':attribute wird benötigt wenn :other :value entspricht.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => ':attribute wird benötigt wenn :value ausgewählt ist.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => ':attribute wird benötigt wenn :value nicht ausgewählt ist.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => ':attribute und :other müssen übereinstimmen.',
'size' => [
'numeric' => ':attribute muss :size groß sein.',
'file' => ':attribute muss :size Kilobyte groß sein.',
'string' => ':attribute muss :size Zeichen haben.',
'array' => 'The :attribute must contain :size items.',
],
'string' => 'The :attribute must be a string.',
'timezone' => 'The :attribute must be a valid zone.',
'unique' => ':attribute schon benutzt.',
'uploaded' => 'The :attribute failed to upload.',
'url' => ':attribute Format ist ungültig.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
/*
@@ -82,8 +111,14 @@ return array(
|
*/
'custom' => array(),
'alpha_space' => "Das :attribute Feld enthält ein nicht erlaubtes Zeichen.",
'custom' => [
'alpha_space' => "The :attribute field contains a character that is not allowed.",
"email_array" => "One or more email addresses is invalid.",
"hashed_pass" => "Your current password is incorrect",
'dumbpwd' => 'That password is too common.',
"statuslabel_type" => "You must select a valid status label type",
"unique_undeleted" => "The :attribute must be unique.",
],
/*
|--------------------------------------------------------------------------
@@ -96,6 +131,6 @@ return array(
|
*/
'attributes' => array(),
'attributes' => [],
);

View File

@@ -6,19 +6,19 @@ return array(
'assoc_users' => 'This accessory currently has :count items checked out to users. Please check in the accessories and and try again. ',
'create' => array(
'error' => 'The accessory was not created, please try again.',
'error' => 'Το εξάρτημα δεν δημιουργήθηκε, παρακαλώ προσπαθήστε ξανά.',
'success' => 'Το εξάρτημα δημιουργήθηκε με επιτυχία.'
),
'update' => array(
'error' => 'The accessory was not updated, please try again',
'success' => 'The accessory was updated successfully.'
'error' => 'Το εξάρτημα δεν ενημερώθηκε, παρακαλώ προσπαθήστε ξανά',
'success' => 'Το εξάρτημα ενημερώθηκε με επιτυχία.'
),
'delete' => array(
'confirm' => 'Are you sure you wish to delete this accessory?',
'confirm' => 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το εξάρτημα;',
'error' => 'Υπήρξε ένα ζήτημα διαγράφοντας το αξεσουάρ. Παρακαλώ δοκιμάστε ξανά.',
'success' => 'The accessory was deleted successfully.'
'success' => 'Το εξάρτημα διαγράφηκε με επιτυχία.'
),
'checkout' => array(

View File

@@ -12,8 +12,8 @@
'success' => 'Επιτυχής δημιουργία συντήρησης παγίου.'
],
'edit' => [
'error' => 'Asset Maintenance was not created, please try again.',
'success' => 'Asset Maintenance created successfully.'
'error' => 'Asset Maintenance was not edited, please try again.',
'success' => 'Asset Maintenance edited successfully.'
],
'asset_maintenance_incomplete' => 'Δεν ολοκληρώθηκε ακόμη',
'warranty' => 'Εγγύηση',

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