Files
pi-skill-hub/skills/sap-timesheet/references/procedura-tecnica.md
T
enne2 551b5f3611 feat: skill hub — distribuzione skill via Gitea, indicizzazione e ricerca
- 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
2026-09-24 12:15:27 +02:00

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)

  1. 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").
  2. Click reale BiDi: pointerMove → pointerDown → pausa 90ms → pointerUp → 450ms.
  3. Digitazione: Ctrl+A (\ue009 + 'a' + \ue00a) → caratteri uno a uno con pause 110ms → Invio \ue007.
  4. 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.
  5. 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).
  6. Verifica per ogni cella: tot == atteso sulla riga r2 della stessa colonna (con più righe dati, tot = somma: verificare la riga con r.c9 dopo re-render, o i totali come somma attesa).
  7. 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})) su tree#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 successiva M0: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).