- extensions/skill-hub.ts: skill_search (FTS su frontmatter+body+references), skill_info, skill_sync/commando /skill-sync, iniezione istruzioni via before_agent_start (append al systemPrompt, mai replace) - skills/sap-timesheet: prima skill migrata (SAP CATS timesheet) - distribuzione: pi package (keyword pi-package), install git:git.enne2.net/enne2/pi-skill-hub
4.0 KiB
4.0 KiB
Procedura tecnica — SAP WebGUI CATS via bridge BiDi
Tutto lo stato SAP si legge/scrive tramite il bridge BiDi (127.0.0.1:8787,
header Authorization: Bearer firefox-bidi-local), helper in
scripts/bridge_helper.py. Il modello non legge le immagini: la verità è il DOM.
1. Mappatura griglia (M0:46:2:1)
- Righe: r1 = ore teoriche, r2 = totali (autorevole per verifica), r3.. = righe dati (le "Vuoto" sono placeholder).
- Colonne riga dati:
- c1 TR/marker riga, c0 = colonna di selezione riga (0-based, a sinistra)
- c2 CdC mittente (CATSD-SKOSTL) — auto-compilata da SAP (493)
- c3 CA / area contabile (CATSD-KOKRS) — auto-compilata (EGEO); non digitare
- c4 TdA (CATSD-LSTAR) = ORE (obbligatoria)
- c6 Elemento WBS destinatario (CATSD-RPROJ)
- c7 Tp.A/P (vuoto), c8 UM (CATSD-UNIT) = H
- c9 Totale riga
- Giorni: colonna = 9 + numero del giorno (c10 = giorno 01, c25 = giorno 16…).
- L'header visivo è sfasato rispetto agli ID cella: fidarsi solo di lsdata/SID.
2. Ricetta di scrittura cella (verificata)
scrollIntoView({block:'center', inline:'nearest'})+ 500-600ms; SE il punto resta fuori viewport (x<0 o >1376), trascinare il thumb della hscroll custom (M0:46:2:1_hscroll-hdl) verso il lato giusto e rilleggere il rect. Mai coordinate fuori viewport (HTTP 500 "Move target out of bounds").- Click reale BiDi: pointerMove → pointerDown → pausa 90ms → pointerUp → 450ms.
- Digitazione: Ctrl+A (\ue009 + 'a' + \ue00a) → caratteri uno a uno con pause 110ms → Invio \ue007.
- Se resta aperto il popup "N proposte disponibili" (value-help storico):
confermare con un ulteriore Invio, o cliccare l'item storico
(
M0:46:2:1::<r>:<c>_TALB); in extremis F2 (\ue002) committa. - ATTENZIONE: Invio funziona sulle celle giorno; sulle celle intestazione (TdA/WBS/UM) spesso serve F2. Se dopo la digitazione il display resta vuoto è spesso un artefatto: verificare sulla riga TOTALI (r2) o dopo il click sulla cella successiva (il blur committa).
- Verifica per ogni cella:
tot == attesosulla riga r2 della stessa colonna (con più righe dati, tot = somma: verificare la riga conr.c9dopo re-render, o i totali come somma attesa). - Il display dell'ULTIMA cella modificata spesso legge '' (artefatto): non considerarlo fallimento se i totali tornano.
3. Navigazione
- Easy Access → dblclick preferito "Risorse umane -> Manager's Desktop":
el.dispatchEvent(new MouseEvent('dblclick', {bubbles:true}))sutree#C105#2#1#1#i(il dblclick nativo BiDi clickCount NON funziona). - Sezione Time Sheet: pulsante toolbar "Time Sheet" (cambia contesto Manager desktop).
- View acquisizione: click destro (button 2) sulla riga BENEDETTO
(
tree#C121#1#1#mg, cercare per testo) → voce "Inserimento Time Sheet". - Cambio periodo: pulsanti Videata precedente
M0:46:1::1:46/ Videata successivaM0:46:1::1:49(±1 mese). I campi data (M0:46:1::1:21/34) non accettano key sintetici. - Riga nuova: selezionare la riga di partenza (click su colonna 0, verifica
classe
lsSTTDScSel2BgColor) → menu "..." (toolbar, ~x=965,y=72) → "Copiare riga". Individuare la voce di menu FRESA ad ogni apertura (il menu ricorda lo scroll: coordinate fisse possono centrare "Chiudi applicazione" → vedi errori-noti §3).
4. Salvataggio e verifica
- "Salvare Evidenziato"
M0:50::btn[11]; OK = view chiusa su Manager desktop. - Riaprire la view, riallineare il periodo (Videata precedente/successiva) e rileggere tutta la griglia; riconciliare le somme.
- Attenzione: dopo riapertura il periodo torna al mese corrente.
5. Helper
scripts/bridge_helper.py: ev(expr) eval JS; click_ctx(x,y[,button]);
type_text(text, commit) (Ctrl+A + char-per-char 110ms + commit);
cell_center(r,c) (scrollIntoView + rect); cell_text(r,c); dialogs();
write_cell(r,c,text). Chiavi unicode: Invio \ue007, F2 \ue002, Ctrl \ue009.
Mai inviare value: "" a input.performActions (il bridge rifiuta).