refactor: remove verification status from cooperation workflow and automate transition to payment

This commit is contained in:
Yoga Pangestu 2026-04-10 14:42:28 +07:00
parent 5e545f4bea
commit 43271a82a9
11 changed files with 17 additions and 87 deletions

View File

@ -115,8 +115,8 @@ public function handle()
}
// 3. Update Status
$cooperation->update(['status' => CooperationStatus::VERIFICATION]);
$this->info('Status transitioned to VERIFICATION.');
$cooperation->update(['status' => CooperationStatus::PAYMENT]);
$this->info('Status transitioned to PAYMENT.');
} else {
$this->error('This ASSIGNMENT cooperation has no Task Assignment yet.');
}

View File

@ -57,7 +57,7 @@ public function handle()
Log::info("Updated {$updatedPending} cooperations from PENDING to ASSIGNMENT.");
}
// 2. ASSIGNMENT -> VERIFICATION (taskAssignment->end_date)
// 2. ASSIGNMENT -> PAYMENT (taskAssignment->end_date)
// Automatically reject media that haven't responded to the invitation
$rejectedMedia = CooperationMedia::whereHas('cooperation', function ($query) use ($today) {
$query->assignment()->whereHas('taskAssignment', function ($subQuery) use ($today) {
@ -75,10 +75,13 @@ public function handle()
->whereHas('taskAssignment', function ($query) use ($today) {
$query->whereDate('end_date', '<', $today);
})
->update(['status' => CooperationStatus::VERIFICATION]);
->update([
'status' => CooperationStatus::PAYMENT,
'payment_date' => $today,
]);
if ($updatedAssignment > 0) {
Log::info("Updated {$updatedAssignment} cooperations from ASSIGNMENT to VERIFICATION.");
Log::info("Updated {$updatedAssignment} cooperations from ASSIGNMENT to PAYMENT.");
}
$this->info('Cooperation statuses updated successfully.');

View File

@ -13,16 +13,14 @@ enum CooperationStatus: int implements HasColor, HasLabel
case PENDING = 1;
case ASSIGNMENT = 2;
case VERIFICATION = 3;
case PAYMENT = 4;
case COMPLETED = 5;
case PAYMENT = 3;
case COMPLETED = 4;
public function getLabel(): ?string
{
return match ($this) {
self::PENDING => 'Menunggu',
self::ASSIGNMENT => 'Media Order',
self::VERIFICATION => 'Verifikasi',
self::PAYMENT => 'Pembayaran',
self::COMPLETED => 'Selesai',
};
@ -33,7 +31,6 @@ public function getColor(): string|array|null
return match ($this) {
self::PENDING => 'warning',
self::ASSIGNMENT => 'info',
self::VERIFICATION => 'primary',
self::PAYMENT => 'slate',
self::COMPLETED => 'success',
};

View File

@ -1,58 +0,0 @@
<?php
namespace App\Filament\Resources\Manage\Cooperations\Actions\Cooperation;
use App\Enums\ApprovalStatus;
use App\Enums\CooperationStatus;
use App\Enums\RoleEnum;
use App\Filament\Support\CheerfulNotification;
use App\Models\Cooperation;
use Filament\Actions\Action;
use Filament\Support\Icons\Heroicon;
class ProceedToPaymentAction extends Action
{
public static function getDefaultName(): ?string
{
return 'proceedToPayment';
}
protected function setUp(): void
{
parent::setUp();
$this->label('Lanjutkan ke Pembayaran')
->icon(Heroicon::OutlinedBanknotes)
->color('success')
->requiresConfirmation()
->modalHeading(fn () => CheerfulNotification::getByKey('cooperation.proceed_to_payment_title'))
->modalDescription(fn () => CheerfulNotification::getByKey('cooperation.proceed_to_payment_desc'))
->action(function (Cooperation $record): void {
$record->update([
'status' => CooperationStatus::PAYMENT,
'payment_date' => now()->toDateString(),
]);
CheerfulNotification::success(
CheerfulNotification::getByKey('cooperation.payment_stage_active'),
CheerfulNotification::getByKey('cooperation.payment_stage_changed_desc')
)->send();
})
->visible(function (Cooperation $record): bool {
$user = auth()->user();
if (! $user || $user->hasRole(RoleEnum::PERUSAHAAN->value) || $record->status !== CooperationStatus::VERIFICATION) {
return false;
}
// Check if all reports are verified (either Accepted or Rejected, not Pending)
$reports = $record->reports;
if ($reports->isEmpty()) {
return true;
}
return $reports->every(fn ($report) => $report->status !== ApprovalStatus::PENDING);
});
}
}

View File

@ -50,7 +50,7 @@ protected function setUp(): void
}
})
->visible(
fn (Report $record): bool => in_array($record->mediaTaskAssignment?->taskAssignment?->cooperation?->status, [CooperationStatus::ASSIGNMENT, CooperationStatus::VERIFICATION]) &&
fn (Report $record): bool => $record->mediaTaskAssignment?->taskAssignment?->cooperation?->status === CooperationStatus::ASSIGNMENT &&
! auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value) &&
$record->status === ApprovalStatus::PENDING
);

View File

@ -62,7 +62,7 @@ protected function setUp(): void
}
})
->visible(
fn (Report $record): bool => in_array($record->mediaTaskAssignment?->taskAssignment?->cooperation?->status, [CooperationStatus::ASSIGNMENT, CooperationStatus::VERIFICATION]) &&
fn (Report $record): bool => $record->mediaTaskAssignment?->taskAssignment?->cooperation?->status === CooperationStatus::ASSIGNMENT &&
! auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value) &&
$record->status === ApprovalStatus::PENDING
)

View File

@ -43,11 +43,11 @@ public function table(Table $table): Table
...RowIndexColumn::make(),
TextColumn::make('start_date')
->label('Mulai')
->label('Tanggal Mulai')
->date('l, d F Y'),
TextColumn::make('end_date')
->label('Selesai')
->label('Tanggal Selesai')
->date('l, d F Y'),
TextColumn::make('task_description')

View File

@ -13,7 +13,6 @@
use App\Filament\Resources\Manage\Cooperations\Actions\Cooperation\AcceptAction;
use App\Filament\Resources\Manage\Cooperations\Actions\Cooperation\CompleteCooperationAction;
use App\Filament\Resources\Manage\Cooperations\Actions\Cooperation\CreateTaskAssignmentAction;
use App\Filament\Resources\Manage\Cooperations\Actions\Cooperation\ProceedToPaymentAction;
use App\Filament\Resources\Manage\Cooperations\Actions\Cooperation\RejectAction;
use App\Filament\Resources\Manage\Cooperations\Actions\Cooperation\SendProposalAction;
use App\Filament\Support\CheerfulNotification;
@ -260,8 +259,6 @@ public static function configure(Table $table): Table
CreateTaskAssignmentAction::make(),
ProceedToPaymentAction::make(),
CompleteCooperationAction::make(),
EditAction::make(),

View File

@ -42,7 +42,6 @@ protected function getData(): array
$colors[] = match ($case) {
CooperationStatus::PENDING => '#F59E0B',
CooperationStatus::ASSIGNMENT => '#3B82F6',
CooperationStatus::VERIFICATION => '#6366F1',
CooperationStatus::PAYMENT => '#8B5CF6',
CooperationStatus::COMPLETED => '#10B981',
};

View File

@ -48,12 +48,6 @@ protected function assignment(Builder $query): void
$query->where('status', CooperationStatus::ASSIGNMENT);
}
#[Scope]
protected function verification(Builder $query): void
{
$query->where('status', CooperationStatus::VERIFICATION);
}
#[Scope]
protected function payment(Builder $query): void
{

View File

@ -3,7 +3,7 @@
use App\Enums\CooperationStatus;
test('cooperation status enum has expected cases', function () {
expect(CooperationStatus::cases())->toHaveCount(5);
expect(CooperationStatus::cases())->toHaveCount(4);
});
test('cooperation status enum labels and colors', function (CooperationStatus $status, string $label, string $color) {
@ -12,7 +12,6 @@
})->with([
[CooperationStatus::PENDING, 'Menunggu', 'warning'],
[CooperationStatus::ASSIGNMENT, 'Media Order', 'info'],
[CooperationStatus::VERIFICATION, 'Verifikasi', 'primary'],
[CooperationStatus::PAYMENT, 'Pembayaran', 'slate'],
[CooperationStatus::COMPLETED, 'Selesai', 'success'],
]);
@ -21,13 +20,12 @@
expect(CooperationStatus::options())->toEqual([
1 => 'Menunggu',
2 => 'Media Order',
3 => 'Verifikasi',
4 => 'Pembayaran',
5 => 'Selesai',
]);
});
test('cooperation status enum values and comment', function () {
expect(CooperationStatus::values())->toEqual([1, 2, 3, 4, 5]);
expect(CooperationStatus::comment())->toBe('1: Menunggu, 2: Media Order, 3: Verifikasi, 4: Pembayaran, 5: Selesai');
expect(CooperationStatus::values())->toEqual([1, 2, 4, 5]);
expect(CooperationStatus::comment())->toBe('1: Menunggu, 2: Media Order, 4: Pembayaran, 5: Selesai');
});