diff --git a/src/components/TeklifAsistani.jsx b/src/components/TeklifAsistani.jsx index 93ff653..011ce24 100644 --- a/src/components/TeklifAsistani.jsx +++ b/src/components/TeklifAsistani.jsx @@ -1,5 +1,5 @@ import { AiJobHistory } from './AiJobHistory'; -import { validateOfferResponse } from '../services/offerResponse'; +import { draftReviewLabel, validateOfferResponse } from '../services/offerResponse'; import React, { useState, useRef, useEffect } from 'react'; import { MessageSquareText, ClipboardCheck, PenLine, Loader2, Copy, Upload } from 'lucide-react'; import { getToken } from '../services/auth'; @@ -180,8 +180,8 @@ const OfferAssistantSession = ({ tender }) => { {bolumler.length > 0 && } {bolumler.length > 0 && draftSource !== metin &&

Kaynak değişti. Aşağıdaki taslak önceki kaynakla üretildi; düzenlemeleriniz korundu. Yeni kaynakla karşılaştırın veya yeniden üretin.

} - {draftReview &&
-

{draftReview.status === 'partial' ? 'Kısmi taslak — bölüm kontrolü gerekli' : 'Taslak — kullanıcı kontrolü gerekli'}

+ {draftReview &&
+

{draftReviewLabel(draftReview)}

{draftReview.note}

{draftReview.missingSections?.length > 0 &&

Modelin tamamlamadığı bölümler: {draftReview.missingSections.join(', ')}. Aşağıdaki DOLDURUN alanlarını düzenleyin.

} {draftReview.extraSections?.length > 0 &&

İstenen başlıklara eşleşmeyen ek bölümler: {draftReview.extraSections.join(', ')}.

} diff --git a/src/services/offerResponse.js b/src/services/offerResponse.js index 65e8486..5281241 100644 --- a/src/services/offerResponse.js +++ b/src/services/offerResponse.js @@ -2,6 +2,11 @@ const object = value => value !== null && typeof value === 'object' && !Array.is const text = value => typeof value === 'string'; const texts = value => Array.isArray(value) && value.every(text); const optionalText = value => value == null || text(value); +export function draftReviewLabel(review) { + return review?.status === 'partial' + ? 'EKSİK TASLAK — TEKLİF OLARAK KULLANILAMAZ' + : 'Taslak — kullanıcı kontrolü gerekli'; +} export function validateOfferResponse(url, data) { let valid = object(data) && data.success === true; if (valid && url === '/api/ai/belge-sor') { diff --git a/tests/offer-response.test.mjs b/tests/offer-response.test.mjs index bdf84d0..0084234 100644 --- a/tests/offer-response.test.mjs +++ b/tests/offer-response.test.mjs @@ -1,6 +1,6 @@ import {test} from 'node:test'; import assert from 'node:assert/strict'; -import {validateOfferResponse} from '../src/services/offerResponse.js'; +import {draftReviewLabel,validateOfferResponse} from '../src/services/offerResponse.js'; import {qualifyOfferDraft} from '../server/offer-draft.mjs'; import {qualifyOfferAudit} from '../server/offer-audit.mjs'; import {qualifyQuestionAnswer} from '../server/document-question.mjs'; @@ -16,3 +16,7 @@ test('nested fields that would crash the view are rejected at the boundary',()=> ['teklif-denetim',{maddeler:[{gereklilik:'Numune',durum:'unexpected'}],eksikler:[],uyum_yuzde:100,belirsizSayisi:0}], ['teklif-taslak',{bolumler:[{baslik:'Kapak',icerik:{text:'invalid'}}]}]]) assert.throws(()=>validateOfferResponse('/api/ai/'+url,{success:true,...data}),/beklenen biçimde/); }); +test('partial draft output carries an explicit non-official offer warning',()=>{ + assert.equal(draftReviewLabel({status:'partial'}),'EKSİK TASLAK — TEKLİF OLARAK KULLANILAMAZ'); + assert.equal(draftReviewLabel({status:'draft'}),'Taslak — kullanıcı kontrolü gerekli'); +});