fix: 견적 선택 다이얼로그에서 수주 전환된 견적 제외

- QuoteIndexRequest: for_order 파라미터 추가
- Quote 모델: orders() HasMany 관계 추가 (Order.quote_id 기준)
- QuoteService: for_order 필터링 로직 추가
  - whereNull('order_id') - 빠른 체크
  - whereDoesntHave('orders') - 이중 체크
- OrderService: 수주 생성 시 견적 상태를 converted로 업데이트

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-01-15 16:13:17 +09:00
parent 566f34a4c9
commit f9fa7cfd1e
4 changed files with 45 additions and 3 deletions

View File

@@ -26,11 +26,21 @@ public function index(array $params)
$clientId = $params['client_id'] ?? null;
$dateFrom = $params['date_from'] ?? null;
$dateTo = $params['date_to'] ?? null;
$forWorkOrder = filter_var($params['for_work_order'] ?? false, FILTER_VALIDATE_BOOLEAN);
$query = Order::query()
->where('tenant_id', $tenantId)
->with(['client:id,name', 'items', 'quote:id,quote_number']);
// 작업지시 생성 가능한 수주만 필터링
if ($forWorkOrder) {
// 1. DRAFT(등록) 상태만 (생산지시 전)
$query->where('status_code', Order::STATUS_DRAFT);
// 2. 작업지시가 아직 없는 수주만
$query->whereDoesntHave('workOrders');
}
// 검색어 (수주번호, 현장명, 거래처명)
if ($q !== '') {
$query->where(function ($qq) use ($q) {
@@ -40,8 +50,8 @@ public function index(array $params)
});
}
// 상태 필터
if ($status !== null) {
// 상태 필터 (for_work_order와 함께 사용시 무시)
if ($status !== null && ! $forWorkOrder) {
$query->where('status_code', $status);
}
@@ -393,6 +403,13 @@ public function createFromQuote(int $quoteId, array $data = [])
$order->refresh();
$order->recalculateTotals()->save();
// 견적 상태를 '수주전환완료'로 변경
$quote->update([
'status' => Quote::STATUS_CONVERTED,
'order_id' => $order->id,
'updated_by' => $userId,
]);
return $order->load(['client:id,name', 'items', 'quote:id,quote_number']);
});
}