Features: - Support login via phone number or email (LoginRequest) - Add members:import-roster command for Excel roster import - Merge survey emails with roster data Code Quality (Phase 1-4): - Add database locking for balance calculation - Add self-approval checks for finance workflow - Create service layer (FinanceDocumentApprovalService, PaymentVerificationService) - Add HasAccountingEntries and HasApprovalWorkflow traits - Create FormRequest classes for validation - Add status-badge component - Define authorization gates in AuthServiceProvider - Add accounting config file Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
79 lines
2.4 KiB
PHP
79 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Requests;
|
|
|
|
use App\Models\Issue;
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
class UpdateIssueRequest extends FormRequest
|
|
{
|
|
/**
|
|
* Determine if the user is authorized to make this request.
|
|
*/
|
|
public function authorize(): bool
|
|
{
|
|
$issue = $this->route('issue');
|
|
|
|
// Admins can always edit
|
|
if ($this->user()->hasRole('admin')) {
|
|
return true;
|
|
}
|
|
|
|
// Cannot edit closed issues
|
|
if ($issue && $issue->isClosed()) {
|
|
return false;
|
|
}
|
|
|
|
return $this->user()->can('edit_issues');
|
|
}
|
|
|
|
/**
|
|
* Get the validation rules that apply to the request.
|
|
*
|
|
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
|
*/
|
|
public function rules(): array
|
|
{
|
|
return [
|
|
'title' => ['required', 'string', 'max:255'],
|
|
'description' => ['nullable', 'string'],
|
|
'issue_type' => ['required', Rule::in([
|
|
Issue::TYPE_WORK_ITEM,
|
|
Issue::TYPE_PROJECT_TASK,
|
|
Issue::TYPE_MAINTENANCE,
|
|
Issue::TYPE_MEMBER_REQUEST,
|
|
])],
|
|
'priority' => ['required', Rule::in([
|
|
Issue::PRIORITY_LOW,
|
|
Issue::PRIORITY_MEDIUM,
|
|
Issue::PRIORITY_HIGH,
|
|
Issue::PRIORITY_URGENT,
|
|
])],
|
|
'assigned_to_user_id' => ['nullable', 'exists:users,id'],
|
|
'reviewer_id' => ['nullable', 'exists:users,id'],
|
|
'member_id' => ['nullable', 'exists:members,id'],
|
|
'parent_issue_id' => ['nullable', 'exists:issues,id'],
|
|
'due_date' => ['nullable', 'date'],
|
|
'estimated_hours' => ['nullable', 'numeric', 'min:0'],
|
|
'labels' => ['nullable', 'array'],
|
|
'labels.*' => ['exists:issue_labels,id'],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Get custom messages for validator errors.
|
|
*/
|
|
public function messages(): array
|
|
{
|
|
return [
|
|
'title.required' => __('Title is required.'),
|
|
'issue_type.required' => __('Issue type is required.'),
|
|
'issue_type.in' => __('Invalid issue type.'),
|
|
'priority.required' => __('Priority is required.'),
|
|
'priority.in' => __('Invalid priority level.'),
|
|
];
|
|
}
|
|
}
|