caterium-app/public/core/server-automation-v1770.js
pavlov346346-source f8bb0a78b4
Caterium v17.7.0 — architecture foundation
Introduce the first data layer, move order auto-completion to server cron with legacy/cloud compatibility, clean error telemetry, update PWA/versioning, and add regression coverage.
2026-09-08 13:24:34 +03:00

49 lines
2.7 KiB
JavaScript

(()=>{
'use strict';
if(window.CateriumServerAutomationV1770)return;
const VERSION='17.7.0';
const RELEASE='20260908-v17-7-0-architecture-foundation';
const POLL_MS=60000;
let timer=0,running=false,lastRunAt=0,lastResult=null;
const data=()=>window.CateriumDataV1770||window.CateriumData||null;
const cloud=()=>window.SunCloudV2||null;
const toast=text=>{try{window.SunEnterprise?.toast?.(text,'success',4200)}catch(_){}};
function ready(){
const d=data(),c=cloud();
if(!d||!c?.getClient?.()||!c?.getSession?.()?.user||!c?.getWorkspace?.()?.id)return false;
if(d.isSupportReadOnly?.())return false;
return true;
}
async function run({quiet=true,force=false}={}){
if(running||!ready())return lastResult;
if(!force&&Date.now()-lastRunAt<15000)return lastResult;
running=true;lastRunAt=Date.now();
try{
const c=cloud(),workspace=c.getWorkspace(),client=c.getClient();
const result=await data().diagnostics.measure('server-order-automation',async()=>{
const r=await client.rpc('sun_run_order_automation',{p_workspace:workspace.id});if(r.error)throw r.error;return r.data||{};
});
lastResult=result;
const changed=Number(result?.changed||0),orders=Array.isArray(result?.orders)?result.orders:[];
if(changed&&orders.length){
data().orders.applyServerChanges(orders,{reason:'server-auto-complete'});
if(!quiet)toast(changed===1?'Заказ автоматически завершён сервером.':`${changed} заказа автоматически завершены сервером.`);
}
try{window.dispatchEvent(new CustomEvent('caterium:server-automation',{detail:{...result,version:VERSION}}))}catch(_){}
return result;
}catch(error){
if(!/failed to fetch|network|timeout/i.test(String(error?.message||error)))console.warn('[Caterium server automation]',error?.message||error);
return null;
}finally{running=false}
}
function start(){if(timer)return;run({quiet:true,force:true});timer=setInterval(()=>{if(!document.hidden)run({quiet:true})},POLL_MS)}
function stop(){if(timer){clearInterval(timer);timer=0}}
window.addEventListener('focus',()=>run({quiet:false,force:true}));
document.addEventListener('visibilitychange',()=>{if(!document.hidden)run({quiet:true,force:true})});
window.addEventListener('sun:cloud-state-applied',()=>setTimeout(()=>run({quiet:true,force:true}),300));
window.addEventListener('caterium:data-ready',start);
window.CateriumServerAutomationV1770={VERSION,RELEASE,POLL_MS,enabled:true,run,start,stop,checks:()=>({version:VERSION,running,lastRunAt,lastResult,ready:ready()})};
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',start,{once:true});else start();
})();