SELECT s.id as supp_id, s.type, d.id as doc_id, d.filename, d.elements_json
FROM supplements s
JOIN documents d ON s.document_id = d.id
WHERE s.contract_id =
AND d.elements_json IS NOT NULL
ORDER BY s.created_at
data: #serializeJSON({type:"error",message:"Нет распарсенных файлов"})#
SELECT name_hash, name, price, qty, sum, date_start
FROM spec_current
WHERE contract_id =
ORDER BY name
data: #serializeJSON({type:"extract_start",supplement_id:sid,filename:supps.filename})#
data: #serializeJSON({type:"extract_error",supplement_id:sid,filename:supps.filename,error:"LLM HTTP #cfhttp.statusCode#",time_s:elapsed})#
data: #serializeJSON({type:"llm_done",supplement_id:sid,filename:supps.filename,ops_count:arrayLen(ops),mode:mode,time_s:elapsed})#
data: #serializeJSON({type:"applied",supplement_id:sid,summary:applyResult.summary})#
data: #serializeJSON({type:"apply_error",supplement_id:sid,error:structKeyExists(applyResult,'error')?applyResult.error:'unknown'})#
data: #serializeJSON({type:"apply_error",supplement_id:sid,error:"apply HTTP #cfhttp.statusCode#"})#
data: #serializeJSON({type:"extract_error",supplement_id:sid,filename:supps.filename,error:"JSON parse: " & cfcatch.message,time_s:elapsed})#
data: #serializeJSON({type:"done",total_time_s:totalTime,total_unresolved:totalUnresolved})#
data: #serializeJSON({type:"error",message:cfcatch.message,detail:cfcatch.detail})#