VM Wolf — Projekto Žemėlapis
OpenWolf žinių valdymo sistema
🕸 Grafas ← Grįžti į VM
Paskutinis atnaujinimas: ← skaityti faile

VM Projekto Cerebrum — Gyvas Žinių Žemėlapis

> [!info] Apie šį failą

> Tai gyvas projekto žinių žemėlapis. Kiekvieną sesiją Claude automatiškai atnaujina šį failą.

> Skaityti prieš rašant bet kokį kodą. Žr. [[anatomy]] failų struktūrai.

Paskutinis atnaujinimas: 2026-10-16

⚠️ KRITINĖ PASTABA — lygiagretūs/negyvi kodo keliai index.html Gamybos ekrane

Prieš liečiant „Gamyba“/„Gavimai“ ekranus, PATIKRINK switchTab(tabName) (~3191 eil.) dispatch'erį, kad žinotum, kuris variantas TIKRAI pasiekiamas:

  • GYVAS (pasiekiamas iš šoninio meniu „Gamyba“): switchTab('gaminama') → fetchProductionData() → filterByTipas(tipas) (~2448 eil.: visi/paketeliai/pauchai/stickai/gavimai/rezervacija/maisomi) → renderProductionRows() / renderGaminamaGavimaiLentele() / renderRezervacijaWidescreen() / renderMaisomiGaminamoje().
  • NEGYVAS/nepasiekiamas iš šoninio meniu: switchTab('gamyba') → renderGamybaTab() → _renderGamybaLangas() (~4050 eil.) — joks šoninio meniu mygtukas nesiunčia tabName='gamyba' (tikrasis naudoja 'gaminama').
  • Panašiai — DU „Gavimai“: _zpRender() (~6972 eil., „Žaliavų gavimai ir partijos" — žaliavų LOT/EXP) vs (iki 2026-09-08) renderGaminamaGavimaiLentele() (TIKRASIS per filterByTipas('gavimai') — gamybos kortelių plėvelės/dėžučių statusas). Skirtinga paskirtis, abu turi „Gavimai" pavadinime.
  • ⚠️ ATNAUJINTA 2026-09-08 — „Gavimai" nebe pod-tabas filterByTipas() viduje: dabar SAVAS top-level šoninio meniu punktas → switchTab('gavimai') (~3444 eil.) → renderGavimaiTab() (~2618 eil.). Senas filterByTipas('gavimai') iškvietimas paliktas kaip suderinamumo peradresavimas (~2489 eil.: if (tipas==='gavimai') { switchTab('gavimai'); return; }), TODĖL _tipHelp.gavimai pagalbos tekstas (~2483 eil.) šiuo momentu NEBEPASIEKIAMAS (grąžinama anksčiau nei _applyTipHelp() iškviečiamas). Sena renderGaminamaGavimaiLentele() funkcija (~2570 eil.) irgi liko kode kaip plonas renderGavimaiTab() wrapperis, bet JOS PAČIOS niekas nebekviečia (0 iškvietimo vietų) — našlaitė po refaktoringo, dar netrinta.
  • Rasta 2026-07-29 (task #63/#65) — Agy ir Claude iš pradžių pridėjo pagalbos ženkliuką į NEGYVĄ _renderGamybaLangas(), kuris niekada nepasirodydavo vartotojui. Prieš tvirtinant „X ekranas patikrintas" — visada patikrinti per REALŲ navigacijos kelią (switchTab/filterByTipas), ne vien grep'u rastą panašiai pavadintą funkciją.

    ⚠️ ATNAUJINTA 2026-07-29 (bandant #67 švarinimą) — REALYBĖ SUDĖTINGESNĖ, NEI ATRODĖ, NETRINTI SKUBOTAI:

    renderGamybaTab()/_renderGamybaLangas() turi 21 iškvietimo vietą index.html, ne tik vieną negyvą įėjimo tašką. Bandžiau (Claude) šią užduotį atlikti pati (vartotojui nebuvo prie kompiuterio), bet RADAU, kad dauguma iškvietimų yra išsibarstę po korteles-veiksmų handlerius (ištrynimas, PALAIDI perjungimas, „Pradėti gamybą" ir pan.) kaip atgalinio atnaujinimo (refresh) šalutinis efektas, ne tik pati navigacija — todėl NENUTRAUKIAU darbo be pilno kiekvienos vietos patikrinimo:
  • Saugiai negyva (tinkamai apsaugota if (activeSidebarTab === 'gamyba'), kuri REALYBĖJE niekada netampa true, nes joks mygtukas nesiunčia 'gamyba'): pvz. ~5041-5042 eil.
  • ✅ IŠTAISYTA 2026-07-29: ~5132 eil. (kortelės ištrynimo handleris) klaidingai tikrino activeSidebarTab === 'gaminama' (TIKRĄJĮ, gyvą tabo pavadinimą!) vietoj 'gamyba' — todėl ištrynus kortelę GYVAME Gaminama ekrane, šis kodas TIKRAI suveikdavo ir perrašydavo konteinerį negyvo _renderGamybaLangas() turiniu. Pašalintas visas nereikalingas blokas (žr. 3 punktą žemiau).
  • ⚠️ DAR NEIŠTAISYTA — reikia tolimesnio darbo: ~5068 eil. (pradėti-gamyba sėkmės handleris) BE JOKIOS SĄLYGOS kviečia _renderGamybaLangas(...) po fetchProductionData() — vykdoma VISADA, nepriklausomai nuo activeSidebarTab. Nepatikrinau realiu naršyklės testu, ar tai realiai matomas glitch, ar praktiškai nekenksminga (galbūt kitas re-render iškart perrašo). Prieš keičiant — būtina realiai naršyklėje patikrinti (paspausti „Pradėti gamybą" gyvame ekrane, stebėti ar kortelių sąrašas trumpam „šoktels"/pasikeičia į kitą išvaizdą).
  • Iš viso liko ~19 kitų iškvietimo vietų nepatikrintų individualiai — KIEKVIENĄ reikia patikrinti atskirai (ar guard'as teisingas, ar iškvietimas besąlyginis) prieš darant bet kokį trynimą. Tai NĖRA vienos eilutės pakeitimas — planuok atskirą sesiją SU vartotoju prie kompiuterio, kad būtų galima iškart patikrinti kiekvieną pakeitimą realiame naudojime.
  • Pamoka: net kai dispatch'erio lygyje kelias atrodo aiškiai „negyvas", pagalbinės/refresh funkcijos gali JĮ VIS TIEK iškviesti iš kitų, gyvų vietų kaip šalutinį veiksmą — visada grep -c VISŲ iškvietimų PRIEŠ sprendžiant, ar saugu trinti, ne tik pagrindinio navigacijos kelio.
  • ✅ IŠSPRĘSTA 2026-08-28 — _renderGamybaLangas/renderGamybaTab (~730 eil., 8 funkcijos) pilnai išvalyta BE vartotojo prie kompiuterio (call-graph analizė + gyvas Orca testas užteko). Rasti ir pataisyti 6 REALŪS bug'ai: gyvi veiksmai (Pradėti/Baigti gamybą, greitas registravimas, pouch/gavimų atnaujinimas, Maišomi „← Atgal") kviesdavo negyvą render'į kaip atnaujinimo žingsnį — ekranas trumpam blykstelėdavo senu išdėstymu. Detaliai → atmintis negyvo-kodo-valymas-20260828. Mažas likutis (openPakuoteModal) dar nepatikrintas.
  • 2026-08-31 → 09-02 sesija — maišymo registravimo fix'ai, Telegram pranešimų pilnas padengimas, etikečių puslapių lūžio bug'as (5 vietos), g/mg recepto laukai, važtaraščio spausdinimo popieriaus dydis, Priimti modalo auto-užsakovas, mobili „Visos partijos", plėvelės/dėžutės substring bug'as

    „Maišymo kortelė" (spausdinimo) lango registravimo laukelis atstatytas — senas commit'as (0fafed8, „B&W" perdarymas) pašalino „Registruoti maišymą" (bazė+kg+„+ Pridėti") bloką iš openGamybosKorteleGeneratorModal šablono, bet JS funkcijos (gkRegistruoti, gkCalcMaisymas) liko kode nenaudojamos ~mėnesį. Vartotojo prašymu grąžinta — dabar registruoti galima ir iš spausdinimo lango (ne tik iš atskiro violetinio „Registruoti maišymą" mygtuko).

    ⚠️ PAKEISTA 2026-09-08 — šis bloko atstatymas vėl pašalintas (žr. „2026-09-08 sesija" žemiau) — pasirodė, kad tai buvo dubliuota UI su TA PAČIA /registruoti-maisyma endpoint'a, kurią jau turi pilnas „Maišomi" vaizdas, ir kad dubliavimas buvo pagrindinė priežastis, kodėl spausdinimo modalo dešinė kolona atrodydavo sugrūsta.

    _gmCalc() (Registruoti maišymą modalo skaičiuoklė) tuščia sudėties lentelė — funkcija skaitė bare _gamybaCardId (module-scope let, priklauso „Gamyba" sąrašo kontekstui), o modalas nustatydavo window._gamybaCardId (VISAI KITAS kintamasis, dėl JS window.X= vs let X nesusijungimo). Atidarius modalą iš „⚗ Maišomi" sąrašo (naudoja _ginMaisomiCardId), abu esami kintamieji likdavo null → tuščia formulė. Fix: naujas dedikuotas window._gmActiveCardId, naudojamas visur nuosekliai.

    /registruoti-maisyma (server.js) — TIKRAS registravimo bug'as, ne tik spausdinimo — endpoint'as skaičiavo sudėtį TIK iš ingredientai lentelės (PocketBase recepto_sudetis fallback tik jei VISIŠKAI tuščia) — receptams su sudėtimi IŠSKAIDYTA per abias lenteles (VENOLEGS, MAGNESIUM CITRATE ir kt.) pasirinkus bazinę žaliavą, kurios ingredientai lentelėje nebuvo, registravimas grįždavo klaidą „Pasirinkta bazinė žaliava nėra šio recepto ingredientas." Fix: getMergedIngredientai() (ta pati funkcija, kurią jau naudoja spausdinama kortelė nuo 2026-08-04) — patikrinta realiu MAGNESIUM CITRATE maišymu, visos 4 žaliavos (ne tik 2) teisingai nurašytos.

    Telegram pranešimai — pilnas padengimas — anksčiau (2026-08-25) pridėta tik 4 gavimų endpoint'ams + STAKLĖS/SUPAKUOTA/MAIŠYMAS/IŠVEŽTA. Rasta ir pataisyta: /api/mobilus/priimti (REALUS endpoint'as, kurį mobili app naudoja žaliavos priėmimui — visiškai neturėjo pranešimo, nepaisant to, kad /priimti-medziagas jau turėjo), registruoti-pouch, registruoti-pagaminta, regionai/:rid/registruoti-supakavima, baigti-gamyba/:id, grazinti-zaliava/:id. Nauja POUCH šaka telegram-bot.js informuotiKitus(). Visos patikrintos realiais testiniais registravimais + iškart atšauktos DB.

    Etikečių spausdinimo „kas antras lapas tuščias" (telefonas) / „suspausta" (kompas) — TIKRA priežastis rasta ir pataisyta 5 vietose —

    (nulinio aukščio, page-break-after:always) KAIP CSS Grid elementas viduje bendro .grid — Chromium spausdinimo variklis tokį žymeklį atvaizduoja SAVO atskirame tuščiame puslapyje prieš patį lūžį (Playwright/PDF kelias) arba bando visą turinį sugrūsti (naršyklės window.print() kelias) — patvirtinta: 3 prašyti lapai → realiai 5 puslapiai (real/tuščias/real/tuščias/real). Fix: kiekvienas lapas — ATSKIRAS .grid konteineris su break-before:page ant konteinerio (ne vidinio žymeklio). Pataisyta: /api/gamybos-korteles/:id/etiketes-html, /api/etiketes-laisvos, NUTRIOTECA dėžių etiketės, /api/spausdinti-hydraw, desktop generateAndPrintLabels(). Patikrinta realiu PDF puslapių skaičiumi (pdf-parse v2 PDFParse klasė) po kiekvieno fix'o.

    Važtaraščio spausdinimas „susigrūdęs mažame plote" — patikrinta: pats HTML/CSS generavimas (vzBuildVaztarastisHtml) TEISINGAS (atkurta realaus važtaraščio VM-20260902 spausdinimo HTML per Orca, atvaizduota — pilnas pločio, teisinga struktūra). Tikra priežastis: /api/mobilus/print SumatraPDF komanda (-print-to ... -silent) NEnurodydavo popieriaus dydžio eksplicitiškai — tas pats spausdintuvas naudojamas IR etiketėms/HYDRAW/NUTRIOTECA, todėl ankstesnio darbo popieriaus dydis „nutekėdavo" kaip numatytasis kitam darbui. Fix: -print-settings "paper=A4,noscale" ant kiekvieno spausdinimo. Realus testinis spausdinimas išsiųstas ir patvirtintas.

    „Greitas išsiuntimas" (▸ Klientas pasiėmė pats) niekada nepasirodydavo IŠSIŲSTA juostoje — /api/greitas-issiuntimas teisingai rašydavo į vaztarasciai+isvezimai, bet NIEKADA į gamybos_zurnalas — o kortelių sąrašo „IŠSIŲSTA" juosta (isvezta_zurnalas laukas) skaičiuojama IŠIMTINAI iš gamybos_zurnalas įrašų su veiksmu IŠVEŽ/ISVEZ/IŠSIUN, LOT+pavadinimo atitikimu — VISAI KITAS šaltinis nei isvezimai SUM (isvezta_kiekis, naudojamas tik važtaraščio formoje likučiui skaičiuoti). Fix: endpoint'as dabar taip pat rašo gamybos_zurnalas eilutę + notifyTelegram. Atgaline data pataisyti 2 realūs vartotojo įrašai (DS/True electrolytes 1700 vnt., AR/„Ra" 300 vnt.) — surasti per pilną vaztarasciai paiešką pagal payload LIKE '%"greitas":true%', ne spėjant iš vartotojo teksto. Įrašyta atmintyje [[feedback_parallel_implementations_drift]] kaip trečias pavyzdys.

    Recepto redagavimas — g/mg abipusiai sinchronizuoti laukeliai — vartotojo prašymu prie kiekvieno ingrediento normos (ir prie „Pridėti ingredientą" formos) pridėtas antras laukelis miligramais šalia gramų — įvedus BET KURIAME, kitas automatiškai perskaičiuojamas (_ingrSyncGMg(), identiška funkcija index.html ir mobile.html). Backend'as nekeistas — visada skaito jau sinchronizuotą gramų lauką. Mobiliam eilutė sukrauta DVIEM eilutėm (ne vienoje flex), kad netilptų kaip senas b9f020d bug'as.

    „Priimti" modalas — automatinis žinomo užsakovo rodymas — desktop „Pakuotės" tab anksčiau VISIŠKAI paslėpdavo „Užsakovas" lauką, kai pasirinktas esamas produktas (užsakovas jau žinomas iš kortelės, bet niekur nerodomas — vartotojas nesuprasdavo, ar reikia jį vėl rinktis). Fix: laukas dabar RODOMAS, bet užpildytas ir disabled (informacinis) — redaguojamas lieka TIK naujam produktui. Mobile gavAC() turėjo tą pačią auto-parinkimo logiką (gavSetKlientas) TIK zaliava tipui — išplėsta ir dezutes/pouch tipams.

    PLĖVELĖ/DĖŽUTĖS kiekis — substring atitikimas rodydavo padvigubintus/patrigubintus gavimo įrašus (naujas [[feedback_veiksmas_string_matching_drift]] pavyzdys) — _gavimoEntriesFor/_mobGavimoEntriesFor (index.html IR mobile.html, dubliuota logika) filtravo gamybos_zurnalas įrašus per v.includes('plėvel')/v.includes('dėžut') — bet statuso žymekliai „Statusas → VYKDOMA (gauta plėvelė ir dėžutės)" bei „Auto-sukurta nauja gamybos kortelė (plėvelės registravimas)" TAIP PAT turi tuos žodžius, nors jų kiekis=0 ir jie nėra realūs gavimai. Substring paieška juos klaidingai įtraukdavo kaip papildomas „+0 vnt." eilutes (vartotojo pastaba 2026-08-31: MAGNESIUM CITRATE rodė 3 plėvelės įrašus vietoj 1). Fix abiejose vietose: tiksli atitiktis (v === 'gauta plėvelė', v === 'gauta dėžutės' arba v.startsWith('gauta dėžutės (')) vietoj .includes().

    Mobili „Visos partijos" (nauja MORE_TILES plytelė) — mobile.html anksčiau turėjo tik „Žaliavų likučiai" (sugrupuota PAGAL ŽALIAVĄ, rikiuota pagal EXP). Pridėtas desktop renderZaliavosTab() „Visos partijos" pod-tabo atitikmuo: loadVisosPartijos()/renderVisosPartijos()/_vpRenderBody() — vienas plokščias chronologinis (pagal gavimo datą) VISŲ partijų sąrašas su paieška + būsenos filtrais (Aktyvi/Sunaudota/Visos), naudoja TĄ PATĮ /api/zaliavu-partijos endpoint'ą kaip desktop. Naujas nav route navigate('visos-partijos'). Rezervuota/Laisva stulpelių (desktop turi, per Rezervacija & MRP duomenis) sąmoningai NĖRA — paprastesnė v1.

    Claude Code plugin'ai — patikrinta: realiai įjungti (globaliai) tik 3 (claude-hud, obsidian-skills, wmux-claude-integration); claude-hud 104 commit'ų atsilikęs, wmux 1299 (!) commit'ų atsilikęs nuo GitHub. Vartotojo prašymu VM projektui (C:\VM\.claude\settings.json) papildomai įjungta engineering-skills + engineering-advanced-skills (jau buvo atsisiųsti kitam projektui S:\, dabar veikia ir čia) — SQL/DB schema, API design review, Playwright, dependency/env-secrets audit, ship-gate pre-production checklist.

    2026-08-25 → 08-29 sesija — mobili gamybos užbaigimo+recepto redagavimas, etikečių/važtaraščio PDF fix'ai, Telegram gavimų pranešimai, Google Drive backup automatizacija

    Etikečių spausdinimo tušti puslapiai (fix) — /api/mobile/print (server.js) PDF generavimas ignoravo etikečių HTML pačios @page{margin:8mm} taisyklę, priverstinai naudodavo 12mm/15mm — 24-etikečių grid'as (280mm) nebetildavo į sumažintą 273mm vietą, kiekviena „lapo" paskutinė eilutė persikeldavo į naują puslapį DAR PRIEŠ numatytą lūžį. Fix: preferCSSPageSize: true.

    Mobiliai pridėti gamybos užbaigimo mygtukai — anksčiau mobile.html leido TIK registruoti kiekius (staklės/pakavimas), neturėjo būdo pažymėti „baigta" ar archyvuoti (tai buvo tik desktop'e). Pridėti mygtukai kortelės detalių sheet'e, naudoja jau veikiančius endpoint'us (baigti-stakles, baigti-pakavima, archyvuoti).

    Mobiliai pridėtas PILNAS recepto redagavimas — naujas ekranas (navigate('recepto-redagavimas')): pavadinimas/klientas/svoris/pakuotės tipas/pastabos, pakavimo skaičiai (pak./dėžutė × dėžutės/dėžė = pak./dėžė auto-chain, kaip desktop'o _pqUpdateChain), IR sudėtis (ingredientų normos redagavimas/pridėjimas/šalinimas). Naudoja /api/receptai/:id, /api/recepto-sudetis — jokios naujos backend logikos. Paskata: MAGNESIUM CITRATE dez_dezeje klaida (22 vietoj 28) — vartotojas negalėjo pats pasitaisyti iš telefono.

    Telegram pranešimai apie gavimų registravimą — anksčiau notifyTelegram() veikė TIK Maišymui/STAKLĖMS/SUPAKUOTA/IŠVEŽTA, gavimų registravimas (4 endpoint'ai: /priimti-medziagas, /registruoti-gavima, /gavimai/bulk, /papildyti-zaliava/:id) apskritai neturėjo pranešimų. Pridėta nauja GAVIMAS Į SANDĖLĮ pranešimo šaka (LOT/EXP/vienetas). Patikrinta REALIU gavimu — pranešimas atėjo į telefoną.

    Važtaraščio PDF — pasirenkamas vieno produkto palečių sutraukimas — kiekviena paletė gaudavo savo pilną lentelę su antrašte, net kai kelios iš eilės turėjo tą patį produktą (20 tokių palečių = 3 puslapiai). Pridėtas žymimasis langelis (default išjungtas, esamas GAS formatas nekinta): (1) tas pats produktas+LOT+EXP → viena bendra lentelė vietoj N, kiekviena paletė — sava eilutė su pilna info; (2) TIKSLIAI tas pats kiekis → susilieja į vieną eilutę su paletžių intervalu (Nr. 1-19). Patikrinta realiais PDF testais per /api/generuoti-pdf.

    Instaliatoriaus perkompiliavimas — installer-build/app-staging/ atnaujintas su visu šios sesijos kodu + šviežiu DB snapshot'u, VM-Gamyba-Setup.exe (226MB) perkompiliuotas. Skirtas kompiuterio B (atsarginio serverio) diegimui — žr. project_antradienio_uzduotys_20260901.md.

    Google Drive automatinis backup — rclone (C:\Users\justa\tools\rclone\...\rclone.exe) su „gdrive:" remote (Google OAuth patvirtinta per naršyklę 2026-08-28). Naujas Scripts\backup-to-drive.ps1 + Scheduled Task VM-DriveBackup (kasdien 21:00, be admin teisių) — VACUUM INTO snapshot → gdrive:VM DB Backupai/VM_DB_backup_.db, rotacija 14 kopijų. PowerShell gotcha: rclone NOTICE (stderr) eilučių NIEKADA neredirektinti su 2> kartu su $ErrorActionPreference="Stop" — PS 5.1 tada suvynioja į terminuojantį NativeCommandError net kai exit code=0, sustabdo visą skriptą. Sprendimas: nenaudoti 2> ant native exe stderr apskritai.

    .claude/skills/orca-cli/SKILL.md pataisytas — buvo pasenęs (2026-08-11), teigė kad embedded naršyklė nepatikima (atšaukta 08-14) ir naudojo seną @e1 sintaksę vietoj dabartinės --element --json.

    Pridėtas .claude/skills/pdf/ iš oficialaus anthropics/skills GitHub repo (.claude/ gitignore'intas, projekto git nepaliečia). Priklauso nuo Python bibliotekų (pypdf/pdfplumber/reportlab), dar neįdiegtų — įsidiegs on-demand.

    Orca daugiasesijų/Remote Control keblumas — pastebėta, kad ta pati konversacija gali turėti KELIS nepriklausomus Claude Code procesus (skirtingus terminalus tame pačiame worktree „main"), ir Remote Control (telefono prieiga) susieta tik su VIENU iš jų vienu metu — uždarius jo tabą Orca lange, susietas ryšys automatiškai NEPERSIJUNGIA prie kito. /remote-control komanda neveikia iš vidaus, kai pati sesija jau pasiekiama per Remote Control (apsauga nuo savęs-perrašymo). Sprendimas: pilnas Orca app restartas.

    Serverio prastovos šaltinis (2026-08-20→24, ~3,75 paros) — Windows event log (Kernel-Power ID 41, EventLog ID 6008) patvirtino: kompiuteris NETEKO MAITINIMO (ne crash — nėra WER/minidump įrašo), o watchdog/autostart apsaugo TIK nuo programinio crash'o, ne nuo viso PC išjungimo.

    2026-08-31 — /update-wolf paleistas iš atskiro worktree, rastas orphaned fix main šakoje

    Nuo paskutinio faktinio doc-sync (c504dc6, 2026-08-29) main šakoje kodo pusėje pasikeitė tik darbuotojai.json (9239a1b, duomenys, ne struktūra) — patikrinta git log --since IR PRAGMA table_info() per visas 20 verslo lentelių tiesiogiai per DB (dar rasta tuščia, nedokumentuota Justas PocketBase auth kolekcijos lentelė — ne verslo duomenys, ignoruota).

    Rastas dokumentacijos driftas, kurio ANKSTESNĖ sesija JAU BUVO ištaisiusi, bet niekada nesusiliejo į main: du atskiri worktree'ai (auto-vm-...-20260829T1900 commit'as 95d95ba, auto-vm-...-20260830T1900 commit'as 6c8e63c) NEPRIKLAUSOMAI padarė TĄ PATĮ pataisymą — [[pakuotes]] ir [[workflow]] klaidingai vadino gamybos_korteles būsenos stulpelį busena, realus DB stulpelis yra statusas — bet kadangi kiekvienas worktree yra atskira git šaka, o niekas jų nesumerginęs atgal į main, PATS C:\VM (main checkout, vienintelis realus šaltinis) šio fix'o niekada negavo. Pataisymas dabar pritaikytas tiesiogiai C:\VM/main: statusas terminija, pakuociu_nurasymai atimtis „Laisva" formulėje.

    Pamoka ateičiai: kai /update-wolf (ar bet koks kitas dokumentacijos/kodo fix'as) vykdomas atskirame worktree, PATIKRINTI PO commit'o, ar šaka realiai susiliejo į main — worktree commit'as be merge'o yra NEMATOMAS realiam C:\VM naudotojui, net jei git log rodo jį kaip „atliktą". Šis fix'as dabar komituojamas TIESIOGIAI main (kaip ir ankstesni 541fc4c/c504dc6/9239a1b doc-sync commit'ai), ne naujoje datuotoje šakoje, kad išvengtų to paties likimo.

    2026-08-14 sesija — /inv komanda, 2 realūs production bug'ai, važtaraščio 2 naujos funkcijos, OmniRoute atsisakymas, atostogų paruošimas

    Nauja /inv slash komanda (.claude/commands/inv.md) — pilnas inventorizacijos-per-nuotraukas workflow su sprendimų medžiu: (a) LOT jau DB+sutampa→nieko, (b) tuščias LOT placeholder+kiekis sutampa→backfill (PUT /api/gavimai/:id, kiekio nekeisti), (c) tikrai naujas LOT→nauja partija (POST /api/papildyti-zaliava/:id), (d) LOT yra bet kiekis nesutampa→klausti, nekeisti tyliai. Per sesiją realiai panaudota ~15 kartų (Vitamin A/B6 placeholder skaidymas į realius LOT'us pagal vartotojo fizinį pallet-tikrinimą, Licorice/Antilles Cherry likučio korekcijos, naujos žaliavos „Green Tea Extract 50% EGCG" sukūrimas kai paaiškėjo, kad tas pats LOT numeris atsitiktinai sutapo su kitu, nesusijusiu produktu).

    FEFO nurašymas gali neatitikti realaus fizinio atidarymo — sistema sąmoningai nurašo pagal ankstyviausią galiojimą (žr. 2026-07-29 įrašą žemiau), bet jei vartotojas FIZIŠKAI atidarė kitą (pvz. anksčiau gautą) partiją, reikia rankinio perkėlimo tarp partijų (viena grąžinama į pilną, kita sumažinama tuo pačiu kiekiu, zaliavos.likutis perskaičiuojamas kaip SUM). Realus atvejis: Lemon Juice powder 637/319-92 (FEFO nurašė) vs AN25604950 (realiai atidaryta) — 5,17kg perkelta.

    Bug #1 — plevelesGauta() niekad neužpildydavo planuojamas_kiekis (gamybos_ciklas.js): auto-sukurta kortelė (mobile „Priimti") visada gaudavo planuojamas_kiekis=0, ir šis metodas — nors registruoja LOT/EXP/žurnalą — niekad nepataisydavo plano net gavus realų plėvelės kiekį. Pasekmė: maišymo kortelė rodydavo „Pagal planą (0 vnt)", PAKETELIAI laukas neužsipildydavo. Pataisyta — jei planuojamas_kiekis===0, gauto kiekio registravimas jį automatiškai užpildo (esamo rankinio plano neperrašo). Patikrinta REALIU naršyklės testu per Orca (MAGNESIUM CITRATE kortelė, planas 0→163000, matoma maišymo kortelės modale).

    Bug #2 — mobili dėžučių registracija VISADA klaidos „Nurodykite gamybos kortelę" (public/mobile.html): dėžučių/pouch registravimas kvietė seną /api/priimti-medziagas, kuris dėžutėms neturi jokios paieškos pagal produkto pavadinimą — reikalauja korteles_id, kurio forma net nesiunčia (tik pavadinimą). Kodo komentaras KLAIDINGAI teigė, kad jau eina per registruotiGavima() — buvo suplanuota, bet niekad nebaigta. Pataisyta — perjungta į /api/registruoti-gavima (auto-paieška/auto-sukūrimas pagal pavadinimą, jau seniai veikiantis kitiems atvejams).

    Nauja funkcija — Sąskaitos numeris važtaraščio Istorijoje: kiekvienoje eilutėje laukelis (auto-save onblur), užpildytas → žalias rėmelis + ✅. Nauja vaztarasciai.saskaitos_numeris kolona (tiesioginė SQLite migracija, ne per PocketBase schema — tas pats modelis kaip created/updated), PATCH /api/vaztarasciai/:id/saskaita.

    Nauja funkcija — Nestandartinis (laisvo teksto) važtaraštis: trečias Važtaraštis sub-tab'as „✍️ Nestandartinis" — vartotojas ranka įrašo gavėją + laisvą tekstą, be produktų/LOT/palečių builderio. Sandėlio NELIEČIA (jokio isvezimai/nurašymo). Gauna savą VM-numerį, Istorijoje su „✍️ LAISVAS TEKSTAS" ženkliuku. Reikėjo ATSKIROS, paprastos HTML atšakos IR serverio /api/vaztarasciai/:id/html (peržiūrai), IR klientinėje vzBuildVaztarastisHtml (PDF/spausdinimui) — abi funkcijos anksčiau besąlygiškai tikėjosi payload.paletes masyvo.

    Orca embedded naršyklė — patikrinimo metodo atnaujinimas (žr. [[feedback_orca_cli_usage]]): ankstesnė 2026-08-01 išvada „nepatikimas, tikrinti Node skriptu" PAKEISTA — šiandien pilnai veikė realiam UI testavimui (snapshot→fill/click→keypress Tab blur→tikrinti DB), naudojant DABARTINĘ (orca skills get orca-cli) sintaksę, ne seną --page/--timeout. Naudota 3 kartus šią sesiją sėkmingai (sąskaitos numerio laukas, maišymo plano bug fix, nestandartinis važtaraštis).

    OmniRoute MCP serveris pašalintas (claude mcp remove omniroute) iš C:/VM projekto — buvo palikta registracija ~/.claude.json, kiekvieną sesiją bandanti jungtis į localhost:20128 (503, nebenaudojamas nuo 2026-08-14, žr. [[project_omniroute_valdymo_setup]]).

    Atostogų (2 sav.) paruošimas — kritinė spraga rasta: anksčiau sukurtas SYSTEM-lygio VM-AutoStart scheduled task BUVO DINGĘS (nežinia kodėl). Pataisyta be admin teisių (UAC blokavo Register-ScheduledTask/Set-LocalUser): (1) Startup aplanko .lnk (veikia nes Autologon jau įjungtas), (2) VM-Watchdog scheduled task kas 5 min (vartotojo-lygio, ne SYSTEM — tikrina HTTP+procesą, restartuoja per start-background.ps1 jei negyva). Admin teisių reikalaujantis veiksmas, kurį vartotojas atliko pats: vm lokalios paskyros slaptažodis buvo PASIBAIGĘS (2026-07-31) — SSH/RDP fallback nebeveiktų; Set-LocalUser -PasswordNeverExpires $true sutvarkyta.

    Vartotojo skundas: barkodų (GS1) skaitymas iš telefono foto nepatikimas — teisingas skepticizmas. GS1 parseriai (gs1js ir pan.) sprendžia TIK jau-iššifruoto barkodo teksto parsinimą, NE vaizdo dekodavimą iš pikselių — realioms sandėlio nuotraukoms (Telegram kompresija, kampas, šešėliai) reikėtų atskiro image-decoding sluoksnio (ZXing/jsQR), kuris irgi nepatikimas tokiom sąlygom. Dabartinis vision-modelio spausdinto teksto skaitymas (kaip visą šią sesiją) realybėje patikimesnis.

    Commit'ai: 3cee267 (feat: sąskaitos nr.), 3f001eb (fix: mobili dėžučių registracija), 3298b37 (fix: planuojamas_kiekis), bad7219 (feat: nestandartinis važtaraštis).

    2026-08-12 sesija — Maišymų žurnalo eilutės paspaudimas rodo to maišymo žaliavas

    Naujas endpoint GET /api/gamybos-korteles/:id/nurasymai (server.js) — VIENOS kortelės nurašymai tiesiai iš SQLite (šaltinis), LEFT JOIN zaliavos (pavadinimas/vienetas), ORDER BY rowid. Skirtingai nei /api/nurasymai, kuris skaito PocketBase veidrodį ir gali būti atsilikęs.

    Ryšys: nurasymai NETURI maišymo sesijos FK — maišymo žurnalo įrašo gamybos_zurnalas.data TIKSLIAI sutampa su to maišymo nurašymų nurasymai.created (abu rašomi iš to paties serverio formattedDate, sekundės tikslumu; galioja IR web registruoti-maisyma, IR telegram apdorotiMaisyma). Grupuojant pagal created, vienareikšmiškai atskiriami skirtingi tos pačios kortelės maišymai (patikrinta: BIOCINKAS A260622 — 4 maišymai → 4 grupės; VENOLEGS A260721 — 8 žaliavos). Paskirstytų maišymų kitoms kortelėms atitikimo nėra — rodoma „nerasta" (normalu).

    UI (desktop _renderGamybaKortele „Maišymų žurnalas" lentelė): kiekviena eilutė dabar paspaudžiama (cursor:pointer, ▾ chevron) — onclick="toggleMaisymoIrasas('')" varto paslėptą su _maisymoZaliavosHtml(m) — žaliavų lentelė (Žaliava | Kiekis | Dalis %), rūšiuota pagal kiekį mažėjančiai. nurByCreated mapa sukuriama iš naujo nurRes fetch'o Promise.all'e. maisRows blokas (~5722) yra NEGYVAS kodas (niekur neinjektuojamas) — paliktas. Mobile atitikmens nėra.

    2026-08-03 sesija — mobile Foto analizei bug fix, keli veiksmas-string atitikimo bug'ai (POUCH/SUDĖTA/tuščias pavadinimas), rankinis DB atsekamumas per nuotraukas

    Kontekstas: ilga sesija, daug realaus laiko duomenų taisymo per nuotraukas (žaliavų etiketės, važtaraščiai) + kelių savarankiškai atrastų (ne vartotojo pranešto) production-logikos bug'ų taisymas. Agy dirbo per Orca lygiagrečiai iki pasiekė naudojimo limitą („Individual quota reached... 166h") — po to visą likusį darbą (nuotraukų tikrinimą, DB taisymus, bug fix'us) atlikau viena.

    Mobile „Foto analizei" siuntimas rodė „Klaida" be priežasties — safeFetch() (mobile.html) turėjo kietai koduotą 10s timeout VISIEMS API kvietimams; nuotraukos base64 duomenų siuntimas per mobilų ryšį kartais užtrukdavo ilgiau, timeout tyliai virsdavo neinformatyviu pranešimu. Pridėtas nebūtinas timeoutMs parametras safeFetch()/apiAction() (default 10000 nepakito), submitPhotoAnalizei() naudoja 45000ms. Agy pridėjo Užsakovo (#mPhotoKlientas) pasirinkimo lauką prie formos, /api/mobile-foto backend'as papildytas priimti/išsaugoti klientas_id+klientas_pavadinimas sidecar JSON faile.

    Trys atskiri „veiksmas string atitikimo" bug'ai, visi ta pati bendra klasė (kai kodas skirtingose vietose skirtingai tikrina gamybos_zurnalas.veiksmas reikšmę, ir pamiršta variantą):

    1. getIngBatch() tuščio pavadinimo spąstas (_renderGamybaKortele ir dubliuota kopija ~11885 eil.) — fallback paieškos sąlyga ingPavLC.includes(g.pavadinimas...) niekada netikrino, ar g.pavadinimas netuščias. JS'e bet_kas.includes('') visada true, tad VIENAS DB įrašas su tuščiu zaliava_pavadinimas_raw (nesusijusi BF „Curcum extract" žaliava) klaidingai „atitikdavo" KIEKVIENĄ ingredientą, kuriam realaus LOT nerandama — 5 skirtingi „for Gut bliss" recepto ingredientai visi rodė tą pačią, jiems nepriklausančią partiją. Pataisyta abiejose kopijose — tuščias g.pavadinimas niekad nebelaikomas atitikimu.

    2. POUCH veiksmas praleistas kortelės perskaičiavime (PUT/DELETE /api/gamybos-zurnalas/:id, server.js) — po žurnalo įrašo redagavimo/trynimo, kortelės pagaminta_kiekis/supakuota_kiekis perskaičiuojami TIK jei veiksmas SUDĖTA/STAKLĖS/PALAIDI — POUCH (kuris pouch produktams žymi IR pagaminimą, IR supakavimą vienu metu) buvo visiškai praleistas. Redagavus/ištrynus POUCH įrašo kiekį, kortelė likdavo su sena, nebeatitinkančia reikšme. Pataisyta abiejuose endpoint'uose — pridėtas else if (v === 'POUCH') atvejis, perskaičiuojantis abu laukus iš SUM(kiekis) WHERE veiksmas='POUCH'.

    3. Viršutinis „Sudėta į dėžutes" KPI ignoravo multi-regionų žymas (fetchProductionData(), index.html ~2323 eil.) — naudojo griežtą lygybę veiksmas === 'SUDĖTA', bet multi-regionų kortelės (pvz. BIOCINKAS LT+LV/EE) rašo 'SUDĖTA [🌍 LV/EE]' su regiono žyma. Detalės panelis (_kpiPanelLoad) senai naudoja .includes('SUDĖTA') ir šios problemos niekad neturėjo — viršutinis skaitiklis dabar suvienodintas su ta pačia logika. (Pastaba: pagaminta pusėje STAKLĖS ✓ griežta lygybė PALIKTA TYČIA — tai atskira, sąmoningai neskaičiuojama kumuliacinė žymė, ne regioninis variantas.)

    Žr. naują atminties įrašą feedback_veiksmas_string_matching_drift.md — šis bug'ų šablonas (naujas/žymėtas veiksmas variantas pamirštamas VIENOJE iš kelių vietų, kur jis tikrinamas) pasikartojo 3 kartus per šią sesiją, verta jo aktyviai ieškoti ateityje.

    Duomenų atsekamumo pataisymai per vartotojo nuotraukas (DS klientas):

  • Spinach powder: DB likutis 62kg → faktinis pasvertas 57.5kg (vartotojo patvirtinta), pridėtas trūkstamas LOT 210426 (IDA s.r.l., EXP 2027-04-21).
  • GINGER D.E. 5% Gingerols, MILK THISTLE D.E. 80% Silymarin, Peppermint ground Organic — visi turėjo tikslų likutį DB, bet JOKIO partijos (LOT/EXP) įrašo zaliavu_gavimai lentelėje — pridėti trūkstami įrašai (Nutrifoods/Vehgro tiekėjai) NEKEIČIANT likučio.
  • Lemon Juice Powder (Symrise/Diana Food, 92kg, LOT AN25604950) — patikrinta, jau buvo užregistruota nuo 2026-06-15, papildomai užpildyti anksčiau tušti LOT/EXP/tiekėjo laukai.
  • Ferrum receptas sukurtas pilnai (BF, sudėtis Ferrum Taiyo 0.25g + Acerola 17% 0.10g + Gliucidex IT19 0.65g/vnt) po vartotojo pateiktos formulės — nauja žaliava „Ferrum Taiyo (BF)" (likutis 0, dar negauta), 3600 vnt. dežučių gavimas užregistruotas per /api/registruoti-gavima.
  • LABANAKT (jau turėjo receptą) — 3913 vnt. dėžučių gavimas, kuris irgi buvo pakliuvęs į orphaned zaliavos stub prieš vakarykštį Ferrum fix'ą, perregistruotas teisingai per tą patį endpoint'ą.
  • Trūkstamas važtaraštis atgaline data: Creatine Monohydrate (DS, LOT 607021) turėjo 520 vnt. neišsiųsta pagal sistemą, nors vartotojas manė, kad viskas išsiųsta. Iš pradžių atgaline data užregistruotas TIK Creatine (VM-20260731), bet vartotojas atsiuntė TIKRO važtaraščio nuotrauką — jame buvo 4 produktai (Garden strawberry 600, Light caramel 350, Creatine Monohydrate 520, Wild marine collagen 80, iš viso 1550 vnt./53 dėž.). Pirminis nepilnas įrašas ištrintas (vaztarastis+isvezimai+zurnalas), sukurtas iš naujo pilnas su visais 4 produktais. Taip pat pataisyta klaidinga Light caramel (LOT 606047) EXP kortelėje (buvo 2027-04-30, iš tikrųjų 2028-07-27).
  • Mobile UI: prod-kortelės (renderProdCard) gavo naują plonos progreso juostelės elementą, rodantį sumaisytas_kiekis (🧪, oranžinė) tarp pavadinimo/LOT/EXP ir pagaminta/supakuota/išvežta kvadratėlių — pirma versija (4-as kvadratėlis) atmesta kaip per ankšta, perdaryta į juostelę. Desktop'e ekvivalentiška juostelė (mPct, violetinė) jau seniai veikia renderProductionRows() — nieko keisti nereikėjo.

    Atostogų registravimas — UI grupavimas + reali duomenų klaida. submitHR('ATOSTOGOS') (mobile.html) tyčia kuria atskirą darbo_laikas įrašą KIEKVIENAI darbo dienai tarp „nuo"/„iki" (kad mėnesio suvestinė galėtų tiksliai skaičiuoti dienas) — bet „Darbo laikas → Istorija" sąrašas anksčiau rodė kiekvieną dieną kaip atskirą kortelę, todėl viena „nuo-iki" registracija atrodė kaip N atskirų įrašų. Pridėtas grupavimas: iš eilės einančios (leidžiant iki 3 d. tarpą savaitgaliams) to paties darbuotojo ATOSTOGOS dienos dabar rodomos kaip VIENA eilutė „Nuo X iki Y (N d.d.)" su bendru trynimo mygtuku (deleteHRGroup). Patikrinant paaiškėjo IR reali duomenų klaida — rugpjūtį buvo klaidingai užregistruota 20 atostogų dienų (08-03–08-28) vietoj teisingų 10 (08-17–08-28); 10 perteklinių įrašų ištrinti, pridėtas trūkstamas 08-31 TEVADIENIS įrašas. Pastaba sau: registruojant naują darbo_laikas/kitą lietuviškų raidžių turintį įrašą per curl -d "{...Ž...}" Bash/Git-Bash aplinkoje, UTF-8 simboliai (Ž ir pan.) gali sugesti į pakaitos simbolį — po tokio įrašymo VISADA patikrinti tiesiogiai per SQLite, ar vardas/kiti tekstiniai laukai neapgadinti (šįkart pačiam teko taisyti savo paties sukurtą „Justas Žukauskas" → „Justas �ukauskas" klaidą).

    2026-07-31 sesija — dežutės naujo produkto registravimas apeidavo receptą/kortelę (Ferrum), BIOCINKAS trūkumo fix, bendras darbas su Agy per Orca

    Kontekstas: vartotojas pirmą kartą testavo Orca (stablyai/orca) kaip alternatyvą/papildinį wmux daugiaagentei orkestracijai — šis darbas atliktas VIZUALIAI matomas vartotojui, Claude ir Agy dirbo lygiagrečiai per Orca terminalus (Claude — backend, Agy — frontend), su aiškiu darbo pasidalijimu per terminal_send.

    BIOCINKAS klaidingas „Trūksta žaliavų" trūkumas (public/index.html ~2244) — trūkumo skaičiavimas naudojo pagaminta_kiekis (kiek jau pervaryta per stakles), bet žaliavos realiai nurašomos MAIŠYMO metu (patvirtinta nurasymai lentelėje — kiekis tiksliai atitinka sumaisytas_kiekis). Kortelėms, kur maišymas lenkia staklių pažangą (norma gamyboje — sumaišai didelę partiją, po to varai per stakles palaipsniui), tai rodydavo klaidingą trūkumą. Pataisyta į Math.max(0, planuojamas_kiekis - (sumaisytas_kiekis||0)) — ta pati logika, kuri jau seniai naudojama MRP/Rezervacijos skaičiavimuose (likutinisPlanas) kitose šio failo vietose. Patikrinta replikuojant tikslią formulę Node scriptu prieš gyvus DB duomenis (naršyklės įrankiai — ir wmux browser_open, ir Orca embedded tab/eval/wait — buvo nepatikimi/pakabindavo šios sesijos metu, žr. [[feedback_orca_cli_usage]]).

    „Ferrum" naujo produkto registravimas per mobile.html Gavimai formą kūrė „pakabintą" žaliavos įrašą, ne receptą/kortelę — root cause: mobile.html naujo dėžutės/pouch produkto registravimas siųsdavo į /api/mobilus/priimti (server.js ~6624), kuris tiesiog sukuria/atnaujina zaliavos eilutę pagal pavadinimo atitikmenį, VISIŠKAI apeidamas gamybos_ciklas.js registruotiGavima() recepto/kortelės auto-kūrimo logiką (kurią naudoja desktop index.html „Priimti pakuotes" tabas per /api/registruoti-gavima). Pasekmės: (1) produktas neatsirasdavo gamyboje (nėra recepto/kortelės), (2) zaliavu_gavimai lentelėje nieko, todėl Gavimai lango dėžučių stulpeliai tušti, (3) #gKli (Užsakovo) laukas mobile.html apskritai NEBUVO renderinamas dėžutėms/pouch (tik zaliava), tad net jei kelias veiktų, priskyrimo galimybės nebuvo.

  • gamybos_ciklas.js registruotiGavima() — auto-recepto-kūrimo sąlyga (buvo TIK yraPirminePak, t.y. plevele/pouch) išplėsta į (yraPirminePak || tipas==='dezutes'). Naujo recepto INSERT dabar taip pat išsaugo klientas stulpelį iš kliento_kodas parametro (anksčiau visada likdavo tuščias, nepriklausomai nuo tipo).
  • server.js /api/registruoti-gavima — PocketBase recepto sinchronizacija papildyta klientas lauku.
  • public/mobile.html — naujo dėžutės/pouch produkto registravimas dabar eina per /api/registruoti-gavima (ne /api/mobilus/priimti); #gKli renderinamas ir rxType==='dezutes'/'pouch' atvejais.
  • Patikrinta REALIU test-produkto API kvietimu prieš commit'inant (sukurtas recepto+kortelės+klientas įrašas, patikrintas SQL, po to išvalytas iš SQLite; PocketBase pusėje testinis įrašas liko neišvalytas — auth scriptu nepavyko, nekritiška, nes PocketBase yra antrinis mirror, ne skaitymo šaltinis).
  • Orphaned „Ferrum" zaliavos įrašas (kaqq6xs1hr7xwig, likutis 3600) ištrintas iš DB (patikrinta prieš tai — nulinės nuorodos nurasymai/zaliavu_gavimai/ingredientai lentelėse).
  • Paketėlių skaičiaus rodymas paspaudus priėmimo įrašą (public/index.html „Paskutinė veikla" panelė + public/mobile.html „Paskutiniai pajamavimai") — Agy dalis. veiklos_zurnalas.aprasymas formatas yra dalys.join(' · ') (pvz. "Priimta medžiaga · Ferrum · 3600 vnt"), NE dvitaškis+skliaustai — pirma Agy versija naudojo neteisingą regex (niekad neatitikdavo), pataisyta į split(' · ') pagrindu veikiančią logiką su fallback'u senam formatui. Skaičiavimas: kiekis × recipe.pak_dezuteje (kai vnt.), rodoma per showToast.

    Nauja mobile.html skiltis „Visi priėmimai (kompiuteris + telefonas)" (Priėmimo ekranas) — vartotojo klausimas „kaip kompo gavimus rast patogiai mobiliam?". Esamas „Paskutiniai pajamavimai" rodo TIK žaliavas (/api/gavimai, filtruoja veiksmas='Priimta žaliava') — dėžutės/plėvelė/pouch priėmimai iš kompiuterio ten niekad nesimatydavo. Nauja skiltis naudoja jau esantį /api/veikla žurnalą (jokio naujo backend endpoint'o), filtruoja aprasymas.startsWith('Priimta medžiaga'), rodo 💻/📱 šaltinio žymą + paketėlių skaičiavimą paspaudus (showVeiklaGavimasInfo, ta pati split(' · ') logika kaip index.html). Pakeliui rastas ir pataisytas susijęs bug'as: veiklaLog middleware (server.js ~100) rinkdavo produkto pavadinimą TIK iš body.pavadinimas — /api/registruoti-gavima siunčia body.produktas, todėl dežutės/pouch įrašai veiklos žurnale likdavo be pavadinimo („Priimta medžiaga · 50 vnt"). Pataisyta else if (body.produktas) fallback'u, patikrinta realiu API kvietimu prieš/po.

    Commit'ai: 8ea4f24 (frontend: paketėliai UI + gKli laukas + endpoint routing), 2124e3f (backend: recepto/kortelės auto-kūrimas dežutėms + klientas), e76be19 (docs), 731ae40 (mobile „Visi priėmimai" + veiklaLog fix).

    2026-07-29 vakaro sesija — mobile priėmimo pertvarka, FEFO, Agy #68

    FIFO → FEFO nurašymas (server.js fifoConsume() ~3539): vartotojas pastebėjo, kad senesnio galiojimo mažas maišas nebuvo nurašytas pirmas. ORDER BY pakeista iš vien data ASC (gavimo data) į FEFO: CASE WHEN galiojimas IS NULL OR ='' THEN 1 ELSE 0 END ASC, galiojimas ASC, data ASC, created ASC — anksčiausio galiojimo partija visada nurašoma pirma, be galiojimo (fallback) — paskutinė.

    „+1 vnt." šiukšlių įrašai gavimuose — gamybos_ciklas.js kortelesSukurta() automatiškai rašo kiekis:1 žurnalo įrašą kaip būsenos žymę (Gauta plėvelė/Gauta pouch) kuriant kortelę vien su LOT. Pouch produktams tai VIENINTELIS įrašas (realus kiekis gyvena pakuociu_sandelis) — PALIKTA. Plevelei/stickui tai grynas triukšmas — filtras centralizuotas _gavimoEntriesFor/_mobGavimoEntriesFor (index.html ir mobile.html), 8 patvirtinti šiukšlių įrašai ištrinti iš DB.

    „LOT: —" mobile Paskutiniuose pajamavimuose — gamybos_ciklas.js plevelesGauta() rašė į zaliavu_gavimai.serijos_nr sąskaitos numerį (serija), ne tikrą LOT. Pataisyta: galutinisLot || serija || ''.

    Nauji endpoint'ai PUT/DELETE /api/zaliavu-gavimai/:id (server.js ~3879) — pirmi šios lentelės redagavimo/trynimo endpoint'ai; PUT priima {kiekis, serijos_nr, galiojimas, data}, proporcingai koreguoja likutis_kg, kviečia fifoRecalc() jei yra zaliava_id.

    Mobile „Registruoti gautą plėvelę" pilna pertvarka (public/mobile.html): pašalintas produkto DOM mazgą kiekvienam klavišui — mobiliojoje klaviatūra užsidarydavo/laukas prarasdavo fokusą. Pataisyta pagal jau veikusį cardAC() pavyzdį: oninput dabar atnaujina TIK vidinį rezultatų konteinerį (#zalLikBody/#etikListWrap), mazgas nekeičiamas. Patikrinta realiai naršyklėje (DOM mazgo identiškumas prieš/po, document.activeElement).

  • Priėmimo ekranas — gražus pasirinkimo langas vietoj mažų tabų: naujas renderRxPicker() (kaip Telegram bote — 5 dideli mygtukai su ikonom: Žaliava/Plėvelė/Pouch/Dėžutės/Bulk) rodomas pirmiausia įėjus iš „Daugiau" meniu (state.rxPicked flag'as, resetinamas navigate() viduje). Pasirinkus tipą — forma su kompaktiška „🔄 Keisti" antrašte vietoj senojo .tab-bar.
  • Važtaraščio (mobile) stulpelių nesutapimas tarp palečių — kiekviena paletės savo stulpelių pločius skaičiavo NEPRIKLAUSOMAI pagal turinį (be table-layout:fixed), tad skirtingo ilgio produktų pavadinimai pastumdydavo likusius stulpelius nevienodai tarp lentelių. Pataisyta: table-layout:fixed + fiksuoti % pločiai (colW objektas, priklauso nuo allPouch), pavadinimas prireikus laužomas (word-break:break-word).
  • Važtaraščio parašų blokas (Išdavė/Priėmė) suvienodintas su desktop stiliumi — buvo dvi linijos (sena .sign-col{border-top} + nauja border-bottom po vardu), paliktas tik vienas švarus brūkšnys su vardu virš jo.
  • VITAL TITAN COMPLEX (LOT A260430, OF/„Medigate") — pamiršto važtaraščio atgalinis įregistravimas: vartotojas fiziškai išsiuntė 1 paletę (30 dėž. × 840 vnt. = 25200 vnt.) 07-22, bet niekada neregistravo sistemoje (nei vaztarasciai, nei vaztarasciu_juodrasciai, nei žurnalo IŠVEŽTA įrašo). Sukurtas pilnas važtaraštis atgaline data per /api/nurasyti-vaztarasti (numeris VM-20260722), sandėlio likutis atstatytas (172200→147000 vnt.). Pastaba: šio endpoint'o payload item laukai — pakDezeje (vnt./dėž.), dez_dezeje (dėžučių/dėž., >1 kad rodytųsi), viso_vnt (jau paskaičiuotas total) — NE factor/vnt (pastarasis reiškia „nepilnos dėžės" likutį, ne bendrą kiekį).
  • PURIS™ Pea 2.0 pilnas auditas ir likučio korekcija (Agy) — vartotojas pranešė 295kg faktinio likučio vs 355.69kg DB. Prieš korekciją atliktas pilnas visų liepos mėn. kortelių/maišymų/nurašymų auditas (Dark chocolate, Light caramel, Garden strawberry) — visi 100% atitiko receptūras, jokių praleistų įrašų. ~60.69kg skirtumas priskirtas senesnių (geg./birž.) kortelių FIFO nurašymams iš naujos partijos. Likutis atnaujintas į 295.00kg.
  • BF/VM inventorizacijos suderinimo ataskaitos (VM inv.07-22.xlsx → 2 PDF Desktop'e) — pilnas 103-pozicijų suderinimas + atskira trūkumų/perteklių ataskaita. Svarbi vartotojo korekcija: stulpelis „BF" = PATIES vartotojo fizinė inventorizacija (pateikta Biofarmacijai), stulpelis „VM" = įmonės (Vilniaus Maisto) popierinė apskaita — priešingai nei pirminė prielaida.
  • wmux atnaujintas 3.31.0 → 3.37.2, herdr 0.7.2-preview → 0.7.5 (abu per gh release download). Herdr 0.7.5 pridėjo agent prompt/agent wait CLI fasadą tarpprocesiniam agentų valdymui — IŠBANDYTA ir NEVEIKIA iš Claude Code MCP/Bash konteksto Windows'e (PermissionDenied, greičiausiai program-level apsauga nuo išorinių callerių, atitinka dokumentuotą „Direct Terminal Attach: unsupported" apribojimą). wmux pane_list po atnaujinimo TEISINGAI atpažįsta Antigravity CLI (anksčiau visada agents: []).
  • 2026-07-22/23/24 sesijos naujienos

  • Mobile „Žaliavų likučiai" — paieška, klientų filtras, PDF (public/mobile.html): _zalKlientasKodas(z) resolveris nustato žaliavos klientą per klientas_id (case-insensitive palyginimas su state.klientai) SU fallback'u į (KODAS) sufiksą pavadinimas lauke, kai klientas_id tuščias — 72/258 žaliavų neturėjo šio ryšio, tik pavadinime įrašytą kodą. Klientų chip'ų juosta virš sąrašo, PDF generavimas per _buildZalLikuciaiPdfHtml(klFilter) + esamą /api/generuoti-pdf (navy header stilius kaip kiti sandėlio PDF, expiry spalvinimas raudona/oranžinė).
  • Gavimai: maišymas be formalios gamybos pradžios (public/index.html): virtualios (dar nesukurtos kortelės) eilutės pavadinimas dabar paspaudžiamas (⚗ ženklas) — _pradetiMaisymaIsVirtualaus(receptasId) sukuria kortelę per POST /api/gamybos-korteles BE pradeti-gamyba iškvietimo (kortelė lieka gamyba_pradeta=0, statusas laukia), tada iškart atidaro openMaisymaiDetails. Veikia, nes registruoti-maisyma endpoint'as (server.js:2013) nereikalauja gamyba_pradeta=1 — tik kad kortelė egzistuotų.
  • KRITINIS bug'as — 30s auto-refresh išmesdavo iš Maišymo lango: fetchProductionData() (kviečiamas kas 30s per setInterval) turėjo tab-perpiešimo logiką be atvejo _pagrindinisTab==='maisomi' — kritinę į else šaką (renderProductionRows()), nutraukdavo atidarytą maišymo detalų vaizdą atgal į bendrą sąrašą. Vartotojas tai pastebėjo kaip „vien pelę pastumdžius išeina iš maišymo lango" — tikroji priežastis buvo LAIKAS (30s), ne pelės įvykiai. Pataisyta pridedant else if (_pagrindinisTab === 'maisomi') renderMaisomiGaminamoje(); (index.html ~2280).
  • Naujas „Visi" tabas pagrindiniame Gamybos lange: rodo visų tipų (paketeliai/pauchai/stickai) korteles kartu sąraše, bet sugrupuotas ir atskirtas antraštėmis (_tipGrupes sort tvarka: plevele→pouch→stick, groupHeader injekcija filtered.map() viduje pagal tipo pasikeitimą). filterByTipas('visi') naudoja esamą renderProductionRows() (jau apima per else šaką).
  • Maišymo kiekio įvedimas vnt. (ne tik kg) — tiek desktop (_openGamybaMaisymasModal), tiek mobile (openQuickRegister maisymas forma): naujas „arba vnt." laukas, kuris automatiškai perskaičiuoja bazinės žaliavos kg pagal recepto normą (_gmVntToKg() / updateQrVntToKg()), plius „Įrašyti likutį" greito užpildymo mygtukas (planas − sumaišyta). Spausdinamos Maišymo kortelės (openGamybosKorteleGeneratorModal) „Paketeliai" lauko placeholder pataisytas rodyti LIKUTĮ (plan-sumaisyta), o ne visą planą — anksčiau paskutinio maišymo atveju rodydavo klaidinantį pilną planą (pvz. 2000) vietoj realiai reikalingo likučio (pvz. 282), nors backend (GET .../kortele-html?pktCount=) jau seniai teisingai skaičiavo bet kokį įvestą kiekį.
  • Telegram botas — grafinis atnaujinimas (telegram-bot.js): nauja statusDot(pct) funkcija (🟢≥100% / 🟡≥50% / 🟠>0% / 🔴nepradėta) atskira nuo statusIcon() (veiksmo tipas). Panaudota monitoriaus sąraše (lygiuotas blokas su padStart), kortelės detalėje ir daugumoje pranešimų
    grupavimui: informuotiKitus, staklių/pakavimo/maišymo patvirtinimai (4 vietos), trūkstamos žaliavos (grupuota pagal klientą), sandėlio likučiai, naujo prisijungimo įspėjimas. Pridėta progreso juosta inventorizacijos meniu.
  • KRITINIS bug'as — /start rodė per daug jau pagamintų kortelių: getMonitoriausKorteles() SQL filtravo tik statusas != 'archyvuota', bet NE 'baigta' — todėl 17 jau baigtų (bet dar neperkeltų į archyvą) kortelių maišėsi su 8 realiai vykstančiomis. Pataisyta į WHERE k.statusas NOT IN ('archyvuota', 'baigta') AND k.gamyba_pradeta = 1. Pastaba: identiška SQL eilutė egzistuoja IR rodytiSandelioLikucius() (telegram-bot.js:839) — TEN 'baigta' korteles PALIKTI, nes pagaminta/supakuota, bet dar neišsiųsta produkcija YRA sandėlio likutis. Nekeisti tos vietos, jei vėl kils panaši užduotis.
  • TG meniu sugrupuotas — mainMenuKeyboard() mygtukai suskirstyti į sekcijas (⚙️ GAMYBA / 📦 SANDĖLIS / 📈 VALDYMAS) su ne-veiksmingomis antraščių eilutėmis (callback_data:'noop', saugiai praryjama bendro answerCallbackQuery prieš if/else grandinę — NEREIKIA atskiro handler'io naujiems no-op mygtukams).
  • wmux atnaujintas 3.23.0 → 3.31.0 (per GitHub release Setup.exe, openwong2kim/wmux repo).
  • 2026-07-21 sesijos naujienos

  • Maišymo kortelė (spausdinama, GET /api/gamybos-korteles/:id/kortele-html) — pridėtas pktl/vnt kiekis: serveris jau skaičiavo pktlPerSession (kiek pktl išeis iš 1 pilno maišymo), bet niekur to nerodė popieriuje. Dabar sekcijos antraštė („Žaliavos — 1 maišymui (485 vnt)") ir kiekvienas pilno maišymo checkbox tinklelio langelis rodo tikslų vnt. skaičių. Nauja kintamoji perMaisymoLabel (server.js ~7213).
  • Naujas DS receptas „Elektrolitai" (a479aaix8cl4dqo, 5.17g/pkt, plevelė) — sukurtas iš vartotojo pateikto skaičiavimo lapo (screenshot). 11 ingredientų: 2 jau turimi sandėlyje (ANTILLES CHERRY with 25% Vitamin C, Citrinų sulčių milteliai (pfannerschmit) — susieti su esamais įrašais), 9 naujai sukurti su likutis=0, klientas_id='DS' (registruos kai gaus iš tiekėjo). Pastaba: DB jau turi „POTASSIUM CITRATE E 332ii" (DS, 0.7kg) — panašus į naują „Tripotassium Citrate Monohydrate", bet vartotojo lape nefigūravo kaip turimas, tad sukurta atskirai; jei paaiškės, kad tai ta pati medžiaga, reikės sujungti.
  • KRITINIS UI bug'as — modalai netikėtai užsidarydavo pažymint tekstą: visi ~27 public/index.html modalų overlay naudojo click-only guard'ą uždarymui (if (e.target === overlay) ...). Kai vartotojas laukelyje su jau įrašytu skaičiumi bandydavo pele pažymėti (drag-select) tekstą prieš perrašydamas, ir judesys/atleidimas peržengdavo modalo ribas, naršyklė sugeneruodavo click su target===overlay, uždarydama modalą ir prarandant progresą. Pataisyta VISUR: pridėtas overlay.addEventListener('mousedown', ...) guard'as (overlay._downSelf), uždaroma tik jei IR mousedown, IR click buvo ant fono. Patikrinta naršyklėje dispatchEvent testu (drag į foną nebeuždaro, tikras klikas ant fono vis dar uždaro). Naujiems modalams VISADA naudoti šią dviejų-listenerių formą — žr. atmintį feedback_modal_overlay_drag_close.md.
  • 2026-07-20 sesijos naujienos

  • DN „Multivitaminai Vaikams N30" — trūkstamos žaliavos radimas ir taisymas: vartotojas pastebėjo, kad importuojant 07-14 iš Google Drive priėmimo-perdavimo akto, receptas (pdv1pvfrdr74z6n) turėjo 0 ingredientų vietoj 19 — konkrečiai trūko Pyridoxine hydrochloride (DN-01-04, 0.032kg). Pridėta per POST /api/recepto-sudetis su ta pačia proporcinga norma kaip kitos 18 (nekeičiant jų), receptas dabar 19/19, suma 1.501g (vietoj tikslaus 1.5g — nežymus, priimtinas nukrypimas, nes nekeičiant esamų 18 saugiau nei perskaičiuoti visas). Kiti 3 to paties dokumento receptai (Kolageno tripeptidai, Magnio bisglicinatas+B6, Energy Booster) patikrinti — visi pilni, Σ tiksliai = deklaruotam svoriui.
  • TITAN žaliavų trūkumo klaidingas skaičiavimas — rastas ir ištaisytas realus bug'as: užregistravus 2 TITAN maišymus (sumaisytas_kiekis=10500 iš planuojamas_kiekis=226500), Maišymai/Gavimai languose ingredientų trūkumo („Reikia" vs „Turima") skaičiavimas naudojo VISĄ planą, ne LIKUSĮ maišyti kiekį — todėl rodė klaidingą trūkumą daugumai ingredientų, nors fiziškai sandėlyje užtenka likusiai daliai. Pataisyta 3 vietose (_renderGamybaKortele buildIngRow, _korteleDetailHTML, _renderGavimoKortelesDetalus) — visur pridėtas likutinisPlanas = Math.max(0, planas - sumaisyta), naudojamas vietoj grynojo planas. Patikrinta naršyklėje (TITAN kortelė Maišomi vaizde) — visos 12 žaliavų dabar ✅.
  • Nauja funkcija: „Užduoties lapas (pouch)" Maišymai lange — mygtukas rodomas TIK pakuotes_tipas==='pouch' kortelėms, atidaro tuščią spausdinimo šabloną (printPouchUzduotiesLapas(), šalia printGamybosKortele/printPremixLapas): produkto pavadinimas + 4 stulpeliai (Data/Kiekis/Data/Kiekis, dvi poros greta = 32 datų vietos) operatoriaus ranka pildomai kasdienei apskaitai. Pastaba lape paaiškina kiekio įrašymo principą (pvz. „10,05" = 10 pilnų dėžių + 5 vnt. nepilnoje). Jokių DB pakeitimų — grynas spausdinimo šablonas.
  • BF inventorizacijos tęsinys per Telegram (Agy priežiūra, tiesioginis greitas pollinimas aktyvaus darbo metu pagal vartotojo prašymą „labai greitu intervalu") — suvesta ~15 naujų žaliavų (Psyllium, Green Tea, Lactobacillus, Melatonin, Broccoli, Marigold, Vitamin A, Omega3 EPA DHA, Selenium, Resveratrol, RED RICE YEAST, Vitaminas B1/B2/B12/K1, Ascorbic acid) su nuosekliu jauSunaudota formulės ir konservatyvios taisyklės (mažesnysis kiekis, kai pasvertas > DB) taikymu. Visi skaičiai post-factum patikrinti SQL.
  • 2026-07-17 sesijos naujienos

    2026-07-17 popietės/vakaro Agy priežiūros sesija (BF inventorizacijos tęsinys)

    Visos popietės Claude nuolat stebėjo Agy terminalą (daemon-bdb34bc5) per fono agy-watcher.js (buferio tail, ~3-5s aptikimas) + tiesioginį greitą terminal_read pollingą aktyvių serijų metu (vartotojo prašymu — „privalai dažniau ir greičiau reaguoti"), peržiūrint kiekvieną DB-rašymo scriptą prieš tvirtinant („1" tik, niekada „always allow").

    Suvesta ~20+ BF žaliavų per Telegram nuotraukas (Gadomag K, GadoTMC A, TCC M30, Aquamin 10/20kg, Curcum, Chia, Sodium Chloride, Potassium chloride, Senna, Rhubarb, Peppermint, Sucrativ, Blackcurrant, Ginseng, Laminaria, Raspberry, Ascophyllum, Boswellia, Natural Lemon Flavour, L-Methionine ir kt.) — visos su tiksliu jauSunaudota formulės taikymu (PUT /api/gavimai/:id, kiekis_naujas = tikslinis_likutis + jauSunaudota).

    KRITINĖ PAMOKA — kada NULINTI seną partiją, o kada NE (vartotojo pataisa po 3 klaidingų atvejų — Boswellia/Blackcurrant/Aquamin 20kg): Agy (ir Claude, tvirtindama) iš pradžių nulindavo seną partiją KIEKVIENĄ kartą, kai nauja nuotrauka parodydavo tą pačią žaliavą su nauju LOT — tai BUVO KLAIDA. Vartotojo pataisa: „senoji partija turi likt, kame bėdos??? visos nuotraukos ką randu sandėlyje, jeigu vakar pridėjau 10kg kodėl tu sdn nulini". Teisinga taisyklė:

  • Nauja nuotrauka su NAUJU LOT tai pačiai žaliavai = PAPRASTAI papildoma partija ŠALIA senosios (abi lieka aktyvios, bendras likutis = suma) — TAI YRA NORMA.
  • Senos partijos NULINIMAS pateisinamas TIK kai: (a) vartotojas EKSPLICITIŠKAI patvirtina, kad senosios fiziškai nebeliko sandėlyje (pvz. „yra tik šis"/tik viena partija liko), arba (b) tai realus DUBLIKATAS (ta pati partija per klaidą įvesta du kartus / po netinkama žaliava — pvz. GadoTMC A/TMC Fine LOT dublikato atvejis, kuris liko teisingas).
  • Kai neaišku — VISADA klausti vartotojo PRIEŠ nulinant, ne prielaida daryti savaime.
  • Šis pats klaidos-taisymo ciklas kartojosi 3 kartus (Boswellia→Blackcurrant→Aquamin) per vieną sesiją, kol nusistovėjo teisinga taisyklė — žr. [[nulinimo-pattern]] atmintį (atnaujinta).
  • Kitos pastabos:

  • „Konservatyvi taisyklė" (kai pasvertas kiekis > DB likutis, renkamės MAŽESNĮ, t.y. paliekame seną DB reikšmę) — vartotojo įvesta ir taikyta keliems atvejams (Senna, Sucrativ, Raspberry, Ascophyllum, Curcum pirma partija) — GALIOJA TIK kai nėra atskiro vartotojo nurodymo keisti (žr. Glucosamine išimtį, kur vartotojas eksplicitiškai paprašė vis tiek padidinti iki pasverto kiekio).
  • Neigiamo likučio taisymas (Potassium chloride buvo -14.45kg) — sprendžiama kaip normali PUT su nauju kiekis, busena LIEKA 'Aktyvi' po atnaujinimo (patvirtinta serverio logika server.js:3998: naujasLikutisKg > 0 ? 'Aktyvi' : 'Sunaudota' — automatinis, nereikia rankiniu būdu keisti).
  • Sujungimas į tą patį LOT (Natural Lemon Flavour dviejų atskirų partijų, kai vartotojas paprašė „priskirk tampačiam lot") — sprendžiama tiesioginiu SQL UPDATE kiekis/likutis_kg pirmajai partijai, antrosios (tuščio LOT) eilutės pašalinimu.
  • BF inventorizuotų žaliavų PDF ataskaita sugeneruota (C:\Users\justa\Desktop\BF_inventorizuota_2026-07-17.pdf, 28 pozicijos) — vienkartinis scratch scriptas C:\vm\generate_bf_pdf.cjs, savaime išsivalęs po vykdymo.
  • Klientų trumpinių lentelė (BF/SM/DS/IPB/OFF/OF/DN) pridėta į CLAUDE.md kaip nuolatinė taisyklė visiems agentams — vartotojo tiesioginis prašymas Agy.
  • Supervizijos spraga pakartotinai patvirtinta: keli DB-write scriptai įvyko be matomo permission prompt'o (matyt, vartotojas kartais tiesiogiai sąveikauja su Agy terminalu lygiagrečiai su Claude priežiūra, arba veikė ankstesnė "always allow" sesijos apimtis) — visi post-factum SQL patikrinti ir teisingi.
  • 2026-07-17 sesijos naujienos

    Gavimai lango kortelės peržiūros modernizavimas (planas: C:\Users\justa\.claude\plans\kind-chasing-pinwheel.md, vartotojo patvirtintas srautas: eilutės paspaudimas iškart atidaro pilną langą, be tarpinio quick-menu):

  • Vienas būsenos šaltinis: computeGasStatus(card) (public/index.html ~9150) dabar VIENINTELĖ būsenos klasifikavimo funkcija — anksčiau Gavimai lentelės busenaText logika ir computeGasStatus buvo dvi atskiros, nesusietos implementacijos tų pačių reikšmių (rizika, kad ims nesutapti). Praplėsta computeGasStatus „vykdoma" šaka, kad padengtų IŠSIŲSTA/LIKO IŠSIŲSTI atvejus (kuriuos anksčiau žinojo tik busenaText), naudojant tą pačią sąlygų tvarką. „laukia" šakos LAUKIAM PLĖVELĖS atvejis papildomai tikrina _gavimoEntriesFor(card,'dez') sumą (ne tik dezuciu_statusas lauką) — tas pats fallback kaip anksčiau turėjo tik lentelė.
  • _buildGavimaiLentele busenaCellInner dabar kviečia computeGasStatus(card) vietoj savo atskiros logikos. Modalo viduje computeGasStatus skaičiuojama VIENĄ kartą render() pradžioje ir perduodama _korteleDetailHTML(card, recipe, {..., gasStatus}) per opts.gasStatus — pašalintas antras dubliuotas kvietimas.
  • „Info" tabas pašalintas iš openKorteleModal — buvo beveik tikslus „Kortelė" tabo (_korteleDetailHTML) poaibis (ta pati metaduomenų lentelė + 3 iš 4 progreso juostų). „Kortelė" liko vienintelis ir numatytasis (šis modalas VIS DAR EGZISTUOJA kode — žr. kitą punktą, kodėl).
  • Pirmoje versijoje eilutės paspaudimas Gavimai tabe atidarydavo šį openKorteleModal popup'ą su veiksmų mygtukais header'yje. VARTOTOJAS PAMATĖ IR ATMETĖ: „tas atsidares meniu nereikalingas, nesamonė... turi būti panašiai kaip Gaminama lange, tik su daugiau redagavimo/informacijos". Pertvarkyta antrą kartą tą pačią dieną — žr. žemiau.
  • Gavimai kortelės vaizdas #2 — inline pilnas puslapis vietoj popup'o (ta pati diena, iškart po pirmos versijos atmetimo; planas atnaujintas tame pačiame kind-chasing-pinwheel.md faile):

  • Nauja funkcija _renderGavimoKortelesDetalus(container, cardId) (public/index.html, prieš _pradetiIsVirtualaus) — stiliumi kaip _renderGamybaKortele (Maišomi tabo referencinis vaizdas): sticky header su „← Atgal į Gavimai", pavadinimas+LOT+EXP+statuso badge (computeGasStatus), veiksmų mygtukų eilutė (Spausdinti/PDF/Maišymai/Etiketės/Baigimo darbai/PALAIDI/Archyvuoti), po to turinio sekcijos: Plėvelė/Dėžutės gauta info (NAUJIENA — anksčiau pasiekiama TIK per lentelės mažus quick-edit langelius, dabar IR čia, per tą patį openGavimoIrasaiModal), 4 progreso juostos, Pakavimo grandinė (su ✎ redaguoti → openPakavimoQuickModal), Žaliavų atsargų tikrinimo lentelė (perkelta iš senojo _korteleDetailHTML), Rankinis Būsenos Keitimas (laukia/vykdoma/baigta), Staklių Darbo Būsena perjungimas, Maišymo kortelė spausdinimas, Baigti Gamybą.
  • Naujas navigacijos kintamasis _ginGavimaiCardId (mirror _ginMaisomiCardId pattern) — renderGaminamaGavimaiLentele() pradžioje tikrina jį ir rodo detalų vaizdą vietoj sąrašo/lentelės. Eilutės onclick dabar _ginGavimaiCardId='...';renderGaminamaGavimaiLentele(); (NE openKorteleModal).
  • openKorteleModal/_korteleDetailHTML PALIKTI KODE, NEPAŠALINTI — antrą kartą tą pačią dieną tyrimas rastas netikslus: openKorteleQuickMenu (kuris pats liko nepaliestas Paketeliai/Pauchai/Stickai tabuose) savo „Kortelė (info)" punkte vis dar kviečia openKorteleModal. Pamoka pakartotinai patvirtinta: PRIEŠ trinant bet kokią funkciją, grep'u tikrinti VISUS callerius, ne pasitikėti ankstesne prielaida, net jei ji jau kartą pasitvirtino kitam atvejui.
  • Patikrinta naršyklėje (wmux browser_evaluate): eilutės paspaudimas atidaro inline vaizdą (sąrašas dingsta, „← Atgal" atsiranda, NĖRA popup/overlay), badge sutampa su lentele keliems skirtingiems statusams, Plėvelė quick-edit langeliai atidaro openGavimoIrasaiModal, Baigimo darbai overlay atidaromas teisingai, „← Atgal" grąžina į sąrašą švariai, jokių konsolės klaidų.
  • Gavimai kortelės vaizdas #3 — GRĮŽTA quick-menu, inline vaizdas lieka pasiekiamas per jį (trečia iteracija tą pačią dieną — vartotojas: „tas langas kuris atsidaro su ta visa info nereikalingas, turi būti paprastas pasirinkimas, kaip Gaminama spaudžiant ant kortelės pavadinimo"):

  • Gavimai eilutės onclick GRĄŽINTAS į openKorteleQuickMenu('${card.id}', event, 'gavimai') — identiškas elgesys kaip Paketeliai/Pauchai/Stickai tabų gr-name-stack pavadinimo paspaudimas (tas pats bendras meniu, ne kažkas atskiro).
  • openKorteleQuickMenu(cardId, evt, context) gavo naują trečią (optional) parametrą context — kai context==='gavimai', meniu punktas „Kortelė (info)" veda į NAUJĄ inline vaizdą (_ginGavimaiCardId='...';renderGaminamaGavimaiLentele();, t.y. #2 versijos _renderGavimoKortelesDetalus); kitur (kai context neperduotas, Paketeliai/Pauchai/Stickai) — kaip anksčiau, į seną openKorteleModal popup'ą. Kitos 4 meniu pozicijos (Maišymai/Etiketės/Baigimo darbai/PALAIDI) tapačios visur, nekeistos.
  • Rezultatas: paspaudus produktą Gavimai tabe — atsidaro TAS PATS paprastas pasirinkimų meniu kaip Gaminama lange (jokio automatinio pilno vaizdo), o pasirinkus „Kortelė (info)" — nuvedama į #2 versijos inline puslapį (kuris savaime NEBUVO atmestas — tik jo AUTOMATINIS atidarymas vien paspaudus produktą).
  • Patikrinta naršyklėje: pavadinimo paspaudimas Gavimai tabe atidaro meniu (5 punktai), „Kortelė (info)" veda į inline vaizdą (jokio popup), Paketeliai tabo pavadinimo paspaudimas VIS DAR veda į seną openKorteleModal (nepaliesta, patikrinta atskirai) — jokių konsolės klaidų.
  • Pastaba ateičiai: šis flow perdarytas 3 kartus per vieną sesiją (popup → inline pilnas vaizdas → quick-menu + inline už jo) — kitą kartą panašaus masto UI pertvarkai verta parodyti trumpą aprašymą/mockup'ą PRIEŠ implementuojant, ne tik po pirmo bandymo realioje naršyklėje.
  • 2026-07-16 sesijos naujienos

    BF/DS fizinė inventorizacija per Telegram — visos dienos Agy priežiūros sesija (Claude nuolat stebėjo Agy terminalą per wmux, tvirtino kiekvieną DB-rašymo permission prompt tik po scripto peržiūros, po kiekvieno write independently patikrino SQL):

  • SPORT JOINTS: 6 trūkstami maišymai (po 75kg bazė) užregistruoti per POST .../registruoti-maisyma (dabar iš viso 16, sumaisytas_kiekis=163264.65). Šie maišymai proporcingai nurašė ir bendrą ingredientą Sipadry-Rice32 (Ryžių sirupo milteliai) — jos partija nswqhq7rlx88bg8 pakoreguota (PUT /api/gavimai/:id su jauSunaudota formule) iki tiksliai vartotojo nurodyto FAKTINIO fizinio likučio 550.00 kg, nepriklausomai nuo FIFO skaičiavimo rezultato.
  • DS Maca powder: rasta ir ištaisyta Agy pačios klaida — rytinis 20kg įrašas buvo klaidingai priimtas kaip SENOS partijos pakeitimas/sumažinimas, ne priedas. Ištaisyta: sena partija (LOT M01O-250916) grąžinta į 273kg + pridėti 20kg = 293kg, antra nauja partija (LOT M01O-251123) 14kg, bendra suma 307kg = 273 (vakar) + 34 (šiandien, 20+14 dviem partijom) — tiksliai atitiko vartotojo nurodytą kiekį.
  • BF žaliavos, patikrintos/suderintos šios sesijos metu (visos su inventorizuota_data='2026-07-16' žyma): Ekologiškas cukrus ECO (2350kg, be pakeitimo, tik žyma), Tri Natrium Citrate/GADOT TSC (partija suderinta iki 850.00kg), Citric Acid E330 (nauja partija AX2-2504-139/550kg sukurta, sena partija THW212126 nulinta pagal vartotojo prašymą — nes „jos kolkas nėra" sandėlyje), TCC M7090/Kalcis (140kg, LOT ištaisytas į 3065359), Glucidex IT 19/Maltodekstrinas (nauja partija LOT 1226352/75kg, sena partija nulinta, rytoj +50kg papildomai žadėta), L-Glycine (SENA-SHEETS placeholder pakeistas tikrais duomenimis, 45kg — vartotojo korekcija, ne 46kg kaip Agy iš pradžių siūlė pagal pasvertą kiekį), Sodium Carbonate/Soda (24.50kg = du atskiri pranešimai 10+14.5kg sudėti), Boswellia serata (10kg).
  • Pastebėjimas ateičiai: kelis kartus DB write įvyko TARP Claude ScheduleWakeup patikrinimų (60-90s intervalas per didelis santykinai su Agy vykdymo greičiu) — scriptas buvo sukurtas IR įvykdytas per vieną Agy „turn", kol Claude dar nespėjo perskaityti permission prompt'o. Visais atvejais rezultatas independently patikrintas SQL POST FACTO ir buvo teisingas, bet tai reiškia, kad realaus laiko „patikrink PRIEŠ approve" garantija nėra 100% — verify-after lieka svarbiausia apsauga.
  • „Nulinimo" pattern pakartotas keliose vietose (Citric Acid, Glucidex): kai sena partija fiziškai nebeegzistuoja sandėlyje, TEISINGAS būdas yra PUT /api/gavimai/:id su kiekis = jauSunaudota (t.y. senas_kiekis - senas_likutis_kg), kas duoda likutis_kg≈0 IŠLAIKANT eilutę DB (audito pėdsakas), NE literalus DELETE FROM zaliavu_gavimai.
  • Žaliavos pakaitalas maišymo kortelėje (kito tiekėjo atveju) — planas: C:\Users\justa\.claude\plans\kind-chasing-pinwheel.md. Vartotojo idėja per BF inventorizaciją: jei receptui priskirtos žaliavos vietoj naudojamas kito tiekėjo analogas, maišymo registravimas turi nurašyti nuo TOS žaliavos, ne recepto numatytosios.

  • Naujas nullable stulpelis gamybos_korteles.maisymo_pakaitalai (JSON {originali_zaliava_id: pakaitalo_zaliava_id}), migracija idiomu kaip faktiniai_duomenys (server.js ~759, ~1414).
  • Naujas endpoint PUT /api/gamybos-korteles/:id/pakaitalas {originali_zaliava_id, pakaitalo_zaliava_id} (pastarasis null = išvalyti). Validuoja, kad pakaitalo žaliava egzistuoja.
  • POST .../registruoti-maisyma (~2069 eil.): prieš nurašymo ciklą skaito card.maisymo_pakaitalai, kiekvienam ingredientui actualZaliavaId = pakaitalai[ing.zaliava_id] || ing.zaliava_id — fifoConsume IR nurasymai.zaliava_id naudoja FAKTINĘ (pakaitalo) žaliavą, bazinio ingrediento/santykio paieška lieka susieta su originalia recepto zaliava_id.
  • Spąstas, kurį pagavau IŠ KARTO testuojant: GET /api/gamybos-korteles (~1487 eil.) negrąžina SELECT k.* tiesiogiai frontend'ui — kortelė sudaroma per RANKINIU BŪDU surašytą lauko sąrašą (result = cards.map(card => ({id:..., ...}))). Naujas SQLite stulpelis AUTOMATIŠKAI NEATSIRANDA API atsakyme, kol nepridedamas RANKA prie šio mapping objekto — pridėta maisymo_pakaitalai: card.maisymo_pakaitalai || '' (~1591 eil.). Bet koks naujas gamybos_korteles stulpelis, kurį turi matyti UI, TURI būti pridėtas čia, ne tik migracijoje.
  • UI (public/index.html): buildIngRow (~5005) rodo 🔄 mygtuką prie kiekvieno ingrediento + „→ pakaitalas: X" žymą, jei aktyvus; naujas izoliuotas picker modalas _openPakaitalasPicker/_pakZalAC/_pakZalSel/_savePakaitalas (~5850+, kopija pzZalAC paieškos šablono, NEgeneralizuojant esamo Priimti srauto); _openGamybaMaisymasModal/_gmCalc bazinio ingrediento ). _printZaliavosKlientoPDF() išplėsta: kai nepasirinktas konkretus klientas (code tuščias), naudoja window._selectedZaliavosClient — jei 'bendros' → tik nepriskirtos žaliavos, kitaip ('visi'/default) → BENDRA ataskaita visoms žaliavoms. Abu naudojimo keliai (Klientai tabas su konkrečiu kodu, Žaliavos langas be kodo) veikia per tą pačią funkciją.
  • wmux pane targeting — tylus klaidingas nukreipimas (žr. atmintį feedback_wmux_pane_targeting.md): mcp__wmux__terminal_read su paneId, nustatytu į Agy pane'o ID/ptyId, TYLIAI grąžino MANO PAČIOS aktyvios Claude Code sesijos pty turinį (be klaidos!) — atsakymo ptyId laukas rodė neteisingą pty. Patikima alternatyva: skaityti tiesiai iš C:/Users/justa/.wmux/buffers/.buf (ANSI kodus nuvalius regex'u). terminal_send su explicit ptyId VEIKĖ teisingai (atsakymo ptyId sutapo su prašytu) — problema tik terminal_read pusėje šiame setup'e.

    2026-07-14 sesijos naujienos (commit'ai 0358700…0702728)

  • Važtaraščiai — Dėžutės UX + rikiavimo fix: „Kiek DĖŽIŲ (kartonų)" ir „Viso vnt. dėžučių" dabar atskiri laukai (anksčiau vienas laukas maišė abi reikšmes) + „Viską" mygtukas užpildo pilną gauto kiekio sumą į vnt. laukelį, nekeisdamas vartotojo įvesto kartonų skaičiaus. Rikiavimo šaknies fix: sąrašas anksčiau rikiuodavosi pagal redaguojamą pristatymo datą (data), todėl naujas nurašymas „paskęsdavo" tarp senų įrašų — dabar rikiuojama pagal TIKRĄ sukūrimo laiką (created). PocketBase kolekcijos schema NEREGISTRUOJA created/updated laukų (senas rankinės migracijos likutis) — pb.create() juos tyliai numeta, todėl /api/nurasyti-vaztarasti juos rašo TIESIOGIAI per SQLite po pb.create(), o GET /api/vaztarasciai irgi skaito tiesiai per SQLite (ORDER BY created DESC), apeinant PB apribojimą. Realus incidentas: BF važtaraštis VM-20260710-2 buvo dubliuotas (vartotojas nesulaukęs sėkmės pranešimo paspaudė „Nurašyti" antrą kartą) — 6 isvezimai + 6 gamybos_zurnalas IŠVEŽTA įrašai buvo dvigubi, likutis dirbtinai sumažintas dvigubai; dublikatas ištrintas, likutis atstatytas.
  • PDF mygtukas kiekvienam važtaraščiui istorijoje: „Visi važtaraščiai" sąraše prie kiekvieno įrašo naujas „PDF" mygtukas (vzDownloadPDFFromHistory) — generuoja PDF iš jau išsaugoto payload, nereikia pirma atidaryti „Žiūrėti".
  • Telegram — žaliavų inventorizacijos meniu (naujas, telegram-bot.js): „🔍 Inventorizacija" pagrindiniame meniu — rodo eilę (pirmiausia niekada netikrintos, tada seniausiai tikrintos žaliavos), pasirinkus žaliavą prašo faktinio (susverto) kiekio, įrašo kaip naują zaliavos.likutis, pažymi inventorizuota_data (nauja SQLite kolona) ir palieka audito įrašą gamybos_zurnalas (veiksmas INVENTORIZUOTA). Skirta palaipsniui (po kelias per dieną) susisverti visą sandėlį.
  • KRITINIS Telegram bugfix — ID su _ laužė action.split('_')[1]: 80 iš 249 žaliavų (visos BF importuotos, id formatas z_bf_...) ir 2 gamybos_korteles turi _ savo ID viduje — senas action.split('_')[1] nukirsdavo ID iki pirmos dalies, DB paieška negrąžindavo nieko. Paveikė 14 vietų (invSel_, monC_, tStart_, editSt_, editPak_, hist_, finish_, confirmF_, mSel_, zSel_, pSel_, dSel_, eL_, dL_, laukia_stakliu_/pakuotes_/log_). Fix: naujas idPart(action) helperis (viskas po PIRMO _, ne split[1]).
  • Gamybos lango pertvarka (3 dalys, uzduotis Agy #28) — planavimo langas „Gamyba" panaikintas iš šoninio meniu, funkcijos sujungtos į „Gaminama" (sidebar dabar pervadinta atgal į „Gamyba", nes senasis pavadinimas atsilaisvino):
  • 1. Maišomi tab → Gaminama (renderMaisomiGaminamoje(), openMaisymaiDetails(cardId)) — naudoja tą pačią _renderGamybaKortele() su nauju gaminamoje parametru teisingam „Atgal" navigavimui; visi refresh taškai (_submitGamybaMaisymas, _baigtGamyba, registruoti-maisyma) tikrina kontekstą (_gamybaCardId vs _ginMaisomiCardId).

    2. Pouch sandėlis → naujas mygtukas Gaminama „Pauchai" tabe (openPouchSandelioModal()), unifikuotas _pouchSandelisRefreshed() atnaujina teisingą kontekstą (senas Gamyba langas ARBA naujas modalas).

    3. PALAIDI žyma pridėta į Gaminama quick-menu (openKorteleQuickMenu) — anksčiau buvo tik senos Gamyba lango kortelėje.

    Senos render funkcijos (_renderGamybaLangas, renderGamybaTab ir kt.) PALIKTOS kode, nebepasiekiamos per UI — pilnas išvalymas atskirai, kai patvirtinta, kad nieko netrūksta realiame naudojime.

  • Rezervacija — „Planuoti gamybą": naujam (dar be kortelės) įrašui mygtukas sukuria realią gamybos_kortele BE lot/exp → pleveles_statusas/dezuciu_statusas automatiškai 'Laukia' (server.js /api/gamybos-korteles logika) — kortelė iškart matoma Gavimai kaip „SUPLANUOTA".
  • PALAIDI archyvavimo fix: „Baigimo darbai" meniu PALAIDI žymos kortelėms (kaip ir pouch tipui) dabar vienas bendras „✅ Gamyba baigta" mygtukas vietoj dirbtinio atskiro „Pakavimas baigtas" žingsnio — PALAIDI siunčiama tiesiai iš pagaminto kiekio, pakavimo iš viso nėra.
  • Infrastruktūra: Agy (Gemini/Antigravity CLI) veikia TAME PAČIAME wmux workspace kaip Claude (pane_list() rodo abu — Agy pane su agentName: null, nes jos signatūra neatpažįstama automatiškai) — Claude gali tiesiogiai terminal_send/terminal_read jos pultą šioje sesijoje, ne tik per agy-uzduotis.md failą. node --watch server.js PERKRAUNA visą procesą (įskaitant telegram-bot.js) po BET KURIO watched failo pakeitimo — sena atmintis „TG boto restart reikalingas atskirai" PASENUSI/NETEISINGA šiam setup'ui.
  • 2026-07-13 sesijos naujienos (commit'ai 4902edc…13c5d49)

  • Maišymo kortelė — Premix Su/Be perjungiklis: šalia „Nuostoliai" naujas mygtukų porinys (window._gkPremix, 1=su/0=be), siunčiamas kaip ?premix=0 į /api/gamybos-korteles/:id/kortele-html (serveris jau mokėjo šį parametrą — trūko tik UI). Pasirinkimas išsilaiko tarp kortelių.
  • Gamybos lango kortelė — PALAIDI perjungiklis: naujas „📦 Palaidi" mygtukas veiksmų juostoje (_togglePalaidi()) — uždeda/nuima tag='PALAIDI' per PATCH, įjungiant automatiškai nustato dezuciu_statusas='Gauta' (nebereikalauja plėvelės/dėžučių). Antraštėje geltonas ženkliukas, checklist rodo „Gaminama palaidais — pakuotės nereikia".
  • Etikečių šablonas juoda-balta: .lbl-top/.lbl-bot nebeturi #f2f2f2 fono (spausdintuve virsdavo pilkais taškeliais) — juodos skiriančios linijos vietoj pilkų.
  • Palaidžių etikečių EXP fix: palaidi režimas anksčiau „vnt./pakuotėje" tekstu UŽIMDAVO EXP vietą apačioje — palaidžių etiketės (pvz. SPORT CREATINE) spausdinosi BE galiojimo datos. Dabar kiekis rodomas viduryje, EXP visada apačioje kaip visiems. Pataisyta abiejuose šablonuose (/api/etiketes-laisvos + regioninis openEtiketesModal).
  • Važtaraštis — „Dėžutės" (buvęs „Tuščia tara"): laisvo teksto laukas pakeistas pasirinkimu iš REGISTRUOTŲ dėžučių gavimų (/api/vaztarastis-duomenys naujas laukas dezutes — agreguota iš gamybos_zurnalas WHERE veiksmas LIKE 'Gauta dėžutės%', apima regioninius variantus „(LT)"/„(LV/EE)"). Pasirinkus — LOT/EXP automatiškai; laisvas tekstas liko kaip atsarginė galimybė. LOT/EXP parseris sutvirtintas (senas duomenų kokybės atvejis — dubliuota data be tikro LOT, pvz. SELENE).
  • Važtaraščio PALAIDI eilutės „Dėžučių/dėž." stulpelis: rodydavo recepto MAŽMENINĖS pakuotės reikšmę (pvz. 30), kuri palaidiems neturi prasmės (nėra tarpinio dėžutė→dėžė sluoksnio). Pataisyta šaltinyje (vzAddItemToPallet) IR abiejuose atvaizdavimo keliuose (klientinis vzBuildVaztarastisHtml + serverio prodRow istorijos/archyvo peržiūrai) — pasitaiso ir jau išsaugoti seni važtaraščiai.
  • Rezervacija — tabas vietoj modalo (Agy #35): perkelta iš header mygtuko į Gaminama filtrų juostą (filterByTipas('rezervacija') → renderRezervacijaWidescreen()); naujas „Galima pagaminti" MRP stulpelis (min per ingredientus stock/norma, ribojama iki liko) ir „Skirta:" produktų sąrašas žaliavų poreikio lentelėje; sąrašas išsaugomas localStorage.vm_rezervacija_items.
  • DB duomenų atkūrimas iš senos Sheets sistemos (rankinis SQL, ne kodas): SPORT JOINTS receptas visai neegzistavo DB — atkurtas su 9 ingredientų sudėtimi (16,5 g/pktl) iš Excel „SPORT JOINTS MIX"; kortelė LOT D260327 (EXP tikslintas į tikrą 2029-02-28 iš žurnalo), PALAIDI, planas 200 000, pagaminta/išvežta 82 800, 8 istoriniai maišymo įrašai (81 632 vnt). BF žaliavų gavimų (zaliavu_gavimai) LOT/EXP praturtinta iš Excel „Žaliavų gavimas" — 87/89 SENA-SHEETS placeholder įrašų gavo tikrus LOT/EXP/tiekėją (normalizuotas + fuzzy vardų atitikimas).
  • darbo_laikas korekcijos: vasario/kovo mėn. istorija ištrinta (26 įrašai, vartotojo prašymu, po DB backup); liepos 09 sujungta į vieną 4,5 val. įrašą, 07-10 pridėta 4 val. (pamiršta įsirašyti).
  • 2026-07-10 sesijos naujienos (commit'ai 60d3969…e2d2f76)

  • NAUJOS DB LENTELĖS: vaztarasciu_juodrasciai (id, pavadinimas, turinys JSON, created, updated) — važtaraščio formavimas dalimis; veiklos_zurnalas (id AUTOINCREMENT, laikas, saltinis, aprasymas) — veiklos istorija, laikoma ~500 naujausių.
  • NAUJI API: /api/vz-juodrasciai GET/GET:id/POST(upsert)/DELETE; /api/veikla?limit= — veiklos sąrašas. X-Saltinis konvencija: mobile.html VISOS užklausos siunčia X-Saltinis: telefonas antraštę (globalus fetch wrapper prie const API); serverio middleware (server.js viršus, po express.json) automatiškai loguoja visus sėkmingus POST/PUT/PATCH/DELETE į veiklos_zurnalas su šaltiniu 💻/📱; TG botas rašo pats ✈️ (maišymai; boto restart reikalingas pakeitimui įsigalioti).
  • Važtaraščio juodraščiai serveryje: mygtukas „💾 Išsaugoti juodraštį" formos apačioje, „Nebaigti važtaraščiai" juosta viršuje su Tęsti/Šalinti; vzApplyDraft() bendras atkūrimas (localStorage F5-draft + serverio); VZ_DRAFT_ID upsert'ui; nurašius — juodraštis auto-trinamas. „Pridėti naują paletę" — pilno pločio mygtukas PO palečių sąrašu + autoscroll prie naujos.
  • Etikečių suvienodinimas (BAIGTA): vienintelis produkto etikečių generatorius /api/etiketes-laisvos; kortelės quick-menu ir kortelės modalo „Etiketės" → openEtiketesForCard() → kompaktiškas modalas su preselect (openEtiketesLaisvosModal(receptasId)); IŠTRINTA _etiketesGeneratorHTML+_spausdintiEtiketes (~200 eil. seno šablono). Šablonas: BE „Maisto papildas", „Laikoma iki +30°C" visiems tipams, vnt./dėžėje kai žinoma. Lapų skaičiavimas visam užsakymui (dėžės=planas/pak_dezeje, 24/lapas, SL—14) + autofill desktop modale ir mobile.
  • Maišymo kortelės bazė TIKSLI: įvedus 80 kg bazės — rodo lygiai 80 kg nepriklausomai nuo nuostolių % (trupmeninis ratio vietoj Math.floor pktl; sveiki pktl tik išeigos label'ui ir pilnų maišymų skaičiavimui) — buildIngRows, gkUpdateIng (index) + pktlPerSessionExact (server kortele-html).
  • KPI patikslinimai: POUCH registravimai skaičiuojasi ir į Pagaminta, ir į Sudėta; KPI detalus panelis nebeskaičiuoja „STAKLĖS ✓" (kumuliacinė užbaigimo žymė, ne produkcija) — sumos sutampa su kortelėmis.
  • Mobile KRITINIAI fix'ai (Agy auditas #30 → mobile-api-auditas.md): maišymo registravimas NIEKADA neveikė (recipe.ingredients vs API ingredientai — 4 vietos); pouch staklės → /registruoti-pouch su {pakeliai} (abu kiekiai kartu); c.busena→c.statusas; /api/mobilus/priimti priima body.siuntejas.
  • Važtaraščio vaiduokliniai likučiai fix: /api/vaztarastis-duomenys filtravo statusas != 'archyvuota' — bet archyvavimas žymimas archyvuota DATOS stulpelyje (statusas lieka 'baigta')! Dabar archyvuota IS NULL OR ''. DS išvalyta: Creatine dublikatinis POUCH 280 ištrintas (fiziškai 7 dėžės), 2 senos banana cream kortelės archyvuotos.
  • Spalvoti modalai: Nauja (violetinis)/Etiketės (gintarinis)/Rezervacija (žalias) — gradientinės antraštės kaip Priimti.
  • Infra: GitHub push VEIKIA (gh auth zulikas87, credential helper — paprastas git push); /cm komanda (.claude/commands/cm.md): DB VACUUM snapshot + zip + 7 rotacija _backup_auto/ + commit + push; herdr 0.7.2-preview įdiegtas bandymams (žr. atmintį reference_herdr); Veiklos panelis — 🕘 mygtukas header'yje.
  • 2026-07-09 sesijos naujienos

  • Gavimai (Gaminama) tabas: mygtukas perkeltas prie klientų filtro (.gavimai-btn stilius); rūšiavimo/filtro dropdown (_gavimaiSort: naujausi/seniausi/pavadinimas + tip_* pakuotės tipo filtras); kliento filtras neišmeta iš lentelės (filterByKlientas šaka); archyvuotų kortelių gavimai neberodo virtualių eilučių (LOT/pavadinimas+data match prieš /api/istorija → window._archyvuotosKorteles); langelių redagavimas PO VIENĄ parametrą (openGavimoIrasaiModal(ref, tipas, laukas), virtualioms — virt:); „planas: X vnt." kai dėžučių negauta; multi-regionų dėžutės rodomos atskiromis eilutėmis langelyje; EXP sutapimo indikacija (žalia = plėvelės/dėžučių galiojimai sutampa, raudona = ne, _expCmp iki trumpesnio tikslumo); nauja būsena GALIMA GAMINTI (žalia, kai visos medžiagos gautos, gamyba nepradėta).
  • Važtaraščio nepilnos dėžės fix: mobile formato payload (vnt = tik laisvi vnt., pakDezeje factor) — nepilna dėžė dabar +1 prie dėžių sk. mobile peržiūroje/viso_deziu ir serverio archyvo HTML (sumMap, prodRow išskaidymas į „Nepilna dėžė" eilutę, palDez). Desktop formatas visada buvo teisingas.
  • POST /api/tg-zinute {chatId, tekstas} + siustiTgZinute() (telegram-bot.js) — laisvos žinutės iš lokalių agentų. Agy užduotis #27: nuolatinis TG foto inbox budėjimas (read-only DB, praneša vartotojui į TG; būsena DRIVE/telegram-foto/_agy_perziureta.json). Agy prompt'ų priežiūra — background watcher (scratchpad agy-watcher.js, seka ~/.wmux/buffers/.buf), žr. atmintį feedback_agy_confirmations.
  • Maišymo kortelė (kortele-html): PREMIX grupavimas — smulkūs ingredientai (<0.25 g/pktl arba <2% svorio, kaip UI _premixSmulkus) rodomi viena PREMIX eilute su sudėties išnaša; išjungimas ?premix=0; negrupuojama, jei bazė — smulkusis.
  • Mobile paieška (cardAC): receptai be kortelės ieškomi includes (ne startsWith), pradžios atitikmenys pirmi — „titan" randa „VITAL TITAN COMPLEX".
  • DB tvarkymas: OF žaliavų migracija UŽBAIGTA (17 žaliavų; Potassium citrate inventorizuotas 730→170 kg — KALIS 650 A260416 gamyba senoje sistemoje nenurašyta); TITAN kortelė sukurta SUPLANUOTA (planas 226 500, LOT A260430); SPORT CREATINE multi-regionai LT 2720 / LV/EE 1840 dėž. (EXP 2027-12-31); Whey Isolete & Creatine tipas pouch→stick; Fiber A260629 užbaigtas ir archyvuotas; HYDRO FORTE / Beef Broth B260611 šiukšlės išvalytos.
  • 2026-07-07/08 sesijų naujienos (dokumentuota 2026-07-08, commit'ai 0404cbe…f0c8a42)

  • Gavimai lentelė perkelta iš Gamybos lango į Gaminama (b3b6e16): dabar tai Gaminama (pagrindinio) lango tabas _pagrindinisTab === 'gavimai' → renderGaminamaGavimaiLentele() → _buildGavimaiLentele() (busena spalvų logika ~3174). _gamybaLangasTab liko tik 4 reikšmės (maisomi/paketeliai/pauchai/stickai). Lentelė = gamybos būklės dashboard'as (kaip senas Sheets): viena eilutė = viena kortelė, grupės Plėvelė/Dėžutės/Gamyba + spalvotas Busena stulpelis (SUPLANUOTA/LAUKIAM PLĖVELĖS/GAMINAMA/LIKO SUDĖTI/LIKO IŠSIŲSTI). Virtualios eilutės: produktai su gauta plėvele/dėžutėmis be kortelės rodomi iškart, _pradetiIsVirtualaus() leidžia įvesti planą ir paleisti gamybą vienu paspaudimu. LOT/EXP/kiekio redagavimas tiesiai lentelės langeliuose.
  • Nauja „📋 Rezervacija" funkcija (5d7095e…f0c8a42, Gaminama lango skydelis): keli produktai (aktyvios kortelės arba receptai) su planuojamu kiekiu → bendras žaliavų poreikis vs sandėlio likutis, trūkumo paryškinimas. Sumaišyta/Liko rodo „kg — vnt." formatu (vnt. apvalinti), PDF su gulsčio/stačio pasirinkimu.
  • Maišymo kortelės spausdinimo perdizainas (5d7095e): „Viso užsakymui" stulpelis, kompaktiškas pilnų maišymų tinklelis (paskutinis kintamas maišymas — atskira pilna eilutė), LOT/Galiojimas stulpeliai žaliavų lentelėje (iš zaliavu_gavimai).
  • Multi-regionų kortelė BACK TO LIFE LT/LV/palaidi (0404cbe): regiono SUDĖTA registravimas „dėžės.dėžutės" formatu (pvz. 10.20); pataisyta — SUDĖTA žurnalo įrašo trynimas/keitimas dabar perskaičiuoja KIEKVIENO regiono supakuota_kiekis. Važtaraštyje regiono pasirinkimas prekės pridėjime.
  • Važtaraščio juodraščio autosave (35b1443, localStorage): F5 nebeištrina suvesto krovinio, siūloma atkurti. Pridėtas „Dėžučių/dėž." stulpelis PDF lentelėje. Spausdinimo lūžio fix: display:flex → display:table „Išdavė/Priėmė" eilutei (flex nepaklūsta page-break-inside).
  • Mobile Priėmimas → Plėvelė (b3b6e16): vieninga produktų paieška (aktyvios kortelės + receptai viename sąraše), sistema pati sprendžia kurti naują kortelę ar priskirti esamą. Pouch veiksmo mapping fix (buvo „Priimta žaliava").
  • 2026-07-05 sesijos naujienos

  • Telegram boto interaktyvus monitorius (3 etapas) (telegram-bot.js): rodytiMonitoriu(chatId, editMsgId?) dabar siunčia VIENĄ žinutę su visų aktyvių kortelių suvestine (iki 12, progress barai + ⚙️/📦 skaičiai) vietoj iki 8 atskirų žinučių. Numerių mygtukai (monC_) atidaro kortelės detales TOJE PAČIOJE žinutėje (rodytiMonitoriausKortele, per editMessageText), su veiksmais (Maišymas/Staklės/Pakavimas/Istorija/Baigti — seni callback'ai nepaliesti) ir ⬅️ Atgal į sąrašą (mon_ref). Nauji callback'ai: mon_ref (atnaujinti/atgal), mon_menu (į pagrindinį meniu). Helper siustiArbaRedaguoti() — edit su fallback į naują žinutę; „message is not modified" ignoruojama. ltLaikas() — Vilniaus laikas HH:MM:SS antraštėje (garantuoja, kad refresh tekstas visada skiriasi).
  • hdr() saugumo pataisa: title/sub dabar escape'inami PAČIOJE funkcijoje (uppercase PRIEŠ escHtml, kad nesulaužytų &). Pataisė latentinius parse bug'us kvietimuose su produktų pavadinimais/vartotojų vardais (eil. ~736, ~932). Taisyklė: į hdr() perduoti GRYNĄ tekstą, ne HTML.
  • Mobile UI v3 — pilnas dizaino modernizavimas (public/mobile.html): nauja dizaino tokenų sistema su dviguba tema (tamsi numatytoji + šviesi per data-theme="light" ant , saugoma localStorage.vm_theme, inline skriptas prieš CSS — flash prevencija). Temos perjungiklis header'yje (#themeBtn, toggleTheme()). Aurora fonas (body::before radial gradientai per --aurora-*), plaukiojantis nav dokas, segmented tab-bar, skeleton shimmer kraunant (.skeleton), pull-to-refresh (setupPTR(), #ptr), haptinis atsakas (haptic() — Telegram WebApp HapticFeedback arba navigator.vibrate), KPI count-up animacija (animateKpiValues(), _kpiAnimated guard), sheet uždarymas braukiant žemyn už rankenėlės (setupSheetDrag()).
  • SVARBU dizainui: visi seni klasių ir CSS kintamųjų pavadinimai IŠLAIKYTI (JS render funkcijos nepaliestos). Nauji tokenai: --c-accent (anksčiau naudotas, bet neapibrėžtas — bug pataisytas), --surface-2, --shadow-card, --shadow-pop, --nav-bg, --nav-active-bg, --sk-shine, --focus-ring, --g-accent. Inline hardcoded rgba(255,255,255,...) fonai JS šablonuose pakeisti į tokenus, kad veiktų šviesi tema.
  • Bug fix: KPI detalės sheet'o paantraštė rodė užkoduotą „Birželio mėn." — dabar mėnuo skaičiuojamas iš state.stats.menuo.
  • Serverio pastaba: po perkrovimo server.js nebuvo pasileidęs (dėl to mobili programa neatsidarė per Tailscale 100.107.91.5:3000) — paleistas rankomis. start-background.ps1 auto-start vertėtų patikrinti.
  • 2026-07-04 sesijos naujienos

  • Telegram foto inbox (C:\VM\DRIVE\telegram-foto\) — vartotojas siunčia botui nuotrauką (žaliavos etiketė) → botas parsisiunčia į šį aplanką kaip foto_.jpg, nustato būseną laukia_foto_kiekio:, laukia kito teksto pranešimo su kiekiu → įrašo .json sidecar ({kiekis, from, chatId, data}) tuo pačiu vardu. Niekada neįrašo į DB automatiškai — tai tik surinkimo mechanizmas, Claude/Agy patikrina rankomis pagal bendrą „žiūrėk nuotrauką“ taisyklę (žr. AGENTS.md).
  • Telegram pranešimų modernizavimas — informuotiKitus/informuotiAdminus ir 5 darbuotojo patvirtinimo žinutės (STAKLĖS/PAKAVIMAS/MAIŠYMAS) dabar naudoja hdr() helperį (antraštė + ▰ skirtukas + laiko žyma Europe/Vilnius). informuotiKitus (su darbuotojo vardu) dabar siunčiama TIK Admin/Direktorius rolei, ne visiems aktyviems darbuotojams (privatumo pakeitimas 2026-07-04).
  • Nauji OF (Optifarma) raw materials — pilnai užpildyti realiais likučiais (Acerola, Bamboo, Collagen, Glucosamine, Glycine, Zinc citrate, Sodium hyaluronate ir kt.) po žaliavų likučių analizės (of-titan-likuciai-analize.md) ir Telegram foto gavimų. „VITAL TITAN COMPLEX“ (rec_titan_of) receptas dabar turi visas 12 ingredientų su teigiamu likučiu — gamyba galima (ribojantis faktorius: Glycine, ~262 900 vnt.).
  • BF žaliavų likučių analizė (bf-zaliavu-likuciai-analize.md) atlikta — parodė, kad DAUGUMA BF žaliavų DB yra 0/neigiamos, o Excel rodo daug didesnius teorinius likučius (pvz. Ekologiškas cukrus ECO: Excel 4020kg vs DB 0kg). Migracija dar NEATLIKTA — laukiama sprendimo, kaip tvarkyti.
  • Žr. [[klaidos]] #3 — svarbus pouch kortelių kūrimo per API spąstas (reikia pirma pakuociu_sandelis įrašo).
  • ---

    1. PROJEKTO ESMĖ

    VM (buvęs TMA MES) — gamybos valdymo sistema Daily Spoon (DS) maisto gamybai.

  • Maistiniai papildai (paketeliai, pouchai, stickai)
  • Receptūrų, LOT numerių ir EXP datų sekimas
  • Gamybos kortelių kūrimas ir valdymas
  • Spausdinimas (važtaraščiai, gamybos kortelės PDF)
  • Pakuočių tipai (pakuotes_tipas)

    VertėUI pavadinimasFizinis tipasGamybos būdas |

    |-------|---------------|---------------|---------------|

    'plevele'PaketeliaiSachet — plokščia maža pakuotėPlėvelė ritinyje → staklinė formuoja ir užpildo |
    'pouch'PauchaiPouch — didelė stovinčio maiši pakuotėMišinys pilamas į jau pagamintą maišą iš tiekėjo |
    'stick'StickaiStick — pailga siaura pakuotėPlėvelė ritinyje → staklinė formuoja stick formą |

    > Esminis skirtumas:

    > - plevele + stick → pakuotė formuojama iš plėvelės rulono staklinėje (LOT/EXP ant rulono)

    > - pouch → pakuotė jau pagaminta tiekėjo, gaunama gatava — mišinys tik įpilamas (LOT/EXP ant maišo)

    ---

    2b. GAMYBOS DETALĖS PAGAL TIPĄ

    🎞 Paketeliai (Sachet) — 'plevele'

    Mašinos:

  • Turpack — horizontalaus arba vertikalaus pakavimo
  • x2 = vieno kanalo (1 eilutė), x4 = dviejų kanalų (2 eilutės vienu metu)
  • Plėvelės formatas priklauso nuo staklinės tipo (horizontali/vertikali) ir kanalų skaičiaus
  • Rekomenduojama mašina saugoma recepto lygyje (pvz. "šis produktas byra ant x2, gaminti x4")
  • LOT sistema:

  • Formatas: [Raidė][DDMMYY] → pvz. A260617, B260617
  • Raidė = eilės numeris sąskaitoje (A = pirmoji plėvelė, B = antroji...)
  • Data = gavimo data
  • Vienas LOT = visas gautas kiekis (ne per ruloną)
  • Gamybos eiga:

    1. Plėvelė registruojama gavimo dieną → LOT priskiriamas automatiškai

    2. Staklinė gamina → paketeliai krenta į dėžes → dėžės į paletę → pakavimas

    3. Palaidi variantas: dalis arba visas kiekis — transportinės dėžės (be retail dėžučių)

    4. Svoris tikrinamas pasirinktinai gamyboje, brokas atrenkami pakavime

    Pakavimo info: recepto lygmenyje (kiek vnt. į dėžutę, dėžučių į kartoną ir pan.)

    ---

    🥢 Stickai (Stick) — 'stick'

    Mašinos: Kinų gamybos staklinės (ne Turpack)

    LOT sistema: Tokia pati kaip paketelių ([Raidė][DDMMYY])

    Gamybos eiga: Analogiška paketelių — gali eiti į retail dėžutes arba palaidi transportinėse

    Šiuo metu: nėra specifinių gamybos sunkumų

    ---

    🥤 Pouchai (Pouch) — 'pouch'

    Pildymas:

  • Dalis produktų — rankiniu būdu (dėl byrejimo)
  • Kiti — per aparatą, svoris patikrinamas ant svarstyklių
  • Po pildymo: zip užspaudžiamas → praleidžiamas per heat sealer (viršūnė užklijuojama)
  • LOT/EXP: Nurodo užsakovas (serija + galiojimas). Šiuo metu stampuojama ant kiekvieno poucho. Ateityje — gali ateiti jau su data iš tiekėjo.

    Gamybos kortelė: Užsakovas pasako kiekį + seriją + galiojimą → įvedama ranka sistemoje. Ateityje — failo importas.

    Kokybė: Šiuo metu kiekvienas pouchas pasveramas.

    Pakavimas: Tik transportinės dėžės (didelė gramai → retail dėžučių nėra). Ant dėžių klijuojamos atspausdintos etiketės.

    DS specifika: Užsakovo serija netaikoma — tik EXP data ir kiekis.

    Pouch gamybos kortelės UI pertvarka (Session 4):

  • DĖŽĖS blokas: Pašalintas įprastas retail pakavimo baras. Vietoje jo atvaizduojamas žalias, neinteraktyvus DĖŽĖS blokas, kuris automatiškai skaičiuoja pilnų dėžių skaičių ($\lfloor\text{kiekis} / \text{pak\_dezeje}\rfloor$) bei nepilnos dėžės likutį.
  • PILDYMAS blokas: Gamybos (staklių) baras pervadintas į PILDYMAS (oranžinė spalva, naudoja droplets piktogramą). Jį paspaudus registruojamas pagamintas kiekis.
  • allDone logika: Pouchams užbaigti kortelę pakanka tik staklių pabaigos požymio: allDone = card.stakles_baigtos (vietoj abiejų staklių ir pakavimo baigimo tikrinimo).
  • Kortelių vizualinis stilius UI:

  • Šoninė linija: Vykdomų kortelių šoninė linija/apvadas pakeistas iš mėlynos į oranžinę (laukiančių gamybos kortelių išlieka mėlyna).
  • Spalvų paryškinimas: Info barų (progress blocks) spalvos ir užpildai buvo paryškinti siekiant didesnio kontrasto šviesiojoje temoje. Pažymėjus gamybą arba pakavimą kaip baigtus, atitinkamas blokas tampa žalias su žyma ✓.
  • Kortelės regionai: Multi-region (combo) kortelėse informacija apie atskirus regionus dabar išskleidžiama naudojant display:grid maketą.
  • ---

    2. TECH STACK

    ``

    Backend: Node.js + Express (server.js, --watch hot-reload)

    Frontend: Vanilla HTML/CSS/JS (BEZ TailwindCSS, BEZ frameworks)

    DB: SQLite pb_data/data.db (node:sqlite, DatabaseSync, ES module)

    Alt DB: PocketBase :8090 (kai kurioms kolekcijoms)

    Serveris: localhost:3000

    `

    > [!warning] Svarbu

    > pb_data/data.db — VIENINTELIS DB šaltinis šiame kompiuteryje.

    ---

    3. DB SCHEMA

    gamybos_korteles — pagrindinė lentelė

    `sql

    id TEXT PRIMARY KEY

    receptas_id TEXT -- FK → receptai.id

    recepto_pavadinimas TEXT -- denormalizuotas pavadinimas

    lot TEXT -- LOT numeris

    exp TEXT -- Galiojimo data (YYYY-MM-DD)

    pleveles_statusas TEXT -- 'Gauta' | 'Laukiama' | NULL

    planuojamas_kiekis INTEGER -- Pouchams: kiek maišų; plėvelei: kiek kg/vnt

    sumaisytas_kiekis REAL -- Kiek kg mišinio jau sumaišyta

    pagaminta_viso REAL -- Kiek iš viso pagaminta

    pakuotes_tipas TEXT -- 'plevele' | 'pouch' | 'stick'

    kliento_serija TEXT -- gamintojo serija etiketėms

    gamyba_pradeta INTEGER -- 0=planavimas, 1=aktyvi gamyba

    busena TEXT -- 'vykdoma' | 'baigta' | 'archyvuota'

    created TEXT, updated TEXT

    `

    receptai — receptūros

    `sql

    id TEXT PRIMARY KEY

    pavadinimas TEXT

    pakuotes_tipas TEXT

    svoris REAL -- Pakuotės svoris (g)

    pak_dezuteje INTEGER -- vnt. dėžutėje

    dez_dezeje INTEGER -- dėžučių dėžėje

    pak_dezeje INTEGER -- viso vnt. dėžėje (computed)

    klientas TEXT -- kliento kodas

    palaidi INTEGER -- 1 = palaidi (be retail dėžučių)

    korteles_tipas TEXT -- gamybos kortelės tipas

    combo_dalybos TEXT -- JSON: dalinimo koeficientai

    pastabos TEXT -- pirkimo pastabos

    uzsakovo_zaliavos INTEGER -- 1 = naudoja kliento žaliavas

    stakliu_rekomendacija TEXT -- rekomenduojama staklinė *(pridėta 2026-06-17)*

    gamybos_pastabos TEXT -- laisvas gamybos komentaras *(pridėta 2026-06-17)*

    -- ⚠️ receptai NETURI 'kodas' kolonos!

    `

    pakuociu_sandelis — pouch sandėlis *(pridėta 2026-06-17)*

    `sql

    id TEXT PRIMARY KEY

    receptas_id TEXT NOT NULL -- FK → receptai.id (pouch tipo)

    kiekis INTEGER NOT NULL -- kiek vienetų gauta

    data TEXT -- gavimo data (YYYY-MM-DD)

    pastabos TEXT -- pvz. "DN92197 — Alpi Eesti"

    created TEXT, updated TEXT

    `

    gamybos_zurnalas — žurnalas

    `sql

    id TEXT PRIMARY KEY

    data TEXT NOT NULL

    pavadinimas TEXT

    veiksmas TEXT

    kiekis REAL

    batch TEXT

    created TEXT, updated TEXT

    `

    darbo_laikas — darbuotojų darbo laiko apskaita

    `sql

    id TEXT PRIMARY KEY

    data TEXT NOT NULL -- darbo diena (YYYY-MM-DD)

    vardas TEXT NOT NULL -- darbuotojo vardas

    virsvalandziai TEXT NOT NULL -- valandų skaičius (tekstu)

    tipas TEXT -- DARBAS / ATOSTOGOS / TEVADIENIS

    komentaras TEXT -- laisvas komentaras prie dienos (pridėta 2026-08-11; POST/PUT priima, GET grąžina per SELECT *)

    created TEXT, updated TEXT

    `

    > UI (2026-08-11): Mobile „Darbo laikas" istorijoje ir desktop Viršvalandžių ekrane paspaudus dieną, kuri turi komentaras, atidaromas komentaro popup (hrShowComment/vvShowComment). 💬 ženkliukas rodomas prie dienos su komentaru. Desktop forma turi „Komentaras (nebūtina)" lauką (vvFormKom). Telegram boto INSERTai (be komentaro) veikia — kolona turi DEFAULT ''.

    gamybos_dosje — kortelių istorinis archyvas / dosje

    `sql

    id TEXT PRIMARY KEY

    uzsakymo_id TEXT NOT NULL -- susijusio užsakymo ID

    produkto_id TEXT NOT NULL -- produkto/recepto ID

    pavadinimas TEXT NOT NULL -- produkto pavadinimas

    lot TEXT NOT NULL -- gamybos LOT

    galiojimas TEXT NOT NULL -- EXP data

    planas REAL NOT NULL -- planuotas gamybos kiekis

    plevele REAL NOT NULL -- sunaudota plėvelė (kg)

    dezutes REAL NOT NULL -- sunaudotos dėžutės (vnt)

    pradeta TEXT NOT NULL -- gamybos pradžios laikas

    baigta TEXT NOT NULL -- gamybos pabaigos laikas

    stakles REAL NOT NULL -- staklių pagamintas kiekis

    supakuota REAL NOT NULL -- supakuotas kiekis

    isvezta REAL NOT NULL -- išvežtas kiekis

    archyvuota TEXT NOT NULL -- archyvavimo požymis/laikas

    pakuotes_tipas TEXT NOT NULL -- pakuotės tipas

    dosje TEXT NOT NULL -- pilnas dosje tekstas / ataskaita

    html_kortele TEXT NOT NULL -- sugeneruotas kortelės HTML

    created TEXT, updated TEXT

    `

    ingredientai — recepto sudėtis (žaliavos)

    `sql

    id TEXT PRIMARY KEY

    receptas_id TEXT NOT NULL -- FK → receptai.id

    zaliava_id TEXT NOT NULL -- FK → zaliavos.id

    kiekis_vienai_porcijai REAL NOT NULL -- žaliavos svoris kg vienam maišymui

    created TEXT, updated TEXT

    `

    isvezimai — prekių išvežimo pagal važtaraščius registras

    `sql

    id TEXT PRIMARY KEY

    vaztarascio_id TEXT NOT NULL -- FK → vaztarasciai.id

    korteles_id TEXT NOT NULL -- FK → gamybos_korteles.id

    kiekis REAL NOT NULL -- išvežtas prekių kiekis (vnt)

    prekes_pavadinimas TEXT NOT NULL

    lot TEXT NOT NULL

    created TEXT, updated TEXT

    `

    klientai — partneriai / klientai

    `sql

    id TEXT PRIMARY KEY

    kodas TEXT NOT NULL -- unikalus kliento kodas (pvz. EV, BENU)

    pavadinimas TEXT NOT NULL -- pilnas pavadinimas

    adresas TEXT NOT NULL

    email TEXT NOT NULL

    phone TEXT NOT NULL

    papildomi TEXT NOT NULL -- papildoma info (JSON / tekstas)

    created TEXT, updated TEXT

    `

    korteles_regionai — gamybos kortelės paskirstymas regionams (combo)

    `sql

    id TEXT PRIMARY KEY

    kortele_id TEXT NOT NULL -- FK → gamybos_korteles.id

    regionas TEXT NOT NULL -- regiono kodas/pavadinimas

    dezutes_kiekis INTEGER -- planuojamas dėžučių kiekis

    dezutes_exp TEXT -- regiono galiojimo data

    dezutes_gauta TEXT

    pak_dezeje INTEGER -- paketų dėžėje

    pak_dezuteje INTEGER -- paketų dėžutėje

    dez_dezeje INTEGER -- dėžučių transportinėje dėžėje

    supakuota_kiekis REAL -- supakuotas kiekis tam regionui

    isvezta_kiekis REAL -- išvežtas kiekis tam regionui

    statusas TEXT -- regiono būsena

    eilutes_nr INTEGER -- rikiavimo eilės numeris

    created TEXT, updated TEXT

    `

    nurasymai — gamybos metu nurašytų žaliavų registras

    `sql

    id TEXT PRIMARY KEY

    korteles_id TEXT NOT NULL -- FK → gamybos_korteles.id

    zaliava_id TEXT NOT NULL -- FK → zaliavos.id

    panaudotas_kiekis REAL NOT NULL -- nurašytas kiekis (kg)

    created TEXT, updated TEXT

    `

    recepto_sudetis — recepto sudėties lentelė (gali dubliuoti/pakeisti ingredientai)

    `sql

    id TEXT PRIMARY KEY

    receptas_id TEXT NOT NULL -- FK → receptai.id

    zaliava_id TEXT NOT NULL -- FK → zaliavos.id

    kiekis_vienai_porcijai REAL NOT NULL

    created TEXT, updated TEXT

    `

    > [!danger] recepto_sudetis yra NEGYVA/sugadinta lentelė — nulis nuorodų server.js verslo logikoje.

    > Bet senesnės sesijos scenarijaus klaida gali vis tiek į ją įrašyti duomenis (nutiko su HYDRO FORTE 1/2,

    > ištaisyta 2026-07-02, perkelta į ingredientai). Tikrinant "ar receptas turi sudėtį?" — visada

    > patikrinti ABI lenteles (ingredientai IR recepto_sudetis) pagal receptas_id, ne tik ingredientai.

    pakuociu_nurasymai — pouch pakuočių PASTOVUS nurašymas archyvuojant *(pridėta 2026-07-02)*

    `sql

    id TEXT PRIMARY KEY

    receptas_id TEXT NOT NULL -- FK → receptai.id (pouch tipo)

    korteles_id TEXT NOT NULL -- FK → gamybos_korteles.id

    kiekis REAL NOT NULL -- galutinai nurašytas kiekis iš pakuociu_sandelis

    data TEXT NOT NULL

    created TEXT, updated TEXT

    `

    > Anksčiau pakuociu_sandelis "rezervuota" skaičiavimas žiūrėjo tik į AKTYVIŲ kortelių planuojamą

    > kiekį — archyvavus kortelę, jos pouch sunaudojimas "dingdavo" iš rezervacijos skaičiavimo.

    > Dabar laisva = gauta_viso - rezervuota - nurasyta, kur nurasyta = SUM iš šios lentelės.

    > Įrašas kuriamas archyvuoti endpoint'e, PASKUTINIS žingsnis (po galutinio UPDATE) — atomiškumui.

    vaztarasciai — prekių išvežimo važtaraščiai

    `sql

    id TEXT PRIMARY KEY

    numeris TEXT NOT NULL -- važtaraščio numeris

    kliento_pavadinimas TEXT NOT NULL

    data TEXT NOT NULL -- išrašymo data

    siuntejas TEXT NOT NULL -- atsakingas asmuo / siuntėjas

    palečių_kiekis INTEGER NOT NULL -- palečių skaičius

    viso_vnt INTEGER NOT NULL -- bendras prekių vnt kiekis

    viso_deziu INTEGER NOT NULL -- bendras dėžių kiekis

    payload TEXT NOT NULL -- papildomi išvežimo duomenys (JSON)

    statusas TEXT NOT NULL -- važtaraščio būsena

    created TEXT, updated TEXT

    `

    zaliavos — žaliavų sandėlio likučiai

    `sql

    id TEXT PRIMARY KEY

    pavadinimas TEXT NOT NULL -- žaliavos pavadinimas

    likutis REAL NOT NULL -- esamas likutis kg

    vienetas TEXT NOT NULL -- matavimo vienetas (dažniausiai 'kg')

    klientas_id TEXT -- FK → klientai.id (jei žaliava nuosava)

    created TEXT, updated TEXT

    `

    zaliavu_gavimai — žaliavų gavimo iš tiekėjų žurnalas

    `sql

    id TEXT PRIMARY KEY

    data TEXT NOT NULL -- gavimo data

    siuntejas TEXT NOT NULL -- tiekėjas / siuntėjas

    zaliava_id TEXT NOT NULL -- FK → zaliavos.id

    zaliava_pavadinimas_raw TEXT NOT NULL -- žaliavos pavadinimas iš dokumentų

    serijos_nr TEXT NOT NULL -- tiekėjo LOT / serija

    galiojimas TEXT NOT NULL -- tiekėjo EXP data

    kiekis REAL NOT NULL -- gautas kiekis (kg)

    busena TEXT NOT NULL -- gavimo būsena

    created TEXT, updated TEXT

    `

    ---

    4. GAMYBOS CIKLAS

    `

    1. PLANAVIMAS gamyba_pradeta=0 → Gamybos langas

    2. AKTYVI GAMYBA gamyba_pradeta=1 → Pagrindinis langas

    3. BAIGTA busena='baigta' → Istorija

    4. ARCHYVUOTA busena='archyvuota' → Archyvas

    `

    Pouchų workflow

    `

    Gavimas iš tiekėjo → pakuociu_sandelis

    ↓

    Sandėlio kortelė: gauta / rezervuota / laisva

    ↓

    Vartotojas įveda LOT + EXP + kiekį

    ↓

    Sukuriama gamybos_kortele (pleveles_statusas='Gauta' auto)

    ↓

    Gamybos langas → Maisomi tab

    `

    ---

    5. API ENDPOINT'AI

    🕸️ Sistemos žemėlapis (Wolf)

  • GET /wolf — projekto žemėlapis naršyklėje (tekstinė versija)
  • GET /wolf/graph — interaktyvus D3.js tinklo grafas
  • 📋 Gamybos kortelės (Planavimas ir gamybos eiga)

  • GET /api/gamybos-korteles — gauti visas korteles (aktyvias, planuojamas)
  • POST /api/gamybos-korteles — sukurti naują gamybos kortelę
  • PATCH /api/gamybos-korteles/:id — atnaujinti kortelės duomenis
  • DELETE /api/gamybos-korteles/:id — ištrinti gamybos kortelę
  • POST /api/gamybos-korteles/:id/toggle-pill — įjungti/išjungti gamybos statuso mygtuką
  • POST /api/gamybos-korteles/:id/update-status — pakeisti kortelės būseną
  • POST /api/gamybos-korteles/:id/pradeti-gamyba — pradėti aktyvią gamybą (perkelti iš planavimo); ne-pouch be pleveles_statusas='Gauta' → 400 (2026-10-01)
  • POST /api/gamybos-korteles/:id/registruoti-maisyma — užregistruoti atliktą maišymą (kg)
  • POST /api/gamybos-korteles/:id/registruoti-gamyba — užregistruoti staklių gamybą; reikalauja gamyba_pradeta=1 (2026-10-01)
  • POST /api/gamybos-korteles/:id/registruoti-supakavima — užregistruoti supakuotą kiekį dėžutėmis
  • POST /api/gamybos-korteles/:id/registruoti-pouch — užregistruoti užpildytus pouch maišelius
  • POST /api/gamybos-korteles/:id/registruoti-pagaminta — tiesiogiai užfiksuoti pagamintą kiekį
  • POST /api/gamybos-korteles/:id/baigti-stakles — pažymėti, kad gamyba staklėmis baigta
  • POST /api/gamybos-korteles/:id/baigti-pakavima — pažymėti, kad pakavimas baigtas
  • POST /api/baigti-gamyba/:id — pažymėti kortelę baigta (statusas='baigta'); NUO 2026-09-11 (#84) žaliavų NEBENURAŠO — nurašymas jau įvyksta realiu laiku per registruoti-maisyma/registruoti-pouch/faktinis_sunaudojimas.js, žr. §8
  • POST /api/gamybos-korteles/:id/archyvuoti — perkelti baigtą kortelę į archyvą
  • GET /api/gamybos-korteles/skaidres — gauti duomenis skaidrių / monitoriaus režimui
  • GET /api/gamybos-korteles/:id/atsekamumas — gauti LOT/EXP atsekamumo duomenis
  • GET /api/gamybos-korteles/:id/patikrinti-atsargas — patikrinti, ar pakanka žaliavų sandėlyje
  • GET /api/gamybos-korteles/:id/kortele-html — gauti kortelės spausdinimo HTML ataskaitą
  • GET /api/gamybos-korteles/:id/dosje-html — gauti gražiai suformatuotą A4 portrait formato Gamybos dosjė HTML spausdinimui
  • GET /api/istorija — gauti įvykdytų (baigtų) kortelių sąrašą
  • GET /api/debug/korteles-count — gauti bendrą kortelių kiekį (debug)
  • 🥣 Receptūros ir sudėtis

  • GET /api/receptai — gauti visus receptus
  • GET /api/receptai-list — gauti supaprastintą receptų sąrašą
  • GET /api/receptai-detalus — gauti receptus su papildomais staklių/komentarų laukais
  • GET /api/receptai-gamybai — gauti receptus, paruoštus kortelių kūrimui
  • POST /api/receptai — sukurti naują receptą
  • PUT /api/receptai/:id — atnaujinti recepto pagrindinius/papildomus laukus
  • DELETE /api/receptai/:id — ištrinti receptą
  • POST /api/recepto-sudetis — pridėti žaliavą į recepto sudėtį
  • PUT /api/recepto-sudetis/:id — koreguoti žaliavos kiekį recepto sudėtyje
  • DELETE /api/recepto-sudetis/:id — pašalinti žaliavą iš recepto sudėties
  • 🧪 Žaliavų sandėlis (Likučiai ir nurašymai)

  • GET /api/zaliavos — gauti žaliavų sąrašą su esamais likučiais
  • POST /api/zaliavos — pridėti naują žaliavą į sistemą
  • PUT /api/zaliavos/:id — atnaujinti žaliavos kortelę
  • DELETE /api/zaliavos/:id — ištrinti žaliavą
  • GET /api/zaliavos/:id/panaudojimas — gauti žaliavos nurašymų/panaudojimo istoriją
  • GET /api/zaliavos/:id/gavimai — gauti šios žaliavos gavimų žurnalą
  • GET /api/nurasymai — gauti visų žaliavų nurašymų sąrašą
  • POST /api/papildyti-zaliava/:id — koreguoti žaliavos sandėlio likutį (+/- kg)
  • 🎞️ Medžiagų ir žaliavų gavimai (Pajamavimas)

  • GET /api/gavimai — gauti visus gavimo įrašus
  • PUT /api/gavimai/:id — redaguoti gavimo įrašą
  • DELETE /api/gavimai/:id — pašalinti gavimo įrašą
  • POST /api/registruoti-gavima — užregistruoti žaliavos gavimą iš tiekėjo
  • POST /api/gavimai/bulk — plėvelių rulonų priėmimas (auto-generuoja LOT kodus)
  • POST /api/priimti-medziagas — užregistruoti pakuotės medžiagų sunaudojimą gamybos kortelei
  • GET /api/pakuociu-gavimai — gauti plėvelių ir dėžučių gavimo suvestinę raw formatu
  • 🛍️ Pakuočių sandėlis (Pouch)

  • GET /api/pakuociu-sandelis — gauti pouch pakuočių sandėlio likučius
  • POST /api/pakuociu-sandelis — įvesti naują pouch gavimą iš tiekėjo
  • DELETE /api/pakuociu-sandelis/:id — ištrinti pouch sandėlio gavimo įrašą
  • GET /api/pouch-sandelys — gauti bendrą pakuočių ataskaitą
  • 📦 Važtaraščiai ir išvežimai

  • GET /api/vaztarasciai — gauti visus važtaraščius
  • GET /api/vaztarasciai/:id/html — sugeneruoti važtaraščio HTML peržiūrą
  • DELETE /api/vaztarasciai/:id — ištrinti važtaraštį
  • GET /api/vaztarastis-duomenys — pagalbiniai duomenys naujo važtaraščio kūrimui
  • GET /api/next-vaztarascio-numeris — sugeneruoti sekantį važtaraščio numerį
  • POST /api/greitas-issiuntimas — tiesioginis prekių išsiuntimas nenaudojant gamybos kortelės
  • POST /api/nurasyti-vaztarasti — užfiksuoti žaliavų nurašymą pagal išsiųstas prekes
  • GET /api/isvezimai — gauti prekių išvežimo įrašus pagal važtaraščius
  • GET /api/kpi-isvezta — gauti išvežtos produkcijos KPI ataskaitą
  • 🗺️ Multi-region (Kortelės regionai)

  • GET /api/gamybos-korteles/:id/regionai — gauti kortelės combo regionų paskirstymus
  • POST /api/gamybos-korteles/:id/regionai — pridėti naują regioną kortelei
  • PUT /api/gamybos-korteles/:id/regionai/:rid — koreguoti regiono pakavimo/EXP duomenis
  • DELETE /api/gamybos-korteles/:id/regionai/:rid — pašalinti regioną iš kortelės
  • POST /api/gamybos-korteles/:id/regionai/:rid/registruoti-supakavima — užregistruoti supakuotą kiekį konkrečiam regionui
  • ⏱️ Darbo laikas ir darbuotojai

  • GET /api/darbuotojai — gauti darbuotojų sąrašą
  • POST /api/darbuotojai — pridėti naują darbuotoją į sąrašą
  • GET /api/darbo-laikas — gauti darbo laiko žurnalą
  • POST /api/darbo-laikas — užregistruoti dirbtą laiką / viršvalandžius / atostogas / tėvadienį
  • PUT /api/darbo-laikas/:id — redaguoti darbo laiko įrašą
  • DELETE /api/darbo-laikas/:id — pašalinti darbo laiko įrašą
  • 📖 Gamybos žurnalas

  • GET /api/gamybos-zurnalas — gauti žurnalo įrašus
  • POST /api/gamybos-zurnalas — sukurti rankinį žurnalo įrašą
  • PUT /api/gamybos-zurnalas/:id — redaguoti žurnalo įrašą
  • DELETE /api/gamybos-zurnalas/:id — pašalinti žurnalo įrašą
  • 👥 Klientai

  • GET /api/klientai — gauti klientų sąrašą
  • POST /api/klientai — sukurti naują klientą
  • PUT /api/klientai/:id — redaguoti kliento kortelę
  • DELETE /api/klientai/:id — pašalinti klientą
  • 🖨️ Spausdinimas ir PDF generavimas

  • GET /api/debug/printeriai — gauti sistemoje įdiegtų spausdintuvų sąrašą (Zebra)
  • POST /api/spausdinti-hydraw — išsiųsti ZPL etiketės kodą į Zebra spausdintuvą
  • POST /api/generuoti-pdf — sugeneruoti PDF dokumentą iš HTML šablono
  • 📱 Mobilioji sąsaja

  • GET /mobile — mobiliosios aplikacijos nukreipimas
  • POST /api/mobilus/priimti — priimti ir apdoroti duomenis iš mobiliojo įrenginio
  • ⚙️ Administravimas, importas ir DB priežiūra

  • GET /api/sync-cloud — sinchronizuoti duomenis su debesimi (PocketBase)
  • GET /api/recalc-stats — perskaičiuoti gamybos kortelių rodiklius ir KPI
  • GET /api/dedup-journal — išvalyti besidubliuojančius žurnalo įrašus
  • GET /api/debug/indexes — gauti DB indeksų sąrašą (debug)
  • GET /api/restart-terminal — paleisti iš naujo mobiliojo terminalo tarybą
  • POST /api/admin/restart-pb — perkrauti PocketBase procesą
  • POST /api/admin/sukurti-atsargine-kopija — sukurti atsarginę DB kopiją
  • GET /api/admin/atsargines-kopijos — gauti atsarginių kopijų sąrašą
  • POST /api/admin/db-recovery — atstatyti duomenų bazę iš atsarginės kopijos
  • POST /api/admin/sinchronizuoti-isvezimus — sinchronizuoti išvežimus su išorine sistema
  • POST /api/importuoti-istorija — importuoti istorinius gamybos įrašus
  • POST /api/admin/importuoti-istorija-archyvas — importuoti archyvinius įrašus
  • POST /api/admin/importuoti-vaztarasciai — importuoti važtaraščius iš XLSX failo
  • POST /api/admin/importuoti-gavimus — importuoti gavimus iš XLSX failo
  • POST /api/admin/importuoti-nurasymus — importuoti nurašymus iš XLSX failo
  • POST /api/admin/importuoti-receptu-sudetis — importuoti receptų sudėtis iš XLSX failo
  • POST /api/admin/importuoti-hf-20mb — importuoti didelį žaliavų failą (HF 20MB)
  • POST /api/admin/migruoti-istorija-xlsx — konvertuoti ir migruoti istoriją
  • POST /api/admin/deduplikuoti-nurasymus — išvalyti pasikartojančius žaliavų nurašymus
  • POST /api/admin/trinti-zurnalas-dublikatus — išvalyti besidubliuojančius žurnalo įrašus
  • POST /api/admin/sukurti-gavima — administratoriaus teise sukurti gavimą
  • POST /api/admin/zurnalas-irasas — sukurti naują žurnalo įrašą iš admin pulto
  • PATCH /api/admin/zurnalas-irasas/:id — redaguoti žurnalo įrašą admin pulte
  • DELETE /api/admin/nurasymas/:id — pašalinti nurašymą admin pulte
  • DELETE /api/admin/ingredientai-receptas/:receptas_id — išvalyti recepto sudėtį
  • POST /api/admin/susieti-kortele-receptu — susieti gamybos korteles su atitinkamu receptu
  • POST /api/admin/susieti-receptus — automatiškai susieti receptus
  • POST /api/admin/fix-recepto-sudetis-schema — pataisyti sugadintą recepto sudėties schemą
  • POST /api/admin/repair-recepto-sudetis — pataisyti sugadintus recepto sudėties duomenis
  • GET /api/ataskaita/biofarmacija — gauti Biofarmacijos klientų ataskaitą
  • GET /api/backup-sync/status — (2026-09-11, #85) gauti debounced backup sync į B serverį būseną (backup_sync.js: isSyncing, pendingSync, lastSyncTime, lastSyncResult, lastError)
  • ---

    6. UI STRUKTŪRA

    Pagrindiniai tabs (activeSidebarTab)

    `

    'gaminama' → Pagrindinis langas (aktyvi gamyba, gamyba_pradeta=1)

    'rezervacija'→ Žaliavų rezervacijos poreikis (NUO 2026-09-09 pilnavertis tabas, ne _pagrindinisTab pod-tab — žr. 2026-09-09 sekciją)

    'maisymai' → Aktyvūs maišymai (NUO 2026-09-09 pilnavertis tabas, ne _pagrindinisTab pod-tab)

    'siandien' → Dienos suvestinė (NAUJAS 2026-09-09 — KPI juosta + chronologinė įvykių juosta)

    'gavimai' → Gavimai (NUO 2026-09-08 pilnavertis tabas, žr. klaidos.md #19)

    'vaztarastis'→ Važtaraščiai

    'klientai' → Klientai

    'zaliavos' → Žaliavų sandėlis

    'receptai' → Receptūros

    'istorija' → Istorija (baigtos kortelės)

    `

    > ⚠️ Senesnė šio sąrašo versija dar minėjo atskirus 'gamyba' (planavimo langas, panaikintas 2026-07-14,

    > žr. Agy #28 sekciją žemiau) ir 'kpi' (žurnalo/ataskaitų tab) — jų switchTab() iškvietimų kode

    > NEBĖRA (patikrinta grep'u 2026-09-09); KPI dabar rodomas kaip kortelės header'yje, ne atskiras tabas.

    Gamybos lango sub-tabs (_gamybaLangasTab)

    `

    'maisomi' ← DEFAULT — kortelės su sumaisytas_kiekis > 0

    'paketeliai' — plevele tipo

    'pauchai' — pakuočių sandėlio vaizdas

    'stickai' — stick tipo

    `

    > ⚠️ 'gavimai' NUO 2026-07-08 NEBĖRA Gamybos lango sub-tabas — perkeltas į Gaminama

    > (pagrindinį) langą kaip _pagrindinisTab === 'gavimai' → renderGaminamaGavimaiLentele()

    > (gamybos būklės dashboard'as su virtualiomis eilutėmis, žr. 2026-07-07/08 sekciją viršuje).

    Svarbūs state kintamieji

    `javascript

    let _gamybaLangasTab = 'maisomi'; // default tab

    let _pakuociuSandelisData = null; // null = reload, {} = cache

    let _gamybaCardId = null; // aktyvi kortelė

    let allZurnalasLogs = []; // žurnalo cache

    let activeSidebarTab = 'gaminama'; // aktyvus pagrindinis tab

    `

    ---

    7. ŽINOMOS SUBTILYBĖS / SPĄSTAI

    > [!danger] Kritinės klaidos

    > - receptai lentelė NETURI kodas kolonos

    > - DB failas: C:\VM\pb_data\data.db (NE vm-darbas.db — senas pavadinimas)

    > - Naudoti node:sqlite ES module (NE better-sqlite3)

    > - NIEKADA TailwindCSS — tik vanilla CSS

    Žinomos klaidos ir sprendimai

    KlaidaSprendimas |

    |--------|-----------|

    r.kodas column not foundreceptai neturi kodas kolonos — pašalinti iš SQL |
    Pouchai kaip tuščios kortelėsNeteisingas workflow. Naudoti pakuociu_sandelis |
    Archyvavimo filtras statusas != 'archyvuota'KLAIDINGA — archyvavimas žymimas archyvuota DATOS stulpelyje, statusas lieka 'baigta'. Filtruoti (archyvuota IS NULL OR archyvuota='') |
    API laukai lietuviškaiingredientai (ne ingredients), statusas (ne busena — PB reliktas), norma_porcijai, kiekis_vienai_porcijai — prieš naudojant lauką PATIKRINTI realų API atsakymą |
    „STAKLĖS ✓" žurnalo įrašasKUMULIACINĖ užbaigimo žymė (visas pagaminta_kiekis), NE nauja produkcija — nesumuoti į KPI |
    POUCH dublikataiIdentiški POUCH registravimai skirtingom dienom = tikėtinas dubliavimas (2026-07-10 Creatine atvejis) — tikrinti prieš pasitikint |
    PALAIDI eilutėms recepto pakavimo laukai (dez_dezeje ir pan.)Netaikomi/klaidinantys, jei tiesiog kopijuojami iš recepto — palaidi neturi tarpinių pakavimo sluoksnių. Prieš rodant/saugant PALAIDI kontekste, aiškiai NULL'inti arba ignoruoti tokius laukus |
    Batch string su dubliuota data be LOTKai kurie seni įrašai (batch stulpelis) turi du datos formato fragmentus be tikro LOT (pvz. „EXP:x \| x") — LOT/EXP parseris turi eksplicitiškai atmesti VISAS datai/EXP panašias dalis prieš priskirdamas likusią LOT, ne tik „pirmą rastą" |
    Prieš rašant naują UI logiką tikrinti EARLY-RETURN validacijasBendros funkcijos (pvz. vzAddItemToPallet) dažnai turi anksčiau parašytą guard'ą viršuje (if (!x) return), kuris tyliai blokuoja naują šaką apačioje — pridedant naują tipą/atvejį, PATIKRINTI ar viršutinės validacijos jo neatmeta |

    ---

    8. PASKUTINIAI PAKEITIMAI

    2026-09-13 — /update-wolf: kodo pusėje pakeitimų nuo 09-11 nebuvo, bet DB schema turėjo mėnesius senos dokumentacijos drifto

  • ℹ️ Kodo pakeitimų nuo paskutinio sync'o (09-11 22:06) nerasta — git log --since tuščias, HEAD tebėra 3155e5a (#85 sync feature), kuris jau buvo prieš paskutinį cerebrum/anatomy/klaidos atnaujinimą tą pačią dieną. pakuotes.md/workflow.md (paskutinis turinio pakeitimas 08-31) irgi be naujų su jais susijusių commit'ų.
  • ✅ db-schema.md — 3 lentelių kolonos rastos DB, bet niekad nepateko į dokumentą, nors kode/cerebrum.md naratyve egzistavo mėnesius: receptai.pak_svoris_g/dezute_svoris_g/deze_svoris_g (nuo 2026-07-01, Brutto etiketėms) + paletes_auksciai/paletes_dez_auksteje (nuo 2026-08-04, palečių schema); zaliavos.inventorizuota_data (Telegram inventorizacijos meniu); zaliavu_gavimai.likutis_kg (FIFO partijų likutis, minėtas šiame faile aukščiau nuo seniai, bet nebuvo db-schema.md SQL bloke). Priežastis — 09-05 "PRAGMA table_info() patikrinta" žyma reiškė tik lentelių SĄRAŠO patikrą, ne kiekvienos lentelės kolonų palyginimą; žr. naują [[klaidos]] #26 įrašą. Visos 20 lentelių šįkart patikrintos PRAGMA table_info() kolonų lygiu tiesiogiai per node:sqlite, likusios sutapo.
  • 2026-09-11 — sesija: paieškos-select fokuso fix, baigti-gamyba nurašymo pašalinimas (#84), debounced backup sync į B + failover įrankis (#85)

  • ✅ Bendras makeSelectSearchable() komponentas rodydavo tik jau pasirinktą variantą, negalėdavai pakeisti (index.html, naudojamas Važtaraščio Gavėjo/Prekės/Recepto ir kt. laukuose) — pasirinkus reikšmę, laukas rodo pilną tekstą (pvz. MB "DAILY SPOON" (DS)"), o paspaudus jį iš naujo (focus) senas kodas filtruodavo sąrašą BŪTENT PAGAL TĄ TEKSTĄ, todėl dropdown'e likdavo matomas tik vienas, jau pasirinktas variantas — kito gavėjo/prekės pasirinkti nebuvo įmanoma be rankinio teksto trynimo (vartotojo pastaba su screenshot). Fix: focus dabar pažymi visą tekstą (input.select()) IR rodo pilną, nefiltruotą sąrašą (renderItems('')), rašant toliau filtruoja įprastai. Commit e131fe9.
  • ✅ POST /api/baigti-gamyba/:id nebevykdo žaliavų nurašymo (Užduotis #84) — endpoint'as anksčiau NEPRIKLAUSOMAI perskaičiuodavo ir nurašydavo VISUS recepto ingredientus pagal planuojamas_kiekis (FIFO), dubliuodamas realaus laiko nurašymus, kurie jau įvyksta per /registruoti-maisyma (maišomi), /registruoti-pouch (nemaišomi pouch) ir faktinis_sunaudojimas.js (staklės). Dabar TIK perjungia gamybos_korteles.statusas → 'baigta' ir siunčia Telegram/veiklos žurnalo pranešimą; atlikti_nurasymai atsakyme visada []. Commit 9dc8059.
  • ✅ Debounced event-driven sinchronizacija į B serverį (backup_sync.js, naujas modulis, Užduotis #85) — po KIEKVIENO sėkmingo /api/* rašymo (išskyrus /mesh, /mobile/print, /mobile-foto) kviečiamas notifyDbChanged(kelias): 30s ramybės (debounce) langas, 120s maxWait lubos jei pakeitimai vyksta be pertraukos, apsauga nuo lygiagrečių paleidimų (isSyncing/pendingSync). Suveikus paleidžia Scripts/sync-to-backup-server.ps1 -Force fone. Būsena per naują GET /api/backup-sync/status.
  • ✅ B pusėje: staging failas + failover įrankis — sync-to-backup-server.ps1 dabar siunčia į data_staging.db (NE tiesiai į gyvą data.db, kaip anksčiau nuo 2026-09-04) + kartu sync_meta.json (laikas, dydis, integrity_status); senas periodinis VM-BackupSync scheduled task (kas 10 min) gavo MinIntervalMinutes=30 saugiklį (be -Force praleidžia, jei debounce'as jau sinchronizavo neseniai). Naujas Scripts/activate-standby.ps1/.bat — rankinis failover: patikrina data_staging.db vientisumą, sustabdo node.exe/pocketbase.exe, padaro data.db.bak_YYYYMMDD_HHmmss atsarginę kopiją, pakeičia data.db naujausiu data_staging.db (išvalo senus wal/shm), paleidžia serverį per start-background.ps1, patikrina sveikatą (GET /api/gamybos-korteles). -DryRun/-Force parametrai.
  • ⚠️ Nebaigta/laukia sprendimo: automatinis A→B perjungimo sprendimas (kada/kaip suveikia activate-standby.ps1) dar neįdiegtas — žr. atmintį project_antradienio_uzduotys_20260901.md.
  • 2026-09-09 — sesija: Rezervacija/Maišymai/Šiandien tapo pilnaverčiais šoninio meniu tabais, dvigubo žaliavų nurašymo fix + Agy nepriklausomas auditas, dėžučių gating fix, mobile dienos apžvalga

  • ✅ Dėžutės nebeblokuoja gamybos pradžios — galimaPradetiCia/computeGasStatus() (public/index.html) anksčiau reikalavo IR pleveles_statusas, IR dezuciu_statusas = 'Gauta', kad rodytų „GALIMA GAMINTI" + veikiantį „Pradėti" mygtuką — realybėje dėžutės reikalingos tik VĖLESNIAM pakavimo/transporto etapui (serverio POST .../pradeti-gamyba niekad netikrino dėžučių), pouch/palaidi tipams šis apribojimas jau seniai netaikytas (skirtingos vietos faile). Suvienodinta visiems tipams — dabar užtenka plev statuso „GALIMA GAMINTI". Realus atvejis: MAGNIO BISGLICINATAS LOT C260826 jau fiziškai pradėjo gamybą ir pagamino produktą, bet sistema neleido pažymėti pradėta/registruoti pagaminta. Patikrinta gyvai Orca naršyklėje, vartotojas pats paspaudė ir patvirtino DB.
  • ✅ Naujas top-level „Šiandien" langas (desktop index.html, Agy #73) — dienos KPI juosta (Pagaminta/Supakuota/Išvežta/Gauta/Pradėta-Maišyta/Įspėjimai), chronologinė įvykių juosta su kategorijų filtrais/rikiavimu/paieška, datos perjungiklis (Vakar/Rytoj/data laukas), auto-refresh 30s (išsijungia išeinant iš lango), šoninės panelės (dienos važtaraščiai/gavimai/įspėjimai-trūkumai). activeSidebarTab sinchronizuotas per switchTab() (žr. [[feedback_activesidebartab_stale_state]] taisyklę). Per testavimą rastas ir pataisytas front-end dedup bug'as — ta pati STAKLĖS įvykio eilutė rodydavosi du kartus chronologinėje juostoje (realus DB įrašas buvo tik vienas).
  • ✅ Mobili „Šiandien" dienos apžvalga (public/mobile.html, Agy #73) — analogiškas ekranas telefonui, integruotas į naršymą.
  • ✅ „Rezervacija" ir „Maišymai" iškelti iš _pagrindinisTab pod-tabų VIDUJE „Gaminama" lango į pilnaverčius šoninio meniu tabus (switchTab('rezervacija')/switchTab('maisymai'), kaip Gavimai/Šiandien) — anksčiau tai buvo filterByTipas('rezervacija'|'maisomi') specialūs atvejai, kurie ir sukėlė [[feedback_activesidebartab_stale_state]] klasės bug'us (žr. klaidos.md #19 — analogiška situacija su Gavimai). Dabar abu turi savo activeSidebarTab reikšmę, fetchProductionData() galinė if/else grandinė supaprastinta. Pašalinta pati bug'ų klasės šaknis šiems dviem tabams, ne tik simptomas.
  • ✅ Dvigubas žaliavų nurašymas registruojant maišymą IR pagamintą kiekį (KRITINIS, ne-pouch produktams) — registruotiPagaminta() (faktinis_sunaudojimas.js) nurašydavo žaliavas NEPRIKLAUSOMAI nuo /registruoti-maisyma, dubliuodama nurašymą plėvelės/stick produktams (kurie turi atskirą maišymo etapą, nurašymas jau įvyksta ten). Pirmas fix'as: registruotiPagaminta dabar nurašinėja TIK produktams be atskiro maišymo (kriterijus tuo metu: pakuotes_tipas==='pouch'). Ištaisyti istoriniai duomenys: 10 kortelių / 118 klaidingų nurašymo eilučių nuo 2026-06-15 iki 2026-09-07 (grąžinti likučiai ~50 žaliavų, ištrinti klaidingi nurašymai + gamybos_zurnalas įrašai). DB atsarginė kopija padaryta prieš taisant.
  • ✅ Agy nepriklausomas auditas rado 2 papildomas spragas pirminiame fix'e — teisingas kriterijus yra NE pakuotes_tipas==='pouch', o hasMixing (sumaisytas_kiekis>0 arba maisymas_aktyvus=1) — kai kurie DS daugiaingredientiniai POUCH produktai IRGI fiziškai maišomi prieš fasavimą, o pakuotes_tipas neatspindi, ar KONKREČIAI šiai kortelei jau buvo registruotas maišymas. Rasta 1 realiai paveikta kortelė (LOT 606044, pouch, bet su 8 realiais maišymais — 8 žaliavos nurašytos dukart) ir 5 „pamestos" D260327 nurašymo eilutės (1s laikrodžio poslinkis tarp nurasymai ir gamybos_zurnalas paliko jas nepastebėtas griežtame laiko sutapimo filtre). Platus pakartotinis auditas (±2s tolerancija, be tipo/LOT apribojimo) VISOJE DB patvirtino: 0 likusių dvigubo nurašymo požymių. Žr. klaidos.md #20 ir [[feedback_dvigubas_zaliavu_nurasymas]] atmintį (atnaujinta su teisingu gate).
  • ✅ Claude nepriklausomai patikrino #72/#73 gyvai per Orca embedded browser (ne tik pasitikėjo Agy pranešimu) — desktop: REZERVACIJA/MAIŠYMAI šoniniame meniu atsidaro teisingai (be Gaminama filtrų juostos), iš Maišymai sąrašo paspaudus kortelę atsidaro reali maišymo sesija su „Registruoti maišymą", grįžus į GAMYBA senų #tabRezervacija/#tabMaisomi mygtukų filtrų juostoje nebėra, Paketeliai/Pauchai/Stickai filtrai veikia; mobile: „📅 Diena" tabas rodo KPI+kronologinę juostą su realiais duomenimis, ‹ Vakar/Rytoj › datos navigacija veikia. Testiniai naršyklės tab'ai uždaryti po patikros.
  • 2026-09-10 — sesija: šoninio meniu tvarka, Maišymai paieška/filtrai, Receptai kliento chip'ai (Agy #74-82), Šiandien lango KPI/timeline fix'ai, važtaraščio dublikatų sutraukimas, keli reali-duomenų taisymai (kartu su Agy)

  • ✅ Šoninio meniu tvarka perrikiuota vartotojo nurodyta seka: Gamyba, Gavimai, Važtaraštis, Šiandien, Maišymai, Receptai, Žaliavos, Klientai, Rezervacija, Istorija (.sidebar-menu index.html). Commit 4638220.
  • ✅ El. pašto pranešimų telkimo langas pailgintas 20s→10min (email-notify.js BATCH_DELAY_MS) — vartotojo pastaba, kad registruojant kelias pozicijas iš eilės gali neužtekti laiko. Commit 7e97e6d.
  • ✅ DS el. pašto pranešimai apie žaliavos gavimą tyliai neišsiųsdavo pusei kelių — /api/papildyti-zaliava/:id ir /api/priimti-medziagas tikrindavo zaliava.klientas_id iš PocketBase objekto (visada undefined, PocketBase neserializuoja to lauko), o ne SQLite. Fix: tiesioginis SELECT klientas_id FROM zaliavos WHERE id=? prieš notifyEmailDSZaliava iškvietimą abiejuose endpoint'uose. Commit 8bd3ec6. /api/admin/sukurti-gavima jau buvo teisingas.
  • ✅ Maišymai (⚗) lange trūko paieškos/filtravimo (Agy #74) — naujas paieškos laukas + kliento dropdown + pakuotės-tipo dropdown renderMaisomiGaminamoje(). Commit 1a838b8. Patikrinta gyvai (paieška „spinach" → 1/17, fokusas nedingsta).
  • ✅ Klaidinantis „⚗ Maišymo progresas 0%" produktams be maišymo etapo (Agy #75) — receptai su ≤1 ingredientu (mišinys gaunamas gatavas iš tiekėjo) dabar rodo „📦 PAGAMINTA X%" + pastabą „Mišinys gautas iš tiekėjo — maišymo etapo nėra", naujas turi_maisyma laukas iš GET /api/gamybos-korteles (subquery ingredientai/recepto_sudetis count > 1).
  • ✅ getIngBatch() rodydavo seną placeholder LOT vietoj realaus (Agy #76, abi dubliuotos kopijos ~6355/~12928 eil.) — kai intakeLog.batch === 'Perkelta iš senos Sheets sistemos', kodas grąžindavo tą tekstą tiesiogiai vietoj kritimo į antrinę gavimai masyvo paiešką. Patikrinta: BIOVETERINARY STRESS CONTROL 5 ingredientai dabar rodo realius LOT.
  • ✅ Klientai lentelė — nauja „Produktai" stulpelis (Agy #79, commit 2994971) — kliento receptų skaičius, paspaudus atidaro Receptai su tuo klientu filtruotu.
  • ✅ Receptai ekranas — visas kliento filtravimo mechanizmas + 3 vizualinio derinimo raundai (Agy #80 + papildymai) — _receptaiKlientoFilter + chip'ų eilutė virš tipo filtro (commit da07ae0); plataus ekrano išdėstymas (4f38c38); nufoto scrollbar chip'ų eilutėje (.chip-scroll-hidden/fade, 8479da5); grąžinti matomi ‹/› rodyklių mygtukai abiem chip eilutėm, nes paslėptas scrollbar atėmė vienintelį navigacijos būdą (29d9e6f).
  • ✅ #pkEdit_klientas (recepto redagavimo kliento select) apkarpydavo ilgą kliento pavadinimą — praplėstas 158px→230px + title tooltip. Commit 33ccbe0.
  • ✅ „Trūksta žaliavų" klaidingai skaičiuodavo jau UŽBAIGTAS korteles — trūkumo/dynStock skaičiavimo kilpa (allGamybosCards.forEach) neturėjo apsaugos, kad kortelė su stakles_baigtos=1 AND pakavimas_baigtas=1 jau nebenaudoja bendro dynStock telkinio. Pridėta kortelesDarbaiBaigti sąlyga. Commit f2f1160. Patikrinta: KPI 16→14, 2 konkrečios baigtos kortelės dingo iš sąrašo.
  • ✅ VX/AC (ACONITUM) dubliuoti kliento kodai — 3 gamybos_korteles kortelės ir 1 realiai pristatytas važtaraštis buvo išsaugoti su VX, kai receptas jau seniai priskirtas AC — dėl to važtaraščio produkto rinkiklis rodydavo „nėra likučio", nors realiai buvo. Perkelta į AC, orphaned VX kliento įrašas ištrintas (patikrinus 0 likusių nuorodų visose lentelėse/JSON payload'uose).
  • ✅ Sena „ĮSPĖJIMAS: EXP konfliktas" žurnalo eilutė neišnykdavo po rankinės korekcijos — gamybos_zurnalas įspėjimų eilutės yra vienkartinis istorinis įrašas, niekad nepertikrinamas iš naujo. Ištrinta 1 pasenusi eilutė (VIRONOX Smegenų rūkas, kortele.exp jau buvo pataisytas), + Agy pridėjo „Patikrinti iš naujo" (Agy #81) — naudoja jau esamą DELETE /api/gamybos-zurnalas/:id.
  • ✅ Šiandien lango chronologinė juosta nueidavo už ekrano ribų, reikėdavo page-scroll'o — po 3 nepavykusių bandymų su fiksuota calc(100vh - Npx) CSS konstanta (skirtinguose realaus lango dydžiuose/DPI/zoom nesutapdavo), perrašyta į dinamišką JS matavimą vykdymo metu: _siandienFitGridHeight() (#siandienMainGrid.getBoundingClientRect().top, window.innerHeight - top - 24), kviečiama po kiekvieno render'o + window.resize listener'yje. Commit 4ce84d5. Patikrinta 0px skirtumu dviejuose skirtinguose testiniuose lango dydžiuose (921px, 972px).
  • ✅ Statuso pasikeitimo įvykiai („Statusas → VYKDOMA...") klaidingai patekdavo į GAVIMAI kategoriją chronologinėje juostoje — _siandienClassifyLog() if-grandinėje PRIIMTA/GAUTA patikra buvo prieš STATUSAS patikrą, o teksto substring'as „gauta" atitikdavo statuso pranešimą. Sutvarkyta eilės tvarka (STATUSAS pirma, startsWith griežtesnis), pataisyta IR index.html, IR mobile.html (identiška dubliuota funkcija). Commit 880065a.
  • ✅ 8 IŠVEŽTA eilutės chronologinėje juostoje sutrauktos į 2 važtaraščio kortelę su produktų sąrašu (Agy #82, komandinis darbas su Agy) — pridėtas GET /api/isvezimai naudojimas, waybillPositionsMap sujungiantis su vaztarasciai.payload, dedup pagal važtaraštį vietoj rodymo eilutė-po-eilutės su kiekvienu produktu. Commit 4e4f1d7. Patikrinta gyvai — 2 kortelės su chip'ų sąrašu, paieška veikia, važtaraščio peržiūra atsidaro.
  • ✅ „PRADĖTA / MAIŠYTA" KPI visada rodė 0/0, nors maišymas realiai buvo registruotas — KPI skaičiavimo kilpa renderSiandienTab() (~3928-3949 eil.) lygino act.includes('MAIŠ') prieš toUpperCase(), o realus DB tekstas mišraus registro („Maišymas (bazė: ...)"). Ta pati bug'o klasė kaip STATUSAS fix'as aukščiau, tik atskiroje, nepriklausomoje kilpoje. Fix: actUp = act.toUpperCase() visoms 4 sąlygoms (pagaminta/supakuota/maišyta/įspėjimai). Commit d1c5b83. mobile.html atitikmuo jau buvo teisingas — fix'as nereikalingas ten. Patikrinta gyvai: 0/0 → 0/1.
  • 📄 Agy užduotys #74-82 pilnai baigtos ir patikrintos gyvai per Orca (kiekviena — atskiras diagnozės pranešimas agy-uzduotis.md, tikslūs eilučių numeriai, GRIEŽTAI DRAUDŽIAMA apribojimai, patikrinimo checklist).
  • ✅ Važtaraščio „Naujas" lango (paletės builderio) pilna vizualinė pertvarka (Agy #83, vartotojo prašymas su ekrano nuotrauka — „labai daug eilučių, tarpų, tuščios vietos... turit but kaip aukščiausio lygio dizaineriai") — loadNewVaztarastisForm()/vzRenderPallets()/vzItemTypeChanged() (index.html). 0 logikos/API pakeitimų (visi elementų ID/handleriai 1:1 identiški), tik CSS/HTML: pašalinti 4 įdėti dashed rėmeliai krovinio pridėjimo formoje, suvienodinta į tvarkingą 2-eilučių išdėstymą (Tipas+Prekė+kompaktiška kiekio grupė+veiksmų mygtukai / paletavimo skaičiuoklė+Kitas LOT+Kintamos dėžės), kompaktiška 1-eilutės antraštės meta juosta, paletės kortelės header sutrauktas į 1 eilutę + progreso juosta 12px→5px, pašalintas 80px tuščios paletės pranešimas, apatinė veiksmų juosta sugrupuota (be ~1000px tuščio tarpo). Commit 3ddb999.
  • ✅ Važtaraščio builderis — widescreen 100% plotis + sub-nav integracija (Agy #83 papildymas, vartotojo pastebėjimas 1920×1080 ekrane: „tie šonai tušti... Šablonas/Naujas/Nestandartinis/Istorija gal šituos kažkur šone integruot") — pašalintas max-width:1240px limitas (dabar width:100%, kaip Klientai/Gavimai), sub-tab perjungikliai (Naujas/Šablonas/Nestandartinis/Istorija) perkelti iš tolimo dešiniojo kampo prie antraštės kairėje, dešinėje integruotas bendros suvestinės badge #vz-totals-summary (Viso: N pal. · N dėž. · N vnt.). Commit 1dc0c65.
  • ✅ Važtaraščio builderis — progressive disclosure („⚙️ Parinktys ▾") + smart auto-expand (Agy #83 papildymas 2, vartotojo screenshotai — ilgi etikečių tekstai lipdavo ant gretimų stulpelių, antrinė valdymo eilutė (paletavimo skaičiuoklė/Kitas LOT/Kintamos dėžės) reikalinga tik ~5-10% atvejų, bet nuolat užėmė vietą) — etiketės sutrumpintos (Pilnos/Nepilna/Viso d./Viso vnt. su title paaiškinimais) + text-overflow:ellipsis; pagrindinė eilutė dabar švari 1-os eilutės forma, antrinis skydelis paslėptas už [⚙️ Parinktys ▾] mygtuko; vzCheckAutoExpandMoreOptions() automatiškai atveria skydelį + pažymi mygtuką akcentine spalva (Parinktys (aktyvu) ▴), kai paletėje jau įrašytas Kitas LOT/EXP arba įjungtos kintamos dėžės (kiekviena paletė — savarankiška palletId būsena). Commit a248db1.
  • ✅ Mobile: dėžučių/pouch priėmime „Kliento LOT" laukas niekur neišsisaugodavo — submitGavimas() isDez šaka siųsdavo į /api/registruoti-gavima TIK tipas/produktas/kliento_kodas/kiekis/exp, lauko „Serija / LOT" reikšmę naudojo TIK žaliavų/gCard šakos. Vartotojas įvesdavo LOT (VIRONOX Smegenų rūkas dėžučių gavimas), bet jis niekur neatsirasdavo. Fix: laukas dėžutėms/pouch aiškiai pažymėtas „🏷️ Kliento LOT (neprivaloma)" (analogiškai desktop submitPriimtiPakuote()), po sėkmingo registruoti-gavima atskiras PATCH /api/gamybos-korteles/:id {kliento_lot}, ta pati logika kaip desktop. Commit ea1ddb0. Žr. klaidos.md #23.
  • 2026-09-04 — sesija: DS el. pašto pranešimai, važtaraščio šablono suvienodinimas, B serverio (MeshCentral) infrastruktūra

  • ✅ Atsarginis serveris B pilnai sukonfigūruotas — kompiuteris "darbas" (100.68.134.119, DESKTOP-ENDSO5B): SSH raktu prieiga (vm_backup_push, administrators_authorized_keys), RDP įjungtas (+ LimitBlankPasswordUse=0 blank-password prisijungimui), VM-BackupSync scheduled task siunčia DB snapshot kas 10 min (žr. Scripts/sync-to-backup-server.ps1 + Scripts/db-snapshot-tool.cjs — atskiras .cjs failas, nes node -e su -replace PowerShell 5.1 lauždavo escaped kabutes). Git repo (be pilnos istorijos) C:\Program Files\VM-Gamyba B kompiuteryje agento darbui. Claude Code CLI + Orca įdiegti B (portable node-runtime\claude.cmd PATH'e). Detaliau atmintyje: project_meshcentral_setup.md, project_antradienio_uzduotys_20260901.md.
  • ✅ MeshCentral — nuotolinio valdymo serveris įdiegtas šiame (A) kompiuteryje (C:\MeshCentral, portas 4434 web/agentų, 443 užimtas Tailscale Funnel), abu kompiuteriai (A+B) prijungti kaip agentai su root teisėmis. MeshCentral-Watchdog scheduled task kas 5 min palaiko gyvą. Leidžia meshctrl.js CLI vykdyti komandas/failus/valdyti abu kompiuterius per vieną autentifikuotą sesiją (žr. project_meshcentral_setup.md dėl meshctrl AgentDownload --id 64-simbolių reikalavimo be mesh// prefikso ir kitų API keistenybių).
  • ✅ DS el. pašto pranešimai (email-notify.js, nodemailer + Gmail SMTP App Password, .env: EMAIL_USER/EMAIL_APP_PASSWORD/EMAIL_DS_RECIPIENTS) — dvi funkcijos: notifyEmailDSZaliava (žaliavos gavimas, prikabinta prie 3 gavimo endpoint'ų, tikrina klientas_id==='DS') ir notifyEmailDSVaztarastis (važtaraščio PDF priedas). Testavimo etape siunčiama tik ordervminfo@gmail.com (sau), realūs DS adresai dar neįvesti.
  • ✅ Naujas POST /api/vaztarasciai/:id/siusti-el-pastu — DS važtaraštį siunčia el. paštu su PDF priedu, TIK iš važtaraščio istorijos peržiūros lango ("Žiūrėti" → "Siųsti DS el. paštu" mygtukas), reikalauja confirm() patvirtinimo. Serverio pusėje dubliuota DS-only apsauga (tikrina payload.klientas.kodas, ne tik UI matomumą). Sėkmingai išsiuntus, rašo vaztarasciai.el_pastu_issiusta (naujas stulpelis, migracija) — istorijos sąraše rodo žalią "✉️ IŠSIŲSTA dd.mm" badge, pakartotinio siuntimo confirm() įspėja apie ankstesnę datą.
  • ✅ Važtaraščio HTML/PDF generavimas suvienodintas — anksčiau buvo 3 nesutampantys implementavimai (server.js senasis /html endpoint, index.html vzBuildVaztarastisHtml(), atskiras mobile.html vaztPrint()), skirdavosi vizualiai (vartotojo pastebėta parašų bloko/DĖŽIŲ SK. antraščių nesutapimas). Server.js buildVaztarastisHtml(vazt) iškelta į atskirą funkciją — VIENINTELIS šaltinis, naudojamas per GET /api/vaztarasciai/:id/html (išsaugotiems) ir naują POST /api/vaztarastis-html-preview (dar neišsaugotiems juodraščiams, be DB id). Desktop (vzDownloadPDF, vzSilentPrint, vzPeiktiVaztarasti) ir mobile (vaztPrint, vaztBuildEnrichedPaletes) dabar visi kviečia šiuos du endpoint'us. Pašalinta 448 eil. negyvo kodo (vzBuildVaztarastisHtml iš index.html) + ~200 eil. iš mobile.html. Per testavimą rasti ir pataisyti 2 realūs bug'ai: (1) bendra suvestinė rodydavo 0 be viso_vnt/viso_deziu (dabar skaičiuoja iš sumMap), (2) mobile siųsdavo tik laisvus vnt. kaip VISO stulpelį vietoj pilnos sumos (dabar naudoja pilnos/nepilna/factor skaidymo formatą kaip desktop).
  • ✅ Spausdinimo/UI smulkūs fix'ai: važtaraščio parašų bloko dizainas pataisytas pagal vartotojo nuotrauką (vardas virš linijos, ne atskirai), DĖŽIŲ SK./VISO (VNT) antraščių white-space:nowrap (anksčiau lūždavo į 2 eilutes realiame A4 plotyje). Chrome PrintHeaderFooter registro politika išjungta B kompiuteryje (URL nebespausdinamas puslapio apačioje per Ctrl+P). 4 scheduled task'ai (VM-Watchdog, VM-DriveBackup, VM-BackupSync, MeshCentral-Watchdog) gavo -WindowStyle Hidden (cmd langų blyksėjimas išspręstas).
  • ⚠️ Pastaba ateičiai: LT simbolių "sugadinimas" testiniuose laiškuose buvo TIK mano bash curl | node -e pipe artefaktas (žr. feedback_curl_utf8_windows_corruption.md), ne reali programos klaida — patvirtinta švariu testu (native fetch, be shell pipe'ų).
  • ✅ POUCH veiksmas gauna savo Telegram ikoną/pavadinimą (telegram-bot.js informuotiKitus()) — anksčiau POUCH pildymas patekdavo į bendrą „NAUJAS ĮRAŠAS" fallback šaką, dabar rodo 🛍️ „POUCH PILDYMAS" kaip STAKLĖS/SUPAKAVIMAS/MAIŠYMAS.
  • 2026-09-05 — sesija: VM Mesh (savas LAN A↔B mazgų valdymas, keičia Tailscale)

  • ✅ vm-mesh.js — naujas, VISIŠKAI ATSKIRAS Node HTTP serveris (ne server.js dalis, MESH_PORT env, numatyta 3500), pakeičia Tailscale funkciją A↔B ryšiui (abu kompiuteriai ir taip tame pačiame LAN — Tailscale čia tik komplikavo). 100% savas kodas, jokios trečiosios šalies VPN/tunelio/mokamos paslaugos.
  • - GET /api/mesh/status — šio mazgo būsena (be autentifikacijos, sveikatos patikrai)

    - GET /api/mesh/peers — žinomų mazgų (A 192.168.1.211, B 192.168.1.243, PEERS objektas kode) sąrašas + gyvumo patikra

    - POST /api/mesh/exec {cmd} — nuotolinis PowerShell komandos vykdymas kitame mazge, apsaugotas MESH_SECRET raktu (Authorization: Bearer, numatytas 'vm-mesh-2026-savas', keičiamas env kintamuoju) — patikrinta realiu Get-Date vykdymu A→B

    - POST/GET /api/mesh/relay — agentų (Claude/Agy) žinučių relė tarp mazgų, paprastas wmux-stiliaus A2A pašto dėžutė; žinutės saugomos logs/mesh-relay.json kiekviename mazge atskirai; POST persiunčia HTTP kitam mazgui su ?local=1 (apsauga nuo begalinio ciklo) — pirmoje versijoje relė persiuntimo neturėjo (žinutė matydavosi tik siuntėjo faile), pataisyta per testavimą

  • Diegimas: A — Scripts/mesh-watchdog-A.ps1 + VM-Mesh-Watchdog-A scheduled task (kas 5 min palaiko gyvą). B — start-mesh-b.bat + VM-Mesh scheduled task (AtStartup/AtLogOn, iki 999 auto-restartų).
  • ⚠️ Pastaba ateičiai (Windows Firewall B kompiuteryje): automatiškai pakartotinai sukuria BLOKUOJANČIĄ taisyklę „Node.js JavaScript Runtime" node-runtime\node.exe programai kiekvienam naujam klausomam prievadui be interaktyvaus patvirtinimo (jau 2 kartus per šią sesiją). Jei ryšys nustotų veikti po B restarto — pirma tikrinti netsh advfirewall firewall show rule name=all program="C:\Program Files\VM-Gamyba\node-runtime\node.exe" ir trinti Block įrašus (arba tikrinti, ar veikia jau pridėta „VM node-runtime allow-all" taisyklė).
  • 2026-09-08 — sesija: Gavimai atskiras meniu punktas, Kliento LOT stulpelis, palaidi/įprasto vaztarasčio fix'ai, paleidimo scenarijaus stabilumas

  • ✅ „Gavimai" iškeltas iš Gamybos ekrano pod-tab į atskirą top-level šoninio meniu punktą (switchTab('gavimai') → renderGavimaiTab(), kaip VAŽTARAŠTIS/KLIENTAI) — ilgai atidėliotas patogumo prašymas, naujas dedikuotas langas su paieška, kliento filtru, rikiavimu, tipo filtru. Sena pod-tab juosta išvalyta, filterByTipas('gavimai') paliktas kaip peradresavimas į switchTab('gavimai') suderinamumui. Detaliau → aukščiau esanti KRITINĖ PASTABA (atnaujinta), įsk. našlaitę renderGaminamaGavimaiLentele().
  • ✅ Gavimų paieškos laukas nebeprarasdavo fokuso po kiekvienos raidės — oninput anksčiau kviesdavo visą async renderGaminamaGavimaiLentele(), kuri perrašydavo VISĄ konteinerį (įsk. patį ) į spinnerį, tada laukdavo fetch'o. Fix: filtravimo logika atskirta į _gavimaiFiltruotos() (be DOM/tinklo), nauja lengva _gavimaiAtnaujintiLentele() atnaujina TIK #gavimaiTableWrapper iš jau atmintyje esančių duomenų. Bendra pamoka (žr. [[feedback_search_input_full_rerender_focus_loss]]) — paieškos oninput niekad negali kviesti viso ekrano re-render'o su fetch'u.
  • ✅ Maišymo lange būnant nebeišmesdavo automatiškai į Gavimai — Gavimai kortelės detalaus vaizdo „Maišymai" mygtukas kviesdavo filterByTipas('maisomi') TIESIOGIAI, apeidamas switchTab(), todėl activeSidebarTab likdavo senas ('gavimai') ir periodinis 30s fetchProductionData() refresh'as tyliai grąžindavo vartotoją į Gavimai sąrašą. Fix: filterByTipas() dabar pati sinchronizuoja activeSidebarTab+sidebar klasę, jei patenkama iš kito ekrano — analogiškas atvejis [[feedback_activesidebartab_stale_state]] atminčiai (kito ekrano mygtukas apeina switchTab()).
  • ✅ Kliento LOT stulpelis Gavimų lentelėje — naujas redaguojamas stulpelis (card.kliento_lot, kolona jau egzistavo DB nuo anksčiau) tarp Produkto ir Plėvelės grupės; paspaudus langelį virsta inline tekstiniu inputu (PATCH /api/gamybos-korteles/:id, be viso ekrano perpiešimo). Kai kliento_lot nenustatytas, rodomas vidinis LOT kursyvu/pilkai (tas pats fallback, kurį jau seniai naudoja etikečių generavimas) — anksčiau langelis klaidingai atrodydavo tuščias. Vėliau tą pačią dieną pataisyta — vidinis LOT kaip fallback KLIENTO stulpelyje buvo klaidingas sprendimas (vidinis LOT = savo darbo plėvelės atsekamumo numeris, ne kliento LOT, du visiškai skirtingi dalykai) — grąžinta prie paprasto „-", kai tuščia. Priimti pakuotes modale (Tab 2) taip pat pridėtas „Kliento LOT (neprivaloma)" laukas, saugomas atskiru PATCH po registruoti-gavima.
  • ✅ /api/admin/sukurti-gavima nesiuntė Telegram/email pranešimų — endpoint'as (naudojamas Agy agento programiniam žaliavos gavimo registravimui) tik įrašydavo į zaliavu_gavimai, skirtingai nuo /api/priimti-medziagas//api/papildyti-zaliava//api/mobilus/priimti, kurie visi siunčia notifyTelegram+notifyEmailDSZaliava. Pridėta ta pati logika. Žr. [[feedback_admin_endpoint_missing_notifications]] — pasikartojanti klasė: kelios vietos daro tą patį veiksmą, bet ne visos turi tuos pačius šalutinius efektus.
  • ✅ Palaidi/įprasto likučio dar vienas atskyrimo fix'as (GET /api/vaztarastis-duomenys, POST /api/nurasyti-vaztarasti) — palaidi ir įprastas (supakuotas) likutis buvo klaidingai atimami iš BENDROS (palaidi+įprasta) išrašytos sumos, nors tai du nesusikertantys telkiniai (palaidi niekad nepasiekia pakavimo — žr. [[project_palaidi_supakuota_atskiri_telkiniai]]). Realus pavyzdys: True electrolytes palaidi likutis rodė 32156 vnt., realiai 381 — leisdavo priimti perviršinį siuntimą. Šis fix'as apima KITĄ endpoint'ų porą nei 2026-09-07 fix'as (server.js likučio formulės) — index.html frontend pusė VIS DAR turi tą pačią klaidą (Agy #65, nepataisyta).
  • ✅ Važtaraščio „Siųsti dar kartą" mygtukas tyliai nieko nedarydavo — onclick atributas turėjo JSON.stringify() rezultatą su dvigubomis kabutėmis, įdėtą į HTML atributą, kuris pats naudoja dvigubas kabutes — atributas nutrūkdavo pusiaukelėje. Konkretus atvejis bendrai [[feedback_quoting_escaping_pattern]] klasei (kabutės/escaping tame pačiame delimiteryje). Kartu: naujas savo stiliaus _vzConfirmModal vietoj naršyklės confirm() (Chrome po kelių iš eilės dialogų leidžia vartotojui juos visam laikui išjungti — tada visi būsimi confirm() tyliai grąžina false).
  • ✅ Maišymo kortelės (spausdinimo) modale kg laukas ir „+ Pridėti" mygtukas dingdavo — CSS grid (1fr auto auto) , o grid stulpelis (default min-width:auto) to nesutraukindavo — kg laukas ir mygtukas išlysdavo už modalo ribų (overflow:hidden, nematomi). Bendra CSS grid pamoka: min-width:0 (arba minmax(0,1fr) stulpeliui) reikalingas VISUR, kur grid/flex elementas turi turinį, galintį būti platesnį už norimą stulpelį.
  • ✅ Dubliuota „Registruoti maišymą" pašalinta iš spausdinimo modalo — 2026-08-31 grąžintas blokas (žr. aukščiau) pasirodė esąs antras, dubliuotas maišymo registravimo UI, kviečiantis LYGIAI TĄ PAČIĄ /api/gamybos-korteles/:id/registruoti-maisyma endpoint'ą kaip pilnas „Maišomi" vaizdas — ir buvo pagrindinė priežastis, kodėl dešinė kolona atrodydavo sugrūsta (žr. punktą aukščiau). Pašalinta: HTML blokas + gkCalcMaisymas()/gkRegistruoti() (patikrinta — niekur kitur nenaudojamos). Palikta: maišymų istorijos peržiūra + spausdinimo funkcija (modalo pagrindinis tikslas).
  • ✅ Mobiliame bendrame kiekio registravimo lauke (ne-pouch openQuickRegister) pridėtas vnt./dėž. perjungiklis (rodomas kai receptas turi pak_dezeje) — anksčiau laukas priimdavo tik parseInt, vartotojas įvedęs „10.30" (tikėdamasis „10 dėž. + 30 nepilnoje", kaip veikia kitur programoje) gaudavo tik 10 — .30 dalis tyliai dingdavo, užregistruotas kiekis būdavo klaidingas. Žr. [[feedback_mobile_qty_vnt_dez_toggle]] — tas pats bendras laukas, kurį pouch kortelių braukimas kairėn vis dar naudoja vietoj specialaus dėžės+nepilna lango.
  • ✅ Paleidimo scenarijaus (start-background.ps1) stabilumas — node --watch pakeista į --watch-path su 6 konkrečiais pirmapradžiais .js failais (server.js, gamybos_ciklas.js, faktinis_sunaudojimas.js, gamybos_langas.js, telegram-bot.js, email-notify.js): bare --watch stebėjo VISĄ importuojamų modulių grafą IR bet kokį failo pasikeitimą kataloge, todėl važtaraščio PDF generavimas (Playwright, laikinai rašo failus disko) periodiškai sukeldavo pilną serverio restartą vidury užklausos (ECONNRESET, jokios klaidos žurnale). Naują local importą PRIDĖTI į šį sąrašą. Proceso-žudymo filtras pakeistas iš bendro "*server.js*" į tikslų kelią "*$workDir\server.js*" — senas filtras atitikdavo BET KOKĮ node.exe procesą su tokiu failo pavadinimu sistemoje, įsk. nesusijusius C:\Chat\server.js ir C:\Kaimai\server.js (abu turi identišką failo pavadinimą) — tyliai juos nužudydavo po kiekvieno perkrovimo/watchdog restarto. Žr. [[feedback_watchdog_serverjs_filter_pavojus]].
  • 📄 Naujas klientas VIRONOX/UAB ACONITUM (VX) — CLAUDE.md klientų sąrašas papildytas, agy-uzduotis.md #64-67 užduotys (kortelės sukurtos iš Printela plėvelės pristatymo lapo).
  • 2026-08-11 — sesija (3): OmniRoute valdymas agentui

  • ✅ OmniRoute valdymo prieiga agentui SUKONFIGŪRUOTA — API raktui sk-91161731e4e0d947-178100-78f44d6b (CLI Auto-Key, id 67af762b-72a3-4ca8-ad05-0fe6af0ea185) suteiktas manage+admin scope tiesiogiai ~/.omniroute/storage.sqlite (backup: storage.sqlite.backup-20260811-234750). Patikrinta gyvai: GET/PATCH /api/settings, GET /api/tunnels/tailscale/check, GET /api/models — visi 200 su Bearer. Agentas dabar gali programiškai keisti visus OmniRoute nustatymus: omniroute --base-url http://localhost:20128 api settings ..., tunelius (/api/tunnels/*), providerius, rate limit, IP filtrą, requireLogin, modelių routingą.
  • ✅ Analizė sukurta: C:\Users\justa\OMNIROUTE-TAILSCALE-CODEX-ANALIZE.md — Tailscale integracija, agento nustatymų CRUD, Codex nemokamai (pilna diagnozė).
  • ⚠️ Kritiniai radiniai (kodui/ateities sesijoms):
  • - Tailscale Funnel JAU aktyvus → https://justas.tailf67d20.ts.net/ → 127.0.0.1:3000 (VM serveris). OmniRoute savo Funnel įjungimas perrašytų šį maršrutą (vienas root maršrutas). Vartotojo sprendimas užfiksuotas atmintyje: VM puslapis turi likti, OmniRoute tik PRIDĖTI (ne perrašyti) — žr. [[feedback_tailscale_funnel_neraoverwrite]].

    - oc/* modeliai routeriuje → "codex" provider, kuriam prisijungimo NĖRA (codex OAuth neegzistuoja — 404). opencode/* → "opencode" provider, bet jo raktas sugedęs (upstream "Missing API key", nors statusas "active"). Codex CLI fix reikalauja vartotojo veiksmo: perdaryti opencode API raktą Dashboard → Providers → "OpenCode Account 1".

    - Nemokami modeliai VEIKIA per API (auto/coding:free, oc/longcat-2.0-free, oc/deepseek-v4-flash-free, opencode/deepseek-v4-flash-free) — Codex CLI kaip klientas NEveikia (žr. aukščiau).

    - Kiti tuneliai (neperrašo VM Funnel): cloudflared quick tunnel (POST /api/tunnels/cloudflared, be paskyros/rakto) ir ngrok (POST /api/tunnels/ngrok, reikia NGROK_AUTHTOKEN). Abu atskiri nuo Tailscale. Vartotojo sprendimas atidėtas rytoj; prieš viešą adresą patikrinti requireLogin. Detaliau — atmintyje [[project_omniroute_valdymo_setup]].

    2026-08-11 — sesija (viršvalandžių komentaras + wmux/Orca skills + taisyklių analizė)

  • ✅ darbo_laikas DB — nauja komentaras kolona (server.js migracija su guarded ALTER TABLE): POST/PUT priima laisvą komentarą prie dienos, GET grąžina per SELECT *. Desktop „Viršvalandžiai" ir Mobile „Darbo laikas" istorijoje paspaudus dieną su komentaru — komentaro popup (vvShowComment/hrShowComment, fiksuotas overlay su mousedown+click guard). Desktop forma: „Komentaras (nebūtina)" laukas (vvFormKom). Telegram boto INSERTai (be komentaro) veikia per DEFAULT ''. Detaliau — §3 schema + §6 UI.
  • ✅ Telegram boto įrašto komentaras atkurtas — vartotojo praleistas komentaras (registruota prieš serverio fix) įrašytas tiesiai į DB per UPDATE.
  • 2026-08-11 — sesija (2): New skills

  • ✅ Sukurti 4 *.claude/skills/ skill'ai (kaip Orca CLI): wmux (daugiaagentė orkestracija per MCP, Orca vs wmux atskyrimas, „kur vyksta tavo sesija" — išorinė sesija = tik stebėjimas → patikrinta gyvai), orca-cli (darbinis terminalas), orchestration (a2a gyvavimo ciklas, misijos, fanout, deck), wmux-browser (naršyklės automatizavimas). Skill'ai auto-atsidaro pagal description frazes.
  • ✅ Gyvas wmux MCP patikrinimas: iš išorinės (ne-wmux-terminalo) sesijos veikia TIK workspace_list/a2a_discover/pane_list/surface_list; visi identity-scoped įrankiai (channel_*, a2a_task_*, wmux_events_poll, wmux_search_panes, browser_*, terminal_read su ptyId) grąžina *Workspace identity unknown* / *BROWSER_TABS_WORKSPACE_UNRESOLVED*. Reikia bėgti wmux terminalo workspace'e.
  • 2026-07-08 — sesija (commit'ai b3b6e16, 5d7095e, ac405a1, f0c8a42)

  • ✅ Gavimai → Gaminama (index.html): gavimų lentelė perkelta iš Gamybos lango į Gaminama kaip pilnavertis tabas — gamybos būklės dashboard'as (Agy užduotis #25 + Claude pertvarkymas). Virtualios eilutės (_pradetiIsVirtualaus), redagavimas tiesiai lentelėje, „Pradėti gamybą" mygtukas, naujausias gavimas viršuje.
  • ✅ Rezervacijos įrankis (Gaminama skydelis): kelių produktų bendras žaliavų poreikis vs sandėlis, kg—vnt. formatas, PDF gulsčias/stačias.
  • ✅ Maišymo kortelės spausdinimas: „Viso užsakymui" stulpelis, kompaktiškas maišymų tinklelis, LOT/EXP žaliavų lentelėje.
  • ✅ Mobile Priėmimas: vieninga produktų paieška, pouch veiksmo mapping fix, dropdown skaidrumo fix (--bg-sheet).
  • ✅ Suvienodintas „Nauja kortelė" modalas tarp Gamyba ir Gaminama langų.
  • ✅ „Premix pasiruošimas" spausdinimo lapas (index.html, vakarinė sesija): _premixSmulkus(ings, svorisGr) atrenka smulkius ingredientus (< 0.25 g/pktl ARBA < 2% pakuotės svorio, min 2 vnt.), printPremixLapas() spausdina atskirą violetinį lapą — kiekiai visam užsakymui, LOT/EXP, MIX norma g/pktl ir prisvėrimo pavyzdžiai maišymams. Mygtukas kortelės modale šalia „Spausdinti gamybos užduotį", rodomas tik kai receptas turi smulkių. Jokių DB pakeitimų — viskas dinamiška (vartotojo sprendimas: premix maišomas visam užsakymui iš karto, be atskiros žaliavos/LOT sekimo). Kilmė: Agy #26 TITAN analizė (titan-premix-analize.md) — senoje sistemoje buvo 2 receptai, premix MIX (OF) 0.32037 g/pktl = 9 smulkiųjų suma.
  • ✅ Premix kiekis pagal gautas dėžutes: _printKorteleData papildytas dezGauta (žurnalo veiksmai Gauta dėžutės/Dėžutės gautos/Priimta dėžutė, match pagal batch-LOT arba pavadinimą). Premix lape kiekis — redaguojamas #pmQty input su gyvu perskaičiavimu (pmRecalc(), data-norma atributai) ir „Pagal gautas dėžutes: N dėž. × pak_dezuteje ⟵ naudoti" mygtuku. Jei plano nėra — startuoja nuo dėžučių kiekio. Use case: TITAN dėžutės gautos (7 550 dėž. × 30 = 226 500 pktl), plėvelė dar ne.
  • 2026-07-07 — sesija (commit'ai 4d647c2, 0404cbe, 35b1443)

  • ✅ BACK TO LIFE multi-regionų kortelė LT/LV/palaidi: regiono SUDĖTA „dėžės.dėžutės" formatu; fix — SUDĖTA žurnalo trynimas/keitimas perskaičiuoja kiekvieno regiono supakuota_kiekis (anksčiau „įstrigdavo"). Sukurtos/atkurtos kortelės: SELENE (BF), HYDRO FORTE LV/EST (BF).
  • ✅ Važtaraštis: juodraščio autosave (localStorage, su atkūrimo pasiūlymu; fix — vzClientChanged() nebeištrina atkurtų palečių), „Dėžučių/dėž." stulpelis, spausdinimo lūžio fix (display:table), regiono pasirinkimas prekės pridėjime, palaidi varnelė BF klientams.
  • ✅ Etikečių spausdinimas: „Palaidi" varnelė laisvame generatoriuje + „PALAIDI" žyma.
  • ✅ „▶ Pradėti gamybą" mygtukas maišymo lange ir pouch sandėlio sąraše (vietoj duomenis dubliavusio „Baigti gamybą").
  • ✅ Agy #24: LIKE 'STAKL%' → tikslus veiksmas = 'STAKLĖS' atitikimas 3 žurnalo endpoint'uose (dvigubo pagaminta_kiekis skaičiavimo fix). Agy #22/#23: mobile važtaraščio vaztNepilnaUsesDezSub() helperis + CSS calc(-1 * var()) fix.
  • 2026-07-03 — sesija

  • ✅ Mobile etiketės — NUTRIOTECA (SL) šablonas (public/mobile.html) — mobilioji app etikečių ekranas visada naudojo bendrą /api/gamybos-korteles/:id/etiketes-html (24 lipdukai/lape, generinis dizainas), net ir SL klientui, kuriam turi būti spausdinamas kitoks, kliento pateiktas NUTRIOTECA šablonas. Svarbu (dvi skirtingos endpoint'os, nesupainioti): /api/dezes-lipdukas?kortele_id= generuoja 1 lipduką/lape — tai atskiras „🏷️ Dėžės lipdukas" mygtukas transportinės dėžės išorei (desktop index.html). /api/etiketes-laisvos?receptas_id=&lot=&exp=&serija=&lapai= su NUTRIOTECA_LABEL_MAP recepto ID generuoja 14 lipdukų/lape (pagal lapai param) — tai teisingas endpoint'as įprastam „daug etikečių ant lapo" spausdinimui (naudoja desktop'o „Etiketės laisvos" modalas). Pataisyta: naujas _etiketesUrl(id, lapai) helperis, kuris SL kortelėms nukreipia į /api/etiketes-laisvos (su card.kliento_lot||card.lot, card.exp, card.receptas_id), o ne į /api/dezes-lipdukas. „Lapų skaičius" antraštė dinamiškai rodo 14 vs 24 pagal klientą.
  • ✅ Mobile etiketės — užsakovo filtras (public/mobile.html) — pridėtas „Užsakovas" pasirinkimo laukas (dropdown iš unikalių kliento_kodas reikšmių tarp visų kortelių) prieš produkto paieškos lauką; pasirinkus užsakovą, paieškos sąrašas filtruojamas tik pagal jo korteles. Sąrašo įrašuose taip pat pridėta kliento spalvota žymė (renderClientBadge).
  • Patikrinta realiu Playwright headless naršyklės paleidimu prieš veikiantį serverį + tiesioginiu curl į /api/etiketes-laisvos — patvirtinta 28 lipdukai (14×2 lapai) su teisingu produkto pavadinimu ir kliento LOT; ne-SL kortelėms senas /etiketes-html + 24/lape srautas nepakitęs.
  • ✅ wmux MCP įrankis įdiegtas (sisteminis, ne repo dalis) — Windows terminalo multiplekseris agentų tarpusavio bendravimui (a2a_send/a2a_broadcast) tarp Claude Code ir kito CLI agento (Agy/Antigravity CLI), be vartotojo rankinio perdavimo. Konfigūracijos backup prieš diegimą: ~/.claude/backups/pre-wmux-20260703-081807/. a2a_discover pasirodė nepatikimas (mato tik save) — žr. [[feedback_wmux_pane_targeting]] atmintyje, naudoti pane_list/surface_list + terminal_send su konkrečiu ptyId.
  • ✅ AGENTS.md — „Gyvas kanalas" — per wmux sukurta antra Claude Code sesija (kartu su Agy) šalia šios, jai priskirta ir užbaigta Užduotis #13/#14 (BF receptų pakavimo konfliktų sprendimas realiais PDF/Excel šaltiniais). Rezultatas: visi 22/22 BF produktai importuoti į DB (SELENE, Laxmag papildyti vartotojo pateiktais duomenimis). Detali eiga → agy-uzduotis.md #14, likę atviri klausimai (LABASEN/SPORT PROTEIN NR.2 dublikatai, COR4 be sudėties, BIOKALCIS svorio neatitikimas) → [[project_bf_receptu_spragos]] atmintyje (bendra abiem sesijoms).
  • Commit f61f0ac: mobile etikečių fix + AGENTS.md/agy-uzduotis.md/bf-receptai-draft.md pakeitimai.
  • ✅ Projekto analizė + kritinių klaidų taisymas (server.js, telegram-bot.js, public/mobile.html) — pilna analizė (Claude fork + Agy #15) rado bugus abiejuose backend failuose. Pataisyta:
  • - telegram-bot.js: pridėtas escHtml() — Telegram parse_mode:'HTML' pranešimai anksčiau lūždavo su &/</> simboliais vartotojo varde/produkto pavadinime (400 klaida, pranešimas neišsiunčiamas).

    - telegram-bot.js (apdorotiMaisyma): trūkstama recepto norma (baseNorma/ing.norma = null/undefined) galėjo įrašyti NaN į zaliavos.likutis — pridėta !(x > 0) patikra (pagauna NaN/null/undefined, ne tik <=0).

    - telegram-bot.js: hrDel_, archyvavimo (confirmF_) ir žurnalo trynimo (dL_) catch blokai anksčiau arba tylėjo apie klaidą, arba apeidavo server.js verslo logiką tiesioginiu DB rašymu — dabar visur tiesiog praneša klaidą vartotojui.

    - telegram-bot.js: 3 vietose (zGaliojimas|, pGaliojimas|, dGaliojimas|) EXP data priimama be validacijos — pridėta isValidDateStr() (YYYY-MM-DD regex + Date patikra).

    - server.js (registruoti-pagaminta): KRITINĖ — catch fallback aklai kartodavo pagaminta_kiekis += kiekis, nors faktinis_sunaudojimas.js registruotiPagaminta() (be transakcijos, WAL) galėjo jau būti atlikusi tą pačią operaciją prieš klaidą → galimas dvigubas kiekio užskaitymas. Fallback pašalintas, dabar tiesiog 500 su klaidos tekstu.

    - server.js (toggle-pill): pridėta isNaN patikra prieš rašant boolean-tipo stulpelį.

    - public/mobile.html: offlineQueue.processQueue() po sėkmingos sinchronizacijos visada kviesdavo render(), ištrindama darbuotojo pildomą Priėmimo formą (#mBulkRows gyvena tik DOM'e) — dabar render() praleidžiamas, jei state.screen === 'receiving'.

    - Atidėta (architektūrinis sprendimas, ne bugfix): UTC vs Europe/Vilnius laiko zona (new Date().toISOString() naudojama visur sistemoje vienodai — pataisius tik vieną lauką atsirastų nenuoseklumas).

  • ✅ Važtaraščio „papildomi adresai" (alternatyvus gavėjas) — pridėtas UI abiejose versijose (desktop public/index.html: vz-address-wrap/vzGetRecipient(); mobile public/mobile.html: vaztAddress/vaztGetRecipient()), leidžiantis pasirinkti kliento papildomi sąrašo adresą vietoj pagrindinio važtaraščio kūrimo metu.
  • 🔴 SVARBUS RADINYS: PocketBase schema "nutyli" nežinomus SQLite stulpelius. klientai.papildomi stulpelis realiai egzistuoja SQLite lentelėje (pridėtas anksčiau tiesiogiai, ne per PB migraciją), bet pb.collection('klientai').getFullList() jo VISAI negrąžina JSON atsakyme — PocketBase serializuoja tik laukus, kuriuos pats žino iš savo schema meta. Bet koks endpoint'as, naudojantis pb.collection() (ne tiesioginį db.prepare()), NEGAUS papildomi reikšmės, net jei ji SQLite yra. Pataisyta GET /api/vaztarastis-duomenys (server.js) — po pb.collection('klientai').getFullList() papildomai užklausiama db.prepare('SELECT id, papildomi FROM klientai') ir sujungiama pagal id. Jei ateityje kitas endpoint'as irgi naudoja papildomi (ar bet kurį stulpelį, pridėtą praeityje tiesiogiai per SQLite, ne PB Admin UI/migraciją) per pb.collection() — jam reikės to paties merge patch'o.
  • ⚠️ klientai.papildomi laukas naudojamas DVIEM SKIRTINGAIS TIKSLAIS — dauguma klientų jį naudoja kaip masyvą papildomų pristatymo adresų [{pavadinimas, adresas}] (pvz. SOULEL/„SL"), bet bent vienas klientas („SM"/SANTAMED LT) jį naudoja kaip objektą su {imones_kodas, pvm} (įmonės rekvizitai). Kodas, skaitantis papildomi kaip adresų masyvą, turi apsisaugoti nuo šio atvejo (JSON.parse(...) gali grąžinti objektą, ne masyvą — Array.isArray() patikra prieš .map()).
  • ✅ SOULEL (kodas „SL") kliento pavadinimas/adresas pakeisti į „Logistus 3PL" / „Ugniagesių g. 14, LT-02244, Vilnius, Lietuva" — vartotojo prašymu, jo važtaraščiai turi rodyti 3PL sandėlį kaip gavėją, ne patį SOULEL. kodas='SL' NEPAKEISTAS (receptai/kortelės sieja per kodą, ne pavadinimą) — pakito tik display laukai.
  • 2026-07-02 — sesija (didelė, maratoninė)

  • ✅ Dosje/archyvavimo logikos suvienodinimas (server.js) — buvo 4 lygiagrečios, istoriškai išsiskyrusios dosje/kortelės generavimo implementacijos. Ištrinta perteklinė/buginga GET /api/dosje/:id (ir client-side window._printDosje, ~68 eil.) — liko archyvuoti (stored dosje_tekstas), /dosje-html (visada gyvai perskaičiuojamas HTML), ir printGamybosKortele()/_printFaktineKortele() (maišymo kortelės spausdinimas).
  • ✅ pakuociu_nurasymai lentelė (nauja, žr. §3) — pouch pakuočių PASTOVUS nurašymas archyvuojant, kad pakuociu_sandelis "laisva" liktų teisinga po archyvavimo (anksčiau dingdavo iš rezervacijos skaičiavimo).
  • ✅ archyvuoti endpoint fix'ai — idempotencijos apsauga (jei jau archyvuota → klaida), nurasymai SQL trūko zaliava_id (sukeldavo "cannot be bound to SQLite parameter 1" klaidą), važtaraščių paletės/dėžės skaičiavimas filtruojamas pagal PRODUKTĄ (buvo klaidingai imami visos siuntos totalai — dosje rodydavo kitos produkcijos pal./dėž. skaičius), žaliavos grupuojamos pagal pavadinimą, kliento kodo fallback (kliento_kodas → receptas.klientas kai 'KITA'/tuščia).
  • ✅ faktiniai_duomenys TEXT — perkeltas iš retai trigerinamo sync kelio į besąlyginę startup migraciją (anksčiau archyvavimas visada lūždavo "no such column").
  • ✅ baigti-stakles — pouch tipo produktams dabar VIENOJE UPDATE kartu nustato ir stakles_baigtos=1, ir pakavimas_baigtas=1 (pildymas+pakavimas vyksta vienu metu pouchams) — bet koks UI kelias (senas/naujas) dabar nuoseklus.
  • ✅ /api/istorija — grąžindavo be sumaisytas_kiekis/pakuotes_tipas/faktiniai_duomenys laukų → "Gamybos kortelė" iš Istorijos rodydavo 0/tuščia. Papildyta.
  • ✅ Gamybos lango kortelės quick-menu (index.html) — paspaudus produkto pavadinimą, mažas popup: Maišymai / Etiketės / Baigimo darbai / Kortelė info (vietoj tiesioginio modalo). ~470 eil. pašalinta negyvo kodo (openMaisymasModal, submitMaisymas, vzPrintHistory, _openZaliavosIstorijaModal).
  • ✅ "Gamybos kortelė" spausdinimas perrašytas — pašalintas prieš-spausdinimo bazės/kg dialogas (dabar spausdina iš karto), pašalintas dvigubas "pilni maišymai vs. paskutinis maišymas" stulpelis (dabar vienas: norma_porcijai × sumaisytas_kiekis, BE nuostolių%). Pervadinta "Spausdinti kortelę" → "Spausdinti gamybos užduotį".
  • ✅ PDF atsisiuntimas — nauji helperiai _downloadHtmlAsPdf() / _downloadDosjePdf() (naudoja esamą /api/generuoti-pdf), "📥 PDF" mygtukai prie visų "🖨 Dosje" vietų + spausdinimo languose.
  • ✅ BF receptai — 24 iš viso (buvo 6): užpildyta HYDRO FORTE 1/2 ir POWER C 1000 sudėtis (anksčiau tušti arba klaidingai recepto_sudetis lentelėje su dubliuotomis žaliavomis); importuota 18 naujų receptų iš senos xlsx (bf-receptai-draft.md). HYDRO FORTE LT/LV-EST liko be savo ingredientai — tai teisinga: jos yra combo-dezute tipo pakavimo įrašai, sudaryti iš HF1+HF2 (žr. pastabos lauką recepte). Neišspręsta: LABASEN 1 GR / SPORT PROTEIN NR.2 (identiški LABANAKT/SPORT PROTEIN — dublikatai?), COR4/SELENE/Laxmag (nėra sudėties senoje sistemoje), BIOKALCIS 1200 (katalogo svoris≠sudėties suma) — žr. [memory: project_bf_receptu_spragos.md].
  • ✅ .claude/hooks/block-dangerous.sh (lokalus, negit'inamas) — pridėta S:\ prieigos blokada bet kokiai Bash/PowerShell komandai (mechaniškai vykdo CLAUDE.md taisyklę, ne tik tekstu). git commit išimtis praplėsta tikrinti bet kur komandoje (ne tik pradžioje), kad neblokuotų git add && git commit -m "..." grandinių, kur žinutėje paminėtas "S:\".
  • ✅ CLAUDE.md — sesijos pabaigos rutina papildyta žingsniu peržiūrėti sesijos klaidas/korekcijas ir jas fiksuoti kaip feedback_*.md atmintį (self-improving-agent formatas), neatidėliojant.
  • 2026-07-01 — sesija

  • ✅ Važtaraštis — spausdinimo šablonų suvienodinimas (index.html) — vzSilentPrint() naudojo seną, neteisingą šabloną (kitas įmonės pavadinimas/adresas). Ištraukta bendra vzBuildVaztarastisHtml() funkcija — dabar „Peržiūra"/PDF/„Spausdinti" visi naudoja tą patį, teisingą GAS stiliaus maketą.
  • ✅ Važtaraštis — dvigubo dėžių skaičiavimo klaida (index.html) — nepilnos dėžės +1 buvo pridedama du kartus (prie it.dez/it.space, kurie jau įskaičiuoja nepilną, ir dar kartą suvestinėje) → 8 pilnos + 1 nepilna rodė 10 vietoj 9. Ištaisyta bendroje suvestinėje, paletės antraštėje ir produktų suvestinėje.
  • ✅ Važtaraštis — lentelė supaprastinta (index.html + server.js) — pašalintas nereikalingas „DĖŽUČIŲ/DĖŽ." stulpelis, „PKTL./DĖŽ." pervadintas į „PAK./DĖŽ." (abu šablonai: peržiūra/spausdinimas ir istorijos PDF).
  • ✅ Važtaraštis — „Nepilna dėžė" laukelio regresija (index.html) — pouch produktams (dez_dezeje=1 yra tik apeinamasis žymėjimas „nėra tikro sub-lygio", ne reali struktūra) laukelis klaidingai interpretavo įvestą kiekį kaip dėžučių, ne vnt., ir dauginant iš pak_dezuteje gaudavo klaidingą (10–50×) kiekį. Sąlyga pataisyta į dez_dezeje > 1 — realus dėžučių sub-lygis egzistuoja tik HYDRO FORTE tipo produktams.
  • ✅ Maišymo kortelės modalas — persidengimas (index.html) — „Paketeliai" grupė neturėjo flex-shrink:0, siaurame lange etiketė persidengdavo su input laukeliu. Pridėta abiem („Nuostoliai", „Paketeliai") grupėms.
  • ✅ „Maišomi" kortelė (index.html) — pridėtas užsakovo pavadinimas (ne tik kodas) prie kiekvienos kortelės; ištaisyta rašybos klaida „Maisomi" → „Maišomi" tab'o etiketėje.
  • ✅ Etiketės — „7g" pašalinta (server.js) — svoris nebebuvo reikalingas etikečių info eilutėje (/api/etiketes-laisvos ir kortelės /etiketes-html), trukdė sutilpti likusiai informacijai.
  • ✅ NUTRIOTECA (SL) transportinės dėžės etiketė (server.js) — nauja funkcija pagal kliento pateiktą .docx šabloną 5 produktams (Daily Creatine, Bone Broth + Creatin, Electrolytes + Creatine/Vitamin C/Red Berries): prekės ženklo pavadinimas, N packs (net Xg), Brutto, Best before, kliento LOT (atskiras nuo mūsų vidinio), Units per box, EAN-13 barkodas (grynas JS, be išorinių bibliotekų — renderEAN13Svg()), UAB Aeterna Cibus rekvizitai. Integruota į /api/etiketes-laisvos (12→14 lipdukų/lape, sutankinta) ir atskirą /api/dezes-lipdukas?kortele_id=. Naujas DB laukas gamybos_korteles.kliento_lot. „🏷 Etiketės" mygtukas šiems produktams automatiškai atidaro šį šabloną.
  • ✅ Brutto svorio skaičiavimas (server.js) — nauji receptai laukai pak_svoris_g (paketėlio plėvelė), dezute_svoris_g (dėžutė), deze_svoris_g (transportinė dėžė). Brutto = (svoris_g+pak_svoris_g)×Units_per_box + dezute_svoris_g×dez_dezeje + deze_svoris_g. Užpildyta 3/5 SL produktams (Vitamin C, Red Berries, Daily Creatine); likusiems 2 (Bone Broth, Electrolytes+Creatine) laukia realių pakuotės svorių — lieka tuščia eilutė kaip originaliame šablone.
  • ✅ DRIVE katalogo valymas (server.js) — naktinis cron (3:00) dabar taip pat valo pamirštus _tmp_*.html failus DRIVE/ kataloge (PDF failai/istorija neliečiami).
  • ✅ SQLite MCP serveris — sukonfigūruotas .mcp.json (mcp-server-sqlite-npx, nukreiptas į pb_data/data.db) tiesioginėms SQL užklausoms be node -e scenarijų.
  • ✅ Agy CLI paleidimo pataisymas — VM Agentai.lnk „Agy" tab'as klaidingai paleisdavo agy.cmd (senas apsimestinis wrapper'is su Claude Code + custom prompt), nors tikras Antigravity CLI (agy.exe, jau PATH) seniai įdiegtas. Pataisyta nuoroda, ištrintas pasenęs agy.cmd + .claude/agy-prompt.md.
  • 2026-06-30 — sesija

  • ✅ Maišymo kortelė — paketelių skaičius (index.html + server.js) — naujas "Paketeliai" laukelis modalo parametrų juostoje: įvedi N vnt → ingredientai perskaičiuojami pagal N × norma × (1+nuostoliai%). Spausdinimas: pktCount query param, antraštė rodo "N pkt" vietoje "1 maišymui". Prioritetas: bazė > paketeliai > planas.
  • ✅ Mobile etiketės — visos kortelės (mobile.html) — anksčiau rodė tik aktyvias (gamyba_pradeta=1). Dabar lazy-load visų ne-archyvuotų iš /api/gamybos-korteles kai atidaromas ekranas. Ženkliukai [Plan.] / [Baigta] / [Aktyvi].
  • ✅ Mobile etiketės — paieška (mobile.html) — dropdown pakeistas teksto lauku su live filtru pagal pavadinimą arba LOT. Sąrašas rodomas žemiau, paspaudus pasirenka ir užsidaro. ✕ mygtukas valo pasirinkimą.
  • ✅ etiketesPrint fix (mobile.html) — safeFetch() grąžina JSON, bet /etiketes-html grąžina HTML → pakeista į fetch() + .text().
  • 2026-06-23 — sesija (pilna diena)

  • ✅ Važtaraščio spausdinimas — LOT/EXP atskirose eilutėse, PAK./DĖŽ. headeris, pouch nepilna dėžė, LOT: prefiksas
  • ✅ Važtaraštis "Viską" mygtukas — desktop + mobile, automatiškai prideda visą sandėlio likutį su teisingomis dėžėmis
  • ✅ Važtaraštis "Spausdinti" — desktop tylus spausdinimas per /api/mobile/print (kaip mobile)
  • ✅ Gamybos kortelė bazės pasirinkimas — dialogas prieš spausdinant, maišymų skaičiavimas pagal bazę
  • ✅ Faktiniai duomenys — archyvuojant išsaugomas JSON (faktiniai_duomenys kolona), iš istorijos spausdina faktinę kortelę
  • ✅ Partijų rodymas — getIngBatch pataisytas (includes match), serveris be busena filtro
  • ✅ Pouch likučio fix — vaztarastis-duomenys ir nurašymas naudoja pagaminta kai supakuota=0
  • ✅ Pouch mobile — kortelės detail rodo dėžes+nepilną, "Pripildyta" label, teisingas sandėlio likutis
  • ✅ Telegram pranešimai iš web — notifyTelegram() po maišymo, staklių, pakavimo, išvežimo
  • ✅ GAS LOT/EXP importas — 8 DS žaliavų atnaujinta iš Excel
  • ✅ Playwright PDF fallback — lokali ms-playwright chromium
  • ✅ BF klientas — Back to Life receptas
  • ✅ Maišymo kortelė — B&W spausdinimui, orientacijos pasirinkimas, supaprastinta
  • ✅ Maišymo kortelė — supaprastinta juodai-balta (spausdinimui), orientacijos pasirinkimas (landscape/portrait), pašalinta maišymų istorija ir progresas, žaliavų lentelė tik „1 maišymui" stulpelis su dot-leader
  • ✅ Gamybos kortelė iš istorijos — _printGamybosKorteleFromIstorija() leidžia spausdinti archyvuotų kortelių maišymo korteles
  • ✅ Maišymo modalas → „Maišymo kortelė" (peržiūra vietoj registravimo, pašalintas greitas registravimas)
  • ✅ Dosje archyvavimas — žaliavų grupavimas pagal pavadinimą, išvežimų papildymas iš gamybos_zurnalas kai PocketBase neturi senų
  • ✅ /api/vaztarastis-duomenys — perrašytas iš PocketBase į tiesioginį SQLite (greitesnis)
  • ✅ Naujas klientas BF — Back to Life receptas
  • ✅ fmtMg pataisymas — rodo g/mg teisingai, gr/pktl headeris kortelėje
  • ✅ Sufasuota rodiklis — gamybos kortelės spausdinime rodo faktinį pagaminta_kiekis
  • 2026-06-22 — sesija (pilna diena)

  • ✅ Naujas klientas UAB SOULEL (SL) — 5 stick receptai, 10 žaliavų (SL), 5 gamybos kortelės
  • ✅ Etikečių spausdinimas — GET /api/gamybos-korteles/:id/etiketes-html, mobile ekranas, skirtingi šablonai paketeliai/pouch, EXP apačioje
  • ✅ Bendras maišymas — paskirstymas kelioms kortelėms vienu metu (desktop modal)
  • ✅ node-cron — DB backup kas 6h, temp failų valymas 3:00, health log kas 1h
  • ✅ Gamybos langas — "Registruoti" mygtukai plėvelei/dėžutėms (quick modal)
  • ✅ Mobile pouch registravimas — dėžių + nepilnos dėžės įvedimas
  • ✅ Važtaraštis — nepilna dėžė +1 dėžių sumoje, LOT/EXP atskirose eilutėse, PAK./DĖŽ., dez_dezeje fix
  • ✅ PDF auto-save — C:\VM\DRIVE\ po nurašymo, Google Drive katalogas paruoštas
  • ✅ AGENTS.md — kokybės kontrolės skilai, Agy checklist, security hook
  • ✅ Custom commands — /commit, /update-wolf, /check-server, /interview, /spec, /doubt
  • ✅ jq 1.7.1 — portable CLI JSON parser tools/jq.exe
  • ✅ Claude HUD plugin — context/rate limit statusline
  • ✅ Olvel Magnesium — svoris 6.5g, planas ×2 (dvigubas formatas), mišinys užregistruotas
  • 2026-06-17 — sesija 1 (rytas)

  • ✅ pakuociu_sandelis lentelė sukurta
  • ✅ /api/pakuociu-sandelis GET/POST/DELETE
  • ✅ Pauchai tab → sandėlio vaizdas
  • ✅ Maisomi tab — naujas DEFAULT tab Gamybos lange
  • ✅ Pagrindinis langas — ⚗ badge clickable pouchams
  • ✅ DN92197 gavimas užregistruotas (5 produktai, Alpi Eesti)
  • 2026-06-17 — sesija 2 (vakaras)

  • ✅ OpenWolf sistema sukurta — .wolf/ direktorija su 8 failais
  • ✅ /wolf route — projekto žemėlapis naršyklėje (tekstas su tabs)
  • ✅ /wolf/graph route — interaktyvus D3.js tinklo grafas (8 mazgai, 22 ryšiai)
  • ✅ Viršvalandžių ekrane → 🕸 Grafas + 🐺 Tekstas mygtukai
  • ✅ self-improving-agent hook aktyvuotas (.claude/settings.json)
  • ✅ Obsidian instaliuotas (C:\Users\justa\AppData\Local\Programs\obsidian\)
  • ✅ Desktop shortcut sukurtas (VM Wolf.lnk) — atidaroma su vault'u
  • ✅ readdirSync pridėtas prie server.js importų
  • ✅ CLAUDE.md atnaujintas — sesijos pabaigos rutina + teisingas DB pavadinimas
  • ✅ agy-uzduotis.md atnaujintas — sesijos pradžios rutina Agy agentui
  • ✅ Obsidian vault failai: HOME, db-schema, workflow, pakuotes, klaidos
  • 2026-06-17 — sesija 3 (vėlyvas vakaras)

  • ✅ Antigravity Awesome Skills įdiegti ir aktyvuoti: nodejs-backend-patterns, nodejs-best-practices, sql-optimization-patterns.
  • ✅ POST /api/gavimai/bulk endpoint'as sukurtas plėvelių rulonų priėmimui su auto-generuojamu LOT kodu [Raidė][YYMMDD].
  • ✅ Desktop UI pajamavimo modalo išplėtimas — sukurtas „Multi-plėvelės” tab'as su dinamišku eilučių pridėjimu/pašalinimu bei LOT peržiūra.
  • ✅ Mobile UI pajamavimo modalo išplėtimas — sukurtas „Bulk Plėv.” tipas su supaprastinta multi-entry forma rulonų registravimui.
  • ✅ Dokumentacija — atnaujinta API schema [cerebrum.md](file:///C:/VM/.wolf/cerebrum.md) ir [agy-uzduotis.md](file:///C:/VM/agy-uzduotis.md) užduočių registras.
  • 2026-06-18 — sesija 7 (Agy)

  • ✅ Gamybos Dosjė patobulinimai (server.js): atnaujintas dosje_tekstas generavimas archyvavimo metu, pridedant išsamų žaliavų LOT/EXP atsekamumą su nurašymų ir gavimų lentelių palyginimu, maišymų suvestinę iš gamybos žurnalo, kliento informaciją su kliento serija etiketėms ir bendro sumaišyto kiekio rodymą.
  • ✅ A4 portrait spausdinimo endpoint'as (GET /api/gamybos-korteles/:id/dosje-html): sukurtas naujas endpoint'as, kuris grąžina profesionalų, A4 portrait formatui ir spausdinimui pritaikytą HTML su Daily Spoon logotipu, suvestinėmis ir parašo laukais.
  • ✅ UI patobulinimai (public/index.html): pridėti „🖨 Dosje“ mygtukai istorijos kortelės valdyme bei modaliniame lange, atidarantys naująjį spausdinimo puslapį naujame lange.
  • 2026-06-18 — sesija 6 (Agy)

  • ✅ Portuotas pilnas Telegram botas (telegram-bot.js) – 100% atstatytas visų funkcijų veikimas (monitorius, maišymai, trūkstamų žaliavų planavimas, UUID-saugus žurnalo ir HR įrašų redagavimas/trynimas, priėmimas, naujų narių admin patvirtinimai).
  • ✅ Sintaksės klaidų ištaisymas – pašalinta dubliuota userStates deklaracija ir suderinta SQLite su Express /api/priimti-medziagas API.
  • ✅ Dokumentacijos atnaujinimas – Wolf vault schema, workflow ir pakuotės pritaikytos naujiems laukams bei maršrutams.
  • 2026-06-18 — sesija 5

  • ✅ Naujas klientas AC (UAB Aconitum) — receptas, žaliavos, LOT/EXP, gamybos kortelės
  • ✅ Pouch kortelės UI — SUPAKUOTA → DĖŽĖS blokas (auto-skaičiuojamas)
  • ✅ Maišymo progresas — mini violetinis baras su % po pavadinimo
  • ✅ Kortelių stilius — mėlynas fonas, izoliuoti info barai, paryškintos spalvos
  • ✅ kliento_serija — naujas laukas, etiketėse gamintojo serija, važtaraščiuose mūsų LOT
  • ✅ IŠSIŲSTA baras — rodo sandėlio likutį (supakuota - išsiųsta)
  • ✅ Gamybos langas — užsakovo filtras, Maisomi rodo pradėtas korteles
  • ✅ Maišymo kortelė — landscape spausdinimas, pataisyta 1 maišymui formulė
  • ✅ OpenWolf — Agy atliko pilną projekto analizę, atnaujino visus .wolf/ failus
  • ✅ Auto-maišymo logika — receptas su ≤1 ingredientu automatiškai praleidžia maišymo etapą
  • ✅ kliento_serija kolona gamybos_korteles — etiketėse gamintojo serija, važtaraščiuose mūsų LOT
  • 2026-06-17 — sesija 4 (naktis)

  • ✅ Recepto tabs — 3 tab'ai recepto detalių panelėje: 📋 Sudėtis | ⚙️ Staklinė | 📝 Pastabos
  • ✅ _saveReceptasExtra(id) — saugo stakliu_rekomendacija + gamybos_pastabos per PUT
  • ✅ Gamybos kortelių pertvarka — gamyba-row iš grid → viena flex eilutė su:
  • - gr-name-stack (180px): pavadinimas / LOT / EXP stacked vertikaliai

    - gr-mix-mini (88px): mini maišymo progress baras su ⚗ etikete ir procentu

    - 3× progress-block (flex:1 kiekvienas): PAGAMINTA / SUPAKUOTA / IŠSIŲSTA — originalaus dydžio

    - 🗑 mygtukas dešinėje + žalias „Arch.” kai allDone

  • ✅ Pašalinti ! statusas ir 🔍 atsekamumas mygtukai iš kortelės (per daug triukšmo)
  • ✅ Modal toggles — „⚙ Gamyba baigta” checkbox gamybos registracijos modale; „▣ Pakavimas baigtas” supakavimo modale
  • ✅ Baigtos būsenos — PAGAMINTA blokas tampa žalias + „BAIGTA ✓” kai stakles_baigtos; SUPAKUOTA lygiai taip pat kai pakavimas_baigtas
  • ✅ Multi-region kortele — gauna display:grid per inline style (nesulaužyta)
  • ✅ Agy kintamųjų pavadinimų klaidos prevencija — taisyklės instructions.md, agy-uzduotis.md, klaidos.md
  • #### ⚠️ Rytojui: Pouch kortelės tobulinimas

  • Pouch lange nereikalingas pakavimo baras (staklinė tiesiogiai pila į pakelius → dėžės)
  • Rodyti: pagamintas kiekis dėžėmis + likusių paketų skaičius
  • Išsiuntimas: tik dėžėmis
  • 2026-06-18 — sesija 1 (rytas - Agy)

  • ✅ Cerebrum.md atnaujinimas — pilnai dokumentuotos visos 15+ SQLite lentelių schemos ir visi 114 API endpoint'ų sugrupuoti pagal sritis.
  • ✅ Mobile UI plėvelių pajamavimas („Bulk Plėv.”) — atlikti patobulinimai:
  • - Receptų dropdown'e filtruojami tik plėvelės/stick tipai (paslėpti pouch receptai).

    - Pridėtas sėkmingo pajamavimo suvestinės konteineris (mBulkResultNotice), rodantis sugeneruotus LOT ir papildomus duomenis.

    - Perkelta inicializavimo logika į renderGavimas pabaigą, išsprendžiant tuščio vaizdo bug'ą perpiešiant (renderView()).

    - Sutvarkyta, kad formos laukai išsivalytų po sėkmingo išsaugojimo.

  • ✅ Dokumentacija — atnaujintas bendras agentų užduočių sąrašas [agent-tasks.md](file:///C:/VM/agent-tasks.md) ir užduočių žurnalas [agy-uzduotis.md](file:///C:/VM/agy-uzduotis.md).
  • 2026-06-19 — sesija 3 (Claude, pagrindinis darbas)

  • ✅ Naujas klientas SANTAMED — UAB "SANTAMED LT" (kodas SM), žaliava "Magnesium 375mg+B6 1.4mg powder", receptas "Olvel Magnesium 375mg+B6 1.4mg N30" (plevele, 11.16g, 30/dėž., 28 dėž./dėžėje), gamybos kortelė LOT 2026001, EXP 2028-05
  • ✅ GET /api/mobile/dashboard — naujas optimizuotas endpoint mobiliajai app. Vienas API call vietoj 7, ~10KB vietoj 1.5-2MB. Grąžina aktyvias korteles su server-side isvezta skaičiavimu, mėnesio KPI stats, counts, klientus, darbuotojus
  • ✅ Mobile v2 pilnas perrašymas (public/mobile.html) — premium dark glassmorphism dizainas (Revolut/N26 stilius):
  • - Quick Actions home screen (5 action kortelės: Staklės, Pakuoti, Maišyti, Priimti, Išsiųsti)

    - Swipe gestai (dešinėn=staklės, kairėn=pakavimas) su vizualiniu feedback

    - Card Detail bottom sheet su statistika ir quick register

    - 3 tab navigacija (Pultas, Kortelės, Daugiau) vietoj 7

    - Offline Queue infrastruktūra (localStorage, auto-sync, badge)

    - KPI chipai paspaudžiami — rodo produktų breakdown su medaliais

    - HR ekranas (viršvalandžiai, atostogos nuo-iki, tėvadienis)

    - Sandėlio likučių ekranas

  • ✅ KPI stats fix — STAKLĖS ✓ ir PAKAVIMAS ✓ baigimo žymos nebedubliuoja kumuliacinio kiekio KPI skaičiuose
  • ✅ KPI spausdinimo mygtukas — desktop index.html KPI panelėje pridėtas "Spausdinti" mygtukas su A4 landscape ataskaita
  • ✅ Telegram Mini App — tailscale funnel aktyvuotas (https://justas.tailf67d20.ts.net/), Telegram WebApp SDK integruotas, Mini App meniu mygtukas užregistruotas per BotFather API
  • ✅ Silent print per telefoną — POST /api/mobile/print endpoint: telefonas siunčia HTML → Playwright generuoja PDF → SumatraPDF (portable) tyliai spausdina ant HP LaserJet be jokio dialogo kompe
  • ✅ Važtaraščio spausdinimas — desktop stiliaus A4 portrait šablonas su paletėmis, suvestine, parašų vieta. Datos pasirinkimas, juoda/balta be fono, LOT+EXP serijos stulpelyje, pouch eilučių formatavimas, nepilnos dėžės PKTL./DĖŽ. stulpelyje, siuntėjas = "Justas Žukauskas"
  • ✅ Desktop UI — pašalinti gam/pak/sand pills iš kortelių pavadinimo zonos, "liko" info integruota į progress blokus; Santamed produktų filtras važtaraščio picker'yje pagal pasirinktą klientą
  • 2026-06-19 — sesija 2 (Agy)

  • ✅ Globalus grįžimo mygtukas (#headerBackBtn) — įdiegtas viršutiniame headeri, dešinėje pusėje prie ⏱ laiktoduko ikonos, kuris dinamiškai rodomas sub-ekranuose (receiving, shipping, hr, sandelys) ir paslepiamas pagrindiniuose dashboard tabuose.
  • ✅ Navigacijos istorijos palaikymas — sukurtas _screenHistory stekas navigate(screen, params) funkcijoje ir globalus goBack() iškvietimas, leidžiantis sklandžiai grįžti į praėjusį langą (vietoj visada navigavimo į 'more').
  • ✅ Inline back mygtukų šalinimas — pašalinti visi dubliuojantys vidiniai grįžimo mygtukai (← Atgal) iš Priėmimo (renderReceiving), Važtaraščių (renderShipping), Darbo laiko (renderHR) bei Sandėlio likučių (renderSandelys) ekranų.
  • ✅ Priėmimo tipo pasirinkimo barai — pajamavimo tipų selektorius (renderReceiving) pakeistas iš atskirų žetonų (chips) į tab-bar stiliaus horizontalius barus (.tab-bar ir .tab-btn), sutapdinant jo dizainą su visa sistemos stilistika.
  • ✅ Išmanus maišymo registravimas — įdiegtas bazinės žaliavos pasirinkimas ir automatinis vienetų (vnt) kalkuliavimas pagal recepto sudėtį, siunčiant korektiškus { zaliava_id, svoris } parametrus į serverį.
  • ✅ Dokumentacijos atnaujinimas (db-schema.md) — prie klientai lentelės schemos aprašyti žinomi sistemos klientai ir papildyta naujo kliento SM (UAB "SANTAMED LT") rekvizitais.
  • 2026-06-19 — sesija 1 (Agy)

  • ✅ Telegram bot isvezta_kiekis pataisyma (telegram-bot.js) — išspręsta klaida, kai botas naudojo neegzistuojančią c.isvezta_kiekis koloną iš gamybos_korteles. Sukurtas getIsvezta(lot, recPav) helperis dinamiškai sumuoti išsiuntimus iš gamybos_zurnalas.
  • ✅ Viršvalandžių modulio (HR) patobulinimai (public/mobile.html, server.js) — perkeltas tipų pasirinkimas į tab-bar stiliaus kontrolę, viršvalandžių balansas apribotas einamuoju mėnesiu, pridėtas istorijos išskleidimas paspaudus ant balanso kortelės, įdiegtas konkretaus mėnesio pasirinkimas su atitinkamu istorijos ir balanso filtravimu, bei pataisyti backend maršrutai, kad SQLite duomenų bazėje būtų išsaugotas tipas (Atostogos/Tėvadienis/Darbas).
  • ✅ Mobiliosios aplikacijos UI supaprastinimas (public/mobile.html) — pultas dabar rodo tik KPI suvestinę ir aktyvias gamybos korteles, pašalinti sub-tabai iš „Kortelės“ rodinio, o gamybos kortelių detalių modaliniame lange pridėtas „🧪 Registruoti maišymą“ veiksmas. Visos specifinės valdymo funkcijos ir filtrai perkelti po „Daugiau“ meniu ekranu.
  • 2026-06-22 — sesija 1 (Agy)

  • ✅ Užduotis #10 — Naujų projekto protokolų patvirtinimas:
  • - Perskaitytas ir patvirtintas [AGENTS.md](file:///C:/VM/AGENTS.md) su nustatytomis agentų atsakomybėmis, apribojimais ir saugumo hook'o taisyklėmis.

    - Atnaujinta sesijos pradžios rutina, įtraukiant naująjį rolių dokumentą (dabar skaitomi 5 failai prieš pradedant darbą).

    - Įrašytas patvirtinimas į [agy-uzduotis.md](file:///C:/VM/agy-uzduotis.md).

  • ✅ Sisteminių nurodymų (system prompts) nutekėjimo analizė:
  • - Išanalizuota „GitHub“ repozitorija system_prompts_leaks bei atskirai peržiūrėti nutekinti Google Antigravity CLI nurodymai, patvirtinantys esamą agento elgseną.

    > ⚠️ Žurnalo spraga 2026-06-22 → 2026-09-14: tarp šių datų buvo daug sesijų (žr. atmintį project_baigti_darbai_log.md pilnai istorijai), bet jos čia nebuvo sistemingai užfiksuotos. Naktinė automatika „VM Wolf dokumentacijos sinchronizacija" (22:00 kasdien, /update-wolf skill'as, nuo 2026-09-14 dirba workspaceMode: existing — nebekuria naujo worktree kiekvieną kartą) turėtų palaipsniui šią spragą užpildyti.

    2026-10-16 — sesija (Claude + Codex + Agy) — LOT atsekamumas, Ambio, HL maltodekstrinas, Fabrikas

  • ✅ Plėvelės savas LOT ≠ konfliktas (1256e5e, gamybos_ciklas.js plevelesGauta): kortelėje lieka kliento LOT (lipdukai), plėvelei skiriamas savas A atsekamumui → saugomas zaliavu_gavimai.serijos_nr; įspėjimas tik pouch.
  • ✅ Maišymo kortelės LOT/EXP (3130e09, 073151a, /api/gamybos-korteles/:id/kortele-html): tušti (nulinimo) gavimai nebeuždengia partijos; rodoma FEFO pirma nurašoma partija (kaip fifoConsume).
  • ✅ nurasymai.partijos (e3db87b, Codex #186): nauja kolona (JSON [{gavimo_id,serijos_nr,galiojimas,kiekis}]), pildo fifoConsume(meta.partijosOut) maišyme ir pouch pildyme; kortele-html ir archyvo faktiniai_duomenys rodo FAKTIŠKAI panaudotus LOT su kg. Senų nurašymų partijos nežinomos (NULL).
  • ✅ Mobile Diena: pašalinti KPI „i“ mygtukai (eb7d1d9).
  • ✅ DB (su kopijomis runtime/db-backup/): aktyvi SM kortelė 2607120 perkelta į receptą „Ambio Magnio citratas“ (xd50e3fznn7z77u) + 12 žurnalo ir 3 gavimų įrašų pervadinta, LOT įspėjimas ištrintas; HL Maltodekstrinas Interstarch 200→100 kg, likutis −20,95 kg = skola BF (BF dar NEnurašyta – vartotojas: „kol kas neminusuojam“).
  • 🟡 Neįkelta (laukia vartotojo peržiūros): Viršvalandžių langas (#183) ir Maišymų langas (#184, EXP dublio fix, filtrų grupės) index.html; Fabrikas #187 – public/fabrikas.html + public/fabrikas-planas.svg (Agy planas iš viršaus, viewBox 2560×950) + GET /api/fabrikas (tik SELECT, zonos: receiving/raw/packstock/ready/mixing/machines/pouch/packing/finished/shipping). Planas runtime/fabrikas-planas-187.md. Kitas etapas (kitą savaitę): sunkvežimiai, „+N vnt“, žmogeliai, replay.
  • 🪤 Spąstai: Argon 4 per opencode – Google API kvota 0 („exceeded your current quota“), opencode tyliai kartoja be galo; git apply --cached su hunk'ų filtru – filtruoti tik +/- eilutes, ne kontekstą (kitaip praleidžiamas svetimas hunk'as).
  • 2026-10-15 — sesija (Claude + Agy + Codex) — UI perjungimas beta → stabili (desktop + mobile), duomenų pataisos

  • ✅ Naujas desktop ir mobile UI įjungtas kaip STABILUS (8d754d9): index-beta.html → index.html, mobile-beta.html → mobile.html, Agy CSS įterptas į index.html