30 lines
2.4 KiB
JavaScript
30 lines
2.4 KiB
JavaScript
import { extractionReview } from '../src/services/extractionReview.js';
|
||
import { verifyAnalysisCitations } from './analysis-citations.mjs';
|
||
import { validateAnalysisShape } from './analysis-schema.mjs';
|
||
import {createHash} from 'node:crypto';
|
||
import {extractBidValidity,extractBidType} from '../src/services/bidTerms.js';
|
||
export function qualifyAnalysis(result,{text='',limit=60000,fileName='',expectedItems=0,repaired=false,extraction}={}) {
|
||
if(!result || typeof result !== 'object' || Array.isArray(result)) throw new Error('Analiz nesne biçiminde değil.');
|
||
const clean={...result};delete clean._outputRepaired;
|
||
if(clean.citations != null && !Array.isArray(clean.citations)) throw new Error('Kaynak alıntıları liste biçiminde değil.');
|
||
const sections={};
|
||
for(const key of ['itemsAndSpecs','documentChecklist','qualificationCriteria','risksAndPenalties','roadmap']) {
|
||
if(clean[key] != null && !Array.isArray(clean[key])) throw new Error(`${key} liste biçiminde değil.`);
|
||
sections[key]=clean[key]?.length ? 'extracted' : 'not_extracted';
|
||
}
|
||
const reading=extractionReview(extraction);
|
||
const source=String(text),issues=[...validateAnalysisShape(clean),...reading.issues];
|
||
if(source.length>limit)issues.push('Kaynak metnin tamamı analiz edilmedi.');
|
||
if(repaired)issues.push('Analiz yanıtı kesildi; yalnız kurtarılabilen alanlar gösteriliyor.');
|
||
if(expectedItems>0 && (clean.itemsAndSpecs?.length || 0)<expectedItems)issues.push(`Kaynakta ${expectedItems} kalem var; analiz listesi daha kısa.`);
|
||
const citations=verifyAnalysisCitations(clean,source.slice(0,limit));
|
||
const bidValidity=extractBidValidity(source.slice(0,limit));
|
||
const bidType=extractBidType(source.slice(0,limit));
|
||
if(bidType.status==='conflict')issues.push('Kaynakta farklı teklif türleri var; karma kapsam veya sürüm farkı kontrol edilmeli.');
|
||
if(bidValidity.status==='conflict')issues.push('Kaynakta farklı teklif geçerlilik süreleri var; ilgili maddeler karşılaştırılmalı.');
|
||
const version=createHash('sha256').update(source).digest('hex');
|
||
return {...clean,procurementTerms:{bidValidity,bidType},sourceEvidence:citations.evidence,documentVersion:version,sourceReview:{status:issues.length?'partial':'review_required',
|
||
extraction:reading.sources,fileName,sourceCharacters:source.length,analyzedCharacters:Math.min(source.length,limit),
|
||
outputRepaired:repaired,sections,issues,unverifiedFindings:citations.missing}};
|
||
}
|