DONE: phone number verification, admin can add user employment; WIP: wire with onewaysms
This commit is contained in:
@@ -195,6 +195,7 @@ class UserController extends BaseCrudController
|
||||
'join_date_to' => 'nullable|date',
|
||||
'leave_date_from' => 'nullable|date',
|
||||
'leave_date_to' => 'nullable|date',
|
||||
'company_name' => 'nullable|string|max:255',
|
||||
]);
|
||||
|
||||
$perPage = min((int) $request->get('per_page', 10), 500);
|
||||
@@ -203,6 +204,7 @@ class UserController extends BaseCrudController
|
||||
'join_date_to' => $request->get('join_date_to'),
|
||||
'leave_date_from' => $request->get('leave_date_from'),
|
||||
'leave_date_to' => $request->get('leave_date_to'),
|
||||
'company_name' => $request->get('company_name'),
|
||||
]);
|
||||
$items = $this->userService->getPaginatedList(
|
||||
$perPage,
|
||||
@@ -279,6 +281,7 @@ class UserController extends BaseCrudController
|
||||
'join_date_to' => 'nullable|date',
|
||||
'leave_date_from' => 'nullable|date',
|
||||
'leave_date_to' => 'nullable|date',
|
||||
'company_name' => 'nullable|string|max:255',
|
||||
]);
|
||||
|
||||
$dateFilters = array_filter([
|
||||
@@ -286,6 +289,7 @@ class UserController extends BaseCrudController
|
||||
'join_date_to' => $request->get('join_date_to'),
|
||||
'leave_date_from' => $request->get('leave_date_from'),
|
||||
'leave_date_to' => $request->get('leave_date_to'),
|
||||
'company_name' => $request->get('company_name'),
|
||||
]);
|
||||
|
||||
$stats = $this->userService->getListStats(
|
||||
|
||||
@@ -0,0 +1,144 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\User\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\ActivityLogger;
|
||||
use Exception;
|
||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Modules\Auth\Entities\User;
|
||||
use Modules\User\Entities\Employment;
|
||||
use Modules\User\Http\Requests\EmploymentRequest;
|
||||
use Modules\User\Transformers\EmploymentResource;
|
||||
|
||||
class UserEmploymentController extends Controller
|
||||
{
|
||||
use AuthorizesRequests;
|
||||
public function store(EmploymentRequest $request, string $user): JsonResponse
|
||||
{
|
||||
$this->authorize('update', User::class);
|
||||
|
||||
try {
|
||||
$targetUser = User::query()->find($user);
|
||||
|
||||
if (! $targetUser) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'User not found.',
|
||||
], 404);
|
||||
}
|
||||
|
||||
$employment = $targetUser->employments()->create($request->validated());
|
||||
|
||||
ActivityLogger::log(
|
||||
"Created employment for user {$targetUser->name}: {$employment->company_name}",
|
||||
$employment
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => new EmploymentResource($employment),
|
||||
'message' => 'Employment created successfully.',
|
||||
], 201);
|
||||
} catch (Exception $e) {
|
||||
Log::error('Error creating user employment: '.$e->getMessage());
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Failed to create employment.',
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
public function update(EmploymentRequest $request, string $user, string $employment): JsonResponse
|
||||
{
|
||||
$this->authorize('update', User::class);
|
||||
|
||||
try {
|
||||
$targetUser = User::query()->find($user);
|
||||
|
||||
if (! $targetUser) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'User not found.',
|
||||
], 404);
|
||||
}
|
||||
|
||||
$employmentModel = $targetUser->employments()->find($employment);
|
||||
|
||||
if (! $employmentModel) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Employment not found.',
|
||||
], 404);
|
||||
}
|
||||
|
||||
$employmentModel->update($request->validated());
|
||||
|
||||
ActivityLogger::log(
|
||||
"Updated employment for user {$targetUser->name}: {$employmentModel->company_name}",
|
||||
$employmentModel
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => new EmploymentResource($employmentModel->fresh()),
|
||||
'message' => 'Employment updated successfully.',
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
Log::error('Error updating user employment: '.$e->getMessage());
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Failed to update employment.',
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
public function destroy(string $user, string $employment): JsonResponse
|
||||
{
|
||||
$this->authorize('update', User::class);
|
||||
|
||||
try {
|
||||
$targetUser = User::query()->find($user);
|
||||
|
||||
if (! $targetUser) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'User not found.',
|
||||
], 404);
|
||||
}
|
||||
|
||||
$employmentModel = $targetUser->employments()->find($employment);
|
||||
|
||||
if (! $employmentModel) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Employment not found.',
|
||||
], 404);
|
||||
}
|
||||
|
||||
$companyName = $employmentModel->company_name;
|
||||
$employmentModel->delete();
|
||||
|
||||
ActivityLogger::log(
|
||||
"Deleted employment for user {$targetUser->name}: {$companyName}",
|
||||
$targetUser
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Employment deleted successfully.',
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
Log::error('Error deleting user employment: '.$e->getMessage());
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Failed to delete employment.',
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -46,6 +46,31 @@ class UserRepository implements UserRepositoryInterface
|
||||
}
|
||||
}
|
||||
|
||||
private function applyCompanyNameFilter($query, string $companyName): void
|
||||
{
|
||||
if ($companyName === '') {
|
||||
return;
|
||||
}
|
||||
|
||||
$query->whereHas('employments', function ($employmentQuery) use ($companyName) {
|
||||
$employmentQuery
|
||||
->where('company_name', $companyName)
|
||||
->whereRaw('employments.id = (
|
||||
SELECT e2.id
|
||||
FROM employments e2
|
||||
WHERE e2.user_id = employments.user_id
|
||||
ORDER BY e2.is_current DESC, e2.start_date DESC
|
||||
LIMIT 1
|
||||
)');
|
||||
});
|
||||
}
|
||||
|
||||
private function applyListFilters($query, array $filters): void
|
||||
{
|
||||
$this->applyDateRangeFilters($query, $filters);
|
||||
$this->applyCompanyNameFilter($query, $filters['company_name'] ?? '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all Users with pagination and search
|
||||
*/
|
||||
@@ -107,7 +132,7 @@ class UserRepository implements UserRepositoryInterface
|
||||
$query->where('status', $status);
|
||||
}
|
||||
|
||||
$this->applyDateRangeFilters($query, $dateFilters);
|
||||
$this->applyListFilters($query, $dateFilters);
|
||||
|
||||
return $query->paginate($perPage);
|
||||
}
|
||||
@@ -177,7 +202,7 @@ class UserRepository implements UserRepositoryInterface
|
||||
$baseQuery->where('status', $status);
|
||||
}
|
||||
|
||||
$this->applyDateRangeFilters($baseQuery, $dateFilters);
|
||||
$this->applyListFilters($baseQuery, $dateFilters);
|
||||
|
||||
$total = (int) (clone $baseQuery)->count();
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ use Modules\User\Http\Controllers\UserController;
|
||||
use App\Http\Controllers\ImpersonateController;
|
||||
use Modules\User\Http\Controllers\AddressController;
|
||||
use Modules\User\Http\Controllers\EmploymentController;
|
||||
use Modules\User\Http\Controllers\UserEmploymentController;
|
||||
use Modules\User\Http\Controllers\BankController;
|
||||
use Modules\User\Http\Controllers\BankDetailController;
|
||||
use Modules\User\Http\Controllers\HeirController;
|
||||
@@ -33,6 +34,9 @@ Route::middleware(['auth:sanctum', 'single.session'])->prefix('v1')->group(funct
|
||||
Route::apiResource('heirs', HeirController::class)->names('heir');
|
||||
// User role management routes
|
||||
Route::post('users/{user}/roles', [UserController::class, 'assignRoles'])->name('users.roles.assign');
|
||||
Route::post('users/{user}/employments', [UserEmploymentController::class, 'store'])->name('users.employments.store');
|
||||
Route::put('users/{user}/employments/{employment}', [UserEmploymentController::class, 'update'])->name('users.employments.update');
|
||||
Route::delete('users/{user}/employments/{employment}', [UserEmploymentController::class, 'destroy'])->name('users.employments.destroy');
|
||||
|
||||
// User profile management routes
|
||||
Route::post('/profile', [UserController::class, 'updateProfile']);
|
||||
|
||||
Reference in New Issue
Block a user