Files
SGF/scripts/sgf-workshop-schedule-http.mjs
T
2026-11-11 09:00:17 +02:00

9 lines
4.2 KiB
JavaScript

import fs from'node:fs';import assert from'node:assert/strict';import{session}from'./sgf-single-http.mjs';
const run=JSON.parse(fs.readFileSync('C:/laragon/data/sgf-tempo/run/modular-regression-current.json')),root=run.root+'/private/receipt-composition-cc50a276c10c',input=JSON.parse(fs.readFileSync(root+'/single-direct-cost.json')),profiles=JSON.parse(fs.readFileSync(root+'/single-profiles.json')).profiles,file=root+'/workshop-schedule-http-20261110.json',progress=fs.existsSync(file)?JSON.parse(fs.readFileSync(file)):{operations:{},checks:[]};const save=()=>fs.writeFileSync(file,JSON.stringify(progress,null,2)),ok=(v,label)=>{assert(v,label);if(!progress.checks.includes(label))progress.checks.push(label);save();};
const manager=await session('sgf:workshop_manage','workshop'),technician=await session('sgf:workshop_record','workshop');let r=await manager.get('/api/workshop-schedule/options?per_page=100');ok(r.status===200,'bounded authorised order options100');const options=await r.json();ok(options.orders.data.some(o=>o.id===input.order&&o.assignment?.technician_id===profiles.workshop_record.user_id),'existing explicitly assigned order selectable');
const step=async(name,data)=>{let op=progress.operations[name];if(!op){op=progress.operations[name]={key:crypto.randomUUID(),data};save();}assert.deepEqual(op.data,data);if(op.result)return op.result;const p=await manager.command('/api/workshop-schedule/preview',data,op.key);assert.equal(p.status,200,name+JSON.stringify(p.value));const result=await manager.command('/api/workshop-schedule/confirm',{preview:p.value.preview});assert.equal(result.status,200,name+JSON.stringify(result.value));op.result=result.value;save();return result.value;};
progress.bookingKey??=crypto.randomUUID();save();const data={action:'book',booking_key:progress.bookingKey,version:0,order_id:input.order,technician_id:profiles.workshop_record.user_id,starts_at:'2026-11-12T09:00:00+02:00',ends_at:'2026-11-12T10:00:00+02:00',reason:'Agendamento QA da ordem existente, sem autorizar trabalho ou enviar mensagens.'};const booked=await step('book',data);ok(booked.version===1,'one actual appointment confirmed on8085');const moved=await step('reschedule',{...data,action:'reschedule',version:1,starts_at:'2026-11-12T10:00:00+02:00',ends_at:'2026-11-12T11:00:00+02:00',reason:'Reagendamento explícito com disponibilidade novamente conferida.'});ok(moved.version===2,'reschedule retained as version2');
r=await manager.get('/api/workshop-schedule?from=2026-11-12&to=2026-11-12&per_page=25');ok(r.status===200,'calendar page25 reads same current appointment');let list=await r.json();ok(list.bookings.data.some(b=>b.booking_key===data.booking_key&&b.version===2),'calendar projects latest version rather than duplicate appointments');r=await manager.get('/api/workshop-schedule/'+data.booking_key+'/history');ok(r.status===200,'audit history accessible');const history=await r.json();ok(history.events.data.length===2&&history.events.data.every(e=>e.reason&&e.actor_id),'history retains both reasons and authors');
r=await technician.get('/api/workshop-schedule?from=2026-11-12&to=2026-11-12&per_page=100');ok(r.status===200,'assigned technician can read scoped calendar');const view=await r.json();ok(view.bookings.data.some(b=>b.booking_key===data.booking_key)&&!view.can_manage,'technician sees appointment without scheduling authority');const denied=await technician.command('/api/workshop-schedule/preview',{...data,booking_key:crypto.randomUUID()});ok(denied.status===403,'technician scheduling write403');
const finance=await session('sgf:finance_prepare','finance');r=await finance.get('/api/workshop-schedule?from=2026-11-12&to=2026-11-12');ok(r.status===409,'wrong module requires explicit context change');await r.text();const accounting=await session('sgf:accounting_prepare','accounting');r=await accounting.get('/api/general-ledger');ok(r.status===200,'existing accounting remains readable');const ledger=await r.json();ok(ledger.journals.length===18,'schedule creates zero additional journals');progress.passed=true;progress.browser_visual_review=false;progress.new_rights=0;progress.external_messages=0;save();console.log(JSON.stringify({passed:true,checks:progress.checks.length,proof:file}));