Skip to content

Commit afafccd

Browse files
authored
Merge pull request #83 from imbus/rebase-20251107
Rebase 20251107
2 parents 0538b0a + dd36633 commit afafccd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+701
-261
lines changed

app/Http/Controllers/Api/DepartmentsController.php

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use App\Helpers\Helper;
66
use App\Http\Controllers\Controller;
7+
use App\Http\Requests\StoreDepartmentRequest;
78
use App\Http\Transformers\DepartmentsTransformer;
89
use App\Http\Transformers\SelectlistTransformer;
910
use App\Models\Department;
@@ -26,18 +27,19 @@ public function index(Request $request) : JsonResponse | array
2627
$allowed_columns = ['id', 'name', 'image', 'users_count', 'notes'];
2728

2829
$departments = Department::select(
29-
'departments.id',
30-
'departments.name',
31-
'departments.phone',
32-
'departments.fax',
33-
'departments.location_id',
34-
'departments.company_id',
35-
'departments.manager_id',
36-
'departments.created_at',
37-
'departments.updated_at',
38-
'departments.image',
39-
'departments.notes',
40-
)->with('users')->with('location')->with('manager')->with('company')->withCount('users as users_count');
30+
[
31+
'departments.id',
32+
'departments.name',
33+
'departments.phone',
34+
'departments.fax',
35+
'departments.location_id',
36+
'departments.company_id',
37+
'departments.manager_id',
38+
'departments.created_at',
39+
'departments.updated_at',
40+
'departments.image',
41+
'departments.notes'
42+
])->with('users')->with('location')->with('manager')->with('company')->withCount('users as users_count');
4143

4244
if ($request->filled('search')) {
4345
$departments = $departments->TextSearch($request->input('search'));
@@ -94,18 +96,17 @@ public function index(Request $request) : JsonResponse | array
9496
* @since [v4.0]
9597
* @param \App\Http\Requests\ImageUploadRequest $request
9698
*/
97-
public function store(ImageUploadRequest $request) : JsonResponse
99+
public function store(StoreDepartmentRequest $request): JsonResponse
98100
{
99-
$this->authorize('create', Department::class);
100101
$department = new Department;
101-
$department->fill($request->all());
102+
$department->fill($request->validated());
102103
$department = $request->handleImages($department);
103104

104105
$department->created_by = auth()->id();
105106
$department->manager_id = ($request->filled('manager_id') ? $request->input('manager_id') : null);
106107

107108
if ($department->save()) {
108-
return response()->json(Helper::formatStandardApiResponse('success', $department, trans('admin/departments/message.create.success')));
109+
return response()->json(Helper::formatStandardApiResponse('success', (new DepartmentsTransformer)->transformDepartment($department), trans('admin/departments/message.create.success')));
109110
}
110111
return response()->json(Helper::formatStandardApiResponse('error', null, $department->getErrors()));
111112

@@ -121,7 +122,7 @@ public function store(ImageUploadRequest $request) : JsonResponse
121122
public function show($id) : array
122123
{
123124
$this->authorize('view', Department::class);
124-
$department = Department::findOrFail($id);
125+
$department = Department::withCount('users as users_count')->findOrFail($id);
125126
return (new DepartmentsTransformer)->transformDepartment($department);
126127
}
127128

@@ -141,7 +142,7 @@ public function update(ImageUploadRequest $request, $id) : JsonResponse
141142
$department = $request->handleImages($department);
142143

143144
if ($department->save()) {
144-
return response()->json(Helper::formatStandardApiResponse('success', $department, trans('admin/departments/message.update.success')));
145+
return response()->json(Helper::formatStandardApiResponse('success', (new DepartmentsTransformer)->transformDepartment($department), trans('admin/departments/message.update.success')));
145146
}
146147

147148
return response()->json(Helper::formatStandardApiResponse('error', null, $department->getErrors()));

app/Http/Controllers/Api/GroupsController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public function index(Request $request) : JsonResponse | array
2525

2626
$this->authorize('view', Group::class);
2727

28-
$groups = Group::select('id', 'name', 'permissions', 'notes', 'created_at', 'updated_at', 'created_by')->with('adminuser')->withCount('users as users_count');
28+
$groups = Group::select(['id', 'name', 'permissions', 'notes', 'created_at', 'updated_at', 'created_by'])->with('adminuser')->withCount('users as users_count');
2929

3030
if ($request->filled('search')) {
3131
$groups = $groups->TextSearch($request->input('search'));
@@ -51,6 +51,7 @@ public function index(Request $request) : JsonResponse | array
5151
'id',
5252
'name',
5353
'created_at',
54+
'updated_at',
5455
'users_count',
5556
];
5657

app/Http/Controllers/Api/LicenseSeatsController.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ public function index(Request $request, $licenseId) : JsonResponse | array
2626
if ($license = License::find($licenseId)) {
2727
$this->authorize('view', $license);
2828

29-
$seats = LicenseSeat::with('license', 'user', 'asset', 'user.department')
29+
$seats = LicenseSeat::with('license', 'user', 'asset', 'user.department', 'user.company', 'asset.company')
3030
->where('license_seats.license_id', $licenseId);
3131

3232
if ($request->input('status') == 'available') {
33-
$seats->whereNull('license_seats.assigned_to');
33+
$seats->whereNull('license_seats.assigned_to')->whereNull('license_seats.asset_id');
3434
}
3535

3636
if ($request->input('status') == 'assigned') {
@@ -40,8 +40,10 @@ public function index(Request $request, $licenseId) : JsonResponse | array
4040

4141
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
4242

43-
if ($request->input('sort') == 'department') {
43+
if ($request->input('sort') == 'assigned_user.department') {
4444
$seats->OrderDepartments($order);
45+
} elseif ($request->input('sort') == 'assigned_user.company') {
46+
$seats->OrderCompany($order);
4547
} else {
4648
$seats->orderBy('updated_at', $order);
4749
}
@@ -83,7 +85,7 @@ public function show($licenseId, $seatId) : JsonResponse | array
8385
return response()->json(Helper::formatStandardApiResponse('error', null, 'Seat not found'));
8486
}
8587
// 2. does the seat belong to the specified license?
86-
if (! $license = $licenseSeat->license()->first() || $license->id != intval($licenseId)) {
88+
if (! $licenseSeat = $licenseSeat->license()->first() || $licenseSeat->id != intval($licenseId)) {
8789
return response()->json(Helper::formatStandardApiResponse('error', null, 'Seat does not belong to the specified license'));
8890
}
8991

app/Http/Controllers/GroupsController.php

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,12 @@ public function create(Request $request) : View
4343
$permissions = config('permissions');
4444
$groupPermissions = Helper::selectedPermissionsArray($permissions, $permissions);
4545
$selectedPermissions = $request->old('permissions', $groupPermissions);
46-
46+
$users = \App\Models\User::orderBy('first_name', 'asc')->orderBy('last_name', 'asc')->get();
4747
// Show the page
48-
return view('groups/edit', compact('permissions', 'selectedPermissions', 'groupPermissions'))->with('group', $group);
48+
return view('groups/edit', compact('permissions', 'selectedPermissions', 'groupPermissions'))
49+
->with('group', $group)
50+
->with('associated_users', [])
51+
->with('unselected_users', $users);
4952
}
5053

5154
/**
@@ -60,12 +63,23 @@ public function store(Request $request) : RedirectResponse
6063
// create a new group instance
6164
$group = new Group();
6265
$group->name = $request->input('name');
66+
67+
if ($request->filled('permission')) {
68+
$group->permissions = json_encode($request->array('permission'));
69+
} else {
70+
$group->permissions = null;
71+
}
72+
6373
$group->permissions = json_encode($request->input('permission'));
6474
$group->created_by = auth()->id();
6575
$group->notes = $request->input('notes');
6676

6777
if ($group->save()) {
68-
$group->users()->sync($request->input('associated_users'));
78+
79+
if ($request->filled('users_to_sync')) {
80+
$associated_users = explode(',',$request->input('users_to_sync'));
81+
$group->users()->sync($associated_users);
82+
}
6983
return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.create'));
7084
}
7185

@@ -89,10 +103,12 @@ public function edit(Group $group) : View | RedirectResponse
89103
$groupPermissions = [];
90104
}
91105
$selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions);
92-
$associated_users = $group->users()->get();
106+
$associated_users = $group->users()->orderBy('first_name', 'asc')->orderBy('last_name', 'asc')->get();
107+
108+
// Get the unselected users
109+
$unselected_users = \App\Models\User::whereNotIn('id', $associated_users->pluck('id')->toArray())->orderBy('first_name', 'asc')->orderBy('last_name', 'asc')->get();
93110

94-
//dd($associated_users->toArray());
95-
return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions'))->with('associated_users', $associated_users);
111+
return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions'))->with('associated_users', $associated_users)->with('unselected_users', $unselected_users);
96112
}
97113

98114
/**
@@ -106,13 +122,24 @@ public function edit(Group $group) : View | RedirectResponse
106122
public function update(Request $request, Group $group) : RedirectResponse
107123
{
108124
$group->name = $request->input('name');
109-
$group->permissions = json_encode($request->input('permission'));
125+
126+
if ($request->filled('permission')) {
127+
$group->permissions = json_encode($request->array('permission'));
128+
} else {
129+
$group->permissions = null;
130+
}
131+
110132
$group->notes = $request->input('notes');
111133

112134

113135
if (! config('app.lock_passwords')) {
114136
if ($group->save()) {
115-
$group->users()->sync($request->input('associated_users'));
137+
138+
if ($request->filled('users_to_sync')) {
139+
$associated_users = explode(',',$request->input('users_to_sync'));
140+
$group->users()->sync($associated_users);
141+
}
142+
116143
return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.update'));
117144
}
118145

app/Http/Controllers/SettingsController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,7 @@ public function postLabels(StoreLabelSettings $request) : RedirectResponse
772772
$setting->label2_asset_logo = $request->input('label2_asset_logo');
773773
$setting->label2_1d_type = $request->input('label2_1d_type');
774774
$setting->label2_2d_type = $request->input('label2_2d_type');
775+
$setting->label2_2d_prefix = $request->input('label2_2d_prefix');
775776
$setting->label2_2d_target = $request->input('label2_2d_target');
776777
$setting->label2_fields = $request->input('label2_fields');
777778
$setting->label2_empty_row_count = $request->input('label2_empty_row_count');
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace App\Http\Requests;
4+
5+
use App\Models\Department;
6+
use Illuminate\Foundation\Http\FormRequest;
7+
use Illuminate\Support\Facades\Gate;
8+
9+
class StoreDepartmentRequest extends ImageUploadRequest
10+
{
11+
/**
12+
* Determine if the user is authorized to make this request.
13+
*/
14+
public function authorize(): bool
15+
{
16+
return Gate::allows('create', new Department);
17+
}
18+
19+
/**
20+
* Get the validation rules that apply to the request.
21+
*
22+
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
23+
*/
24+
public function rules(): array
25+
{
26+
$modelRules = (new Department)->getRules();
27+
28+
return array_merge(
29+
$modelRules,
30+
);
31+
}
32+
}

app/Http/Requests/StoreLabelSettings.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public function rules(): array
4949
'labels_pagewidth' => 'numeric|nullable',
5050
'labels_pageheight' => 'numeric|nullable',
5151
'qr_text' => 'max:31|nullable',
52+
'label2_2d_prefix' => 'nullable|max:191',
5253
'label2_template' => [
5354
'required',
5455
Rule::in($names),

app/Http/Requests/UpdateAssetRequest.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,23 +28,31 @@ public function authorize()
2828
*/
2929
public function rules()
3030
{
31+
$setting = Setting::getSettings();
32+
3133
$rules = array_merge(
3234
parent::rules(),
3335
(new Asset)->getRules(),
34-
// this is to overwrite rulesets that include required, and rewrite unique_undeleted
36+
// This overwrites the rulesets that are set at the model level (via Watson) but are not necessarily required at the request level when doing a PATCH update.
37+
// Confusingly, this skips the unique_undeleted validator at the model level (and therefore the UniqueUndeletedTrait), so we have to re-add those
38+
// rules here without the requiredness, since those values will already exist if you're updating an existing asset.
3539
[
3640
'model_id' => ['integer', 'exists:models,id,deleted_at,NULL', 'not_array'],
3741
'status_id' => ['integer', 'exists:status_labels,id'],
3842
'asset_tag' => [
3943
'min:1', 'max:255', 'not_array',
40-
Rule::unique('assets', 'asset_tag')->ignore($this->asset)->withoutTrashed()
44+
Rule::unique('assets', 'asset_tag')->ignore($this->asset)->withoutTrashed(),
45+
],
46+
'serial' => [
47+
'string', 'max:255', 'not_array',
48+
$setting->unique_serial=='1' ? Rule::unique('assets', 'serial')->ignore($this->asset)->withoutTrashed() : 'nullable',
4149
],
4250
],
4351
);
4452

4553
// if the purchase cost is passed in as a string **and** the digit_separator is ',' (as is common in the EU)
4654
// then we tweak the purchase_cost rule to make it a string
47-
if (Setting::getSettings()->digit_separator === '1.234,56' && is_string($this->input('purchase_cost'))) {
55+
if ($setting->digit_separator === '1.234,56' && is_string($this->input('purchase_cost'))) {
4856
$rules['purchase_cost'] = ['nullable', 'string'];
4957
}
5058

app/Http/Transformers/DepartmentsTransformer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public function transformDepartment(Department $department = null)
4343
'id' => (int) $department->location->id,
4444
'name' => e($department->location->name),
4545
] : null,
46-
'users_count' => e($department->users_count),
46+
'users_count' => (int) ($department->users_count),
4747
'notes' => Helper::parseEscapedMarkedownInline($department->notes),
4848
'created_at' => Helper::getFormattedDateObject($department->created_at, 'datetime'),
4949
'updated_at' => Helper::getFormattedDateObject($department->updated_at, 'datetime'),

app/Http/Transformers/LicenseSeatsTransformer.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ public function transformLicenseSeat(LicenseSeat $seat)
3636
'name' => e($seat->user->department->name),
3737

3838
] : null,
39+
'company'=> ($seat->user->company) ?
40+
[
41+
'id' => (int) $seat->user->company->id,
42+
'name' => e($seat->user->company->name),
43+
44+
] : null,
3945
'created_at' => Helper::getFormattedDateObject($seat->created_at, 'datetime'),
4046
] : null,
4147
'assigned_asset' => ($seat->asset) ? [

0 commit comments

Comments
 (0)