Files
GSB-Construction/Modules/BiddingManagement/app/Http/Controllers/BidInvitationController.php

89 lines
2.8 KiB
PHP

<?php
namespace Modules\BiddingManagement\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Modules\BiddingManagement\Enums\BidPackageStatus;
use Modules\BiddingManagement\Models\BidInvitation;
use Modules\BiddingManagement\Models\BidPackage;
use Modules\ContractorManagement\Models\Contractor;
class BidInvitationController extends Controller
{
public function store(Request $request, BidPackage $bid)
{
abort_unless(
in_array($bid->status, [BidPackageStatus::Draft, BidPackageStatus::Open]),
403,
'Invitations can only be added to draft or open packages.'
);
$validated = $request->validate([
'contractor_ids' => 'required|array|min:1',
'contractor_ids.*' => 'required|string',
]);
$added = 0;
foreach ($validated['contractor_ids'] as $ulid) {
$contractorId = Contractor::resolveUlidToId($ulid);
if (!$contractorId) {
continue;
}
// Skip duplicates
$exists = $bid->invitations()->where('contractor_id', $contractorId)->exists();
if ($exists) {
continue;
}
$bid->invitations()->create([
'contractor_id' => $contractorId,
'status' => 'invited',
'invited_at' => now(),
]);
$added++;
}
return back()->with('success', "{$added} contractor(s) invited.");
}
public function destroy(BidInvitation $invitation)
{
abort_unless(
in_array($invitation->package->status, [BidPackageStatus::Draft, BidPackageStatus::Open]),
403,
'Cannot remove invitations at this stage.'
);
abort_if($invitation->submission()->exists(), 422, 'Cannot remove an invitation that has a submission.');
$invitation->delete();
return back()->with('success', 'Invitation removed.');
}
public function accept(BidInvitation $invitation)
{
abort_unless($invitation->package->status === BidPackageStatus::Open, 403, 'Bid package is not open.');
abort_if($invitation->status === 'declined', 422, 'You have already declined this invitation.');
$invitation->accept();
return back()->with('success', 'You have accepted the bid invitation.');
}
public function decline(Request $request, BidInvitation $invitation)
{
abort_unless($invitation->package->status === BidPackageStatus::Open, 403, 'Bid package is not open.');
$validated = $request->validate([
'reason' => 'nullable|string|max:500',
]);
$invitation->decline($validated['reason'] ?? null);
return back()->with('success', 'You have declined the bid invitation.');
}
}