> [!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
index.html Gamybos ekranePrieš liečiant „Gamyba“/„Gavimai“ ekranus, PATIKRINK switchTab(tabName) (~3191 eil.) dispatch'erį, kad žinotum, kuris variantas TIKRAI pasiekiamas:
switchTab('gaminama') → fetchProductionData() → filterByTipas(tipas) (~2448 eil.: visi/paketeliai/pauchai/stickai/gavimai/rezervacija/maisomi) → renderProductionRows() / renderGaminamaGavimaiLentele() / renderRezervacijaWidescreen() / renderMaisomiGaminamoje().switchTab('gamyba') → renderGamybaTab() → _renderGamybaLangas() (~4050 eil.) — joks šoninio meniu mygtukas nesiunčia tabName='gamyba' (tikrasis naudoja 'gaminama')._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.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:
if (activeSidebarTab === 'gamyba'), kuri REALYBĖJE niekada netampa true, nes joks mygtukas nesiunčia 'gamyba'): pvz. ~5041-5042 eil.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).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ą).grep -c VISŲ iškvietimų PRIEŠ sprendžiant, ar saugu trinti, ne tik pagrindinio navigacijos kelio._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.„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 — Važtaraščio spausdinimas „susigrūdęs mažame plote" — patikrinta: pats HTML/CSS generavimas ( „Greitas išsiuntimas" (▸ Klientas pasiėmė pats) niekada nepasirodydavo IŠSIŲSTA juostoje — 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 ( „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 PLĖVELĖ/DĖŽUTĖS kiekis — substring atitikimas rodydavo padvigubintus/patrigubintus gavimo įrašus (naujas [[feedback_veiksmas_string_matching_drift]] pavyzdys) — Mobili „Visos partijos" (nauja Claude Code plugin'ai — patikrinta: realiai įjungti (globaliai) tik 3 ( Etikečių spausdinimo tušti puslapiai (fix) — Mobiliai pridėti gamybos užbaigimo mygtukai — anksčiau Mobiliai pridėtas PILNAS recepto redagavimas — naujas ekranas ( Telegram pranešimai apie gavimų registravimą — anksčiau 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 Instaliatoriaus perkompiliavimas — Google Drive automatinis backup — rclone ( Pridėtas 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. Serverio prastovos šaltinis (2026-08-20→24, ~3,75 paros) — Windows event log ( Nuo paskutinio faktinio doc-sync ( Rastas dokumentacijos driftas, kurio ANKSTESNĖ sesija JAU BUVO ištaisiusi, bet niekada nesusiliejo į Pamoka ateičiai: kai Nauja 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, Bug #1 — Bug #2 — mobili dėžučių registracija VISADA klaidos „Nurodykite gamybos kortelę" ( Nauja funkcija — Sąskaitos numeris važtaraščio Istorijoje: kiekvienoje eilutėje laukelis (auto-save onblur), užpildytas → žalias rėmelis + ✅. Nauja 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 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Ę ( OmniRoute MCP serveris pašalintas ( Atostogų (2 sav.) paruošimas — kritinė spraga rasta: anksčiau sukurtas SYSTEM-lygio 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: Naujas endpoint Ryšys: UI (desktop 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 — Trys atskiri „veiksmas string atitikimo" bug'ai, visi ta pati bendra klasė (kai kodas skirtingose vietose skirtingai tikrina 1. 2. POUCH veiksmas praleistas kortelės perskaičiavime ( 3. Viršutinis „Sudėta į dėžutes" KPI ignoravo multi-regionų žymas ( Žr. naują atminties įrašą Duomenų atsekamumo pataisymai per vartotojo nuotraukas (DS klientas): Mobile UI: prod-kortelės (renderProdCard) gavo naują plonos progreso juostelės elementą, rodantį Atostogų registravimas — UI grupavimas + reali duomenų klaida. 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 BIOCINKAS klaidingas „Trūksta žaliavų" trūkumas ( „Ferrum" naujo produkto registravimas per mobile.html Gavimai formą kūrė „pakabintą" žaliavos įrašą, ne receptą/kortelę — root cause: Paketėlių skaičiaus rodymas paspaudus priėmimo įrašą ( 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 ( Commit'ai: FIFO → FEFO nurašymas ( „+1 vnt." šiukšlių įrašai gavimuose — „LOT: —" mobile Paskutiniuose pajamavimuose — Nauji endpoint'ai Mobile „Registruoti gautą plėvelę" pilna pertvarka ( Swipe-to-edit/delete ant „Paskutiniai pajamavimai" eilučių — Kortelės info istorija — „Sandėlio likučiai" rodė tik BACK TO LIFE, ne Titan/Olvel ( Mygtukų etikečių standartizacija: „Registruoti maišymą" / „Registruoti staklių pagamintą kiekį" / „Registruoti pakavimą" (buvo nevienodi/klaidinantys „Registruoti pildymą" ir pan.). Quick-register „Registruoti" mygtukas atrodė kaip mažas tekstas — trūko bazinės Maišymo registravimo dalinis nesėkmės tylėjimas — registruojant 9 maišymų seriją, 1 tyliai nepavyko be aiškaus pranešimo (JSON klaida). Rankiniu būdu užregistruotas trūkstamas maišymas (suderinta su faktiniu 11-maišų likučiu). Užduotis #67 (negyvo kodo švarinimas) — dalinai atlikta, likusi dalis ATIDĖTA: Agy Task #68 (šviesios temos kontrastas + Haptic Feedback) — vartotojo eksplicitiškai patvirtinta, griežtai TIK papildymai (jokio trynimo/pervadinimo). Vartotojas paliko kompiuterį šiam darbui, autorizavo Claude duoti VISUS Agy patvirtinimus vieną, su Telegram escalation kanalu jei prireiktų. Užduotys #67 (likę 19 iškvietimų) ir #69 (CSS modulinimas) — sąmoningai NEPERDUOTOS Agy, liko Claude/būsimai sesijai. TITAN važtaraščio (VM-20260730) paletės perkėlimas — vartotojo prašymu perkelta 2 pilnos dėžės (600 vnt./dėž.) + 1 nepilna (12 dėžučių/360vnt) iš 8-tos paletės į 7-tą, tiesiogiai redaguojant Važtaraščio PDF peržiūros ("Peržiūra" mygtukas) NESUPRATO naujos paletės-builder schemos — OF klientas — Medigate/Optifarma sumaišyti — Gamybos dosjė VISADA rodo Optifarma, ne pasirinktą važtaraščio adresą — dosjė yra kokybės/atsekamumo dokumentas, teikiamas TIESIOGIAI užsakovui Optifarma, nepriklausomai nuo to, kad fizinis krovinys kartais keliauja į Medigate adresą. „Paskutinė veikla" panelė rodė laiką be UTC→vietinės konversijos ( Mobilus Pultas ( KPI kortelių ir ekrano fono perdizainas (abi platformos) — vartotojas paprašė modernesnio, nestandartinio KPI dizaino ir aiškesnio fono (senas Visos popietės Claude nuolat stebėjo Agy terminalą ( 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 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ė: Kitos pastabos: Gavimai lango kortelės peržiūros modernizavimas (planas: 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 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"): 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): Žaliavos pakaitalas maišymo kortelėje (kito tiekėjo atveju) — planas: „Visos partijos" ↔ „Rezervacijos & MRP" pirmas sujungimo žingsnis ( „📋 Inventorizacijos paletė" — išplėsta mišri/nemišri + patvarus žurnalas ( KRITINIS INFRASTRUKTŪROS RADINYS — spausdinimas/PDF sulūžęs dėl SYSTEM vs justa profilio skirtumo: veikiantis serverio procesas (PID pagal Sprendimas: abu Chromium variantai ( TG foto kiekio prompt — force_reply ( Nauja TG boto funkcija — „🧺 Mišri paletė" ( Rezervacijos & MRP sujungimas su Gaminama → Rezervacija (vartotojo prašymas, 2026-07-16): pastebėjo, kad Gaminama→Rezervacija (rankinis planavimo krepšelis) ir Žaliavos→„Rezervacijos & MRP" (automatinis MRP iš VISŲ aktyvių kortelių) buvo du lygiagretūs, nesusiję skaičiavimai skirtinguose languose — jau anksčiau pažymėta kaip žinoma problema, dabar išspręsta. Vartotojo pasiūlytas sprendimas: NE vienas algoritmas, o du sub-tabai TAME PAČIAME lange: Nauja maža modalė pakavimo skaičiams ( Dėžučių auto-kortelės spraga ištaisyta ( DN/TITAN KPI bug'ai + DB tvarkymas (ryto dalis): Žaliavų FIFO partijų žurnalas (didelė pertvarka, planas: Fazė 2 — vienas langas „Visos partijos" ( Pouch pakuočių inventorizacija ( Klientai/Portfeliai sujungimas ( wmux pane targeting — tylus klaidingas nukreipimas (žr. atmintį 1. Maišomi tab → Gaminama ( 2. Pouch sandėlis → naujas mygtukas Gaminama „Pauchai" tabe ( 3. PALAIDI žyma pridėta į Gaminama quick-menu ( Senos render funkcijos ( --- VM (buvęs TMA MES) — gamybos valdymo sistema Daily Spoon (DS) maisto gamybai. |-------|---------------|---------------|---------------| > Esminis skirtumas: > - > - --- Mašinos: LOT sistema: 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.) --- Mašinos: Kinų gamybos staklinės (ne Turpack) LOT sistema: Tokia pati kaip paketelių ( Gamybos eiga: Analogiška paketelių — gali eiti į retail dėžutes arba palaidi transportinėse Šiuo metu: nėra specifinių gamybos sunkumų --- Pildymas: 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): Kortelių vizualinis stilius UI: --- `` 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 > --- 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 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! 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 id TEXT PRIMARY KEY data TEXT NOT NULL pavadinimas TEXT veiksmas TEXT kiekis REAL batch TEXT created TEXT, updated TEXT 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 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 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 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 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 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 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 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] > 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 į > patikrinti ABI lenteles ( 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 > kiekį — archyvavus kortelę, jos pouch sunaudojimas "dingdavo" iš rezervacijos skaičiavimo. > Dabar > Įrašas kuriamas 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 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 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 --- 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 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 --- --- '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 > žr. Agy #28 sekciją žemiau) ir > NEBĖRA (patikrinta grep'u 2026-09-09); KPI dabar rodomas kaip kortelės header'yje, ne atskiras tabas. '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 > (gamybos būklės dashboard'as su virtualiomis eilutėmis, žr. 2026-07-07/08 sekciją viršuje). 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 --- > [!danger] Kritinės klaidos > - > - DB failas: > - Naudoti > - NIEKADA TailwindCSS — tik vanilla CSS |--------|-----------| --- - - - - 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.
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./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._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.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._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().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-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
/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.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).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.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ą./api/generuoti-pdf.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.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..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./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.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 šakojec504dc6, 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).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./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/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).zaliavos.likutis perskaičiuojamas kaip SUM). Realus atvejis: Lemon Juice powder 637/319-92 (FEFO nurašė) vs AN25604950 (realiai atidaryta) — 5,17kg perkelta.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).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).vaztarasciai.saskaitos_numeris kolona (tiesioginė SQLite migracija, ne per PocketBase schema — tas pats modelis kaip created/updated), PATCH /api/vaztarasciai/:id/saskaita./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 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).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]]).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.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
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.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)._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
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.gamybos_zurnalas.veiksmas reikšmę, ir pamiršta variantą):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.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'.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.)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.zaliavu_gavimai lentelėje — pridėti trūkstami įrašai (Nutrifoods/Vehgro tiekėjai) NEKEIČIANT likučio./api/registruoti-gavima.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.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
terminal_send.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]]).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.zaliavos įrašas (kaqq6xs1hr7xwig, likutis 3600) ištrintas iš DB (patikrinta prieš tai — nulinės nuorodos nurasymai/zaliavu_gavimai/ingredientai lentelėse).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./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.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
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ė.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.gamybos_ciklas.js plevelesGauta() rašė į zaliavu_gavimai.serijos_nr sąskaitos numerį (serija), ne tikrą LOT. Pataisyta: galutinisLot || serija || ''.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.public/mobile.html): pašalintas produkto → paieškos tekstinis laukas su autocomplete (mRowSearch/mRowPick, filtruoja state.recipesDetalus pagal pakuotes_tipas!=='pouch'); pašalintas vieneto pasirinkimas (visada vnt.); LOT/EXP dabar realūs įvedimo laukai (buvo auto-generuojamas read-only); pašalinti „Sąskaitos Nr./Tiekėjas/Gavimo data" laukai (data automatinė); „Paskutiniai pajamavimai" sąrašas dabar collapsible (state.showRecentGavimai, numatytas uždarytas).initSwipe() generalizuota veikti bet kuriam .swipe-wrap/.swipe-front elementui (anksčiau tik .prod-card), šaka pagal dataset.gavimasId (redaguoti/trinti, per naujus PUT/DELETE endpoint'us, routing pagal g.saltinis==='istorija' vs 'live') vs dataset.cardId (senas, nepaliestas kortelių swipe).openCardDetail gavo naujas sekcijas „Pagaminimo istorija (staklės)"/„Pakavimo istorija" (_mobStatusEntriesFor, filtruoja žurnalą pagal veiksmas/batch===card.lot).renderSandelys() mobile.html) — filtravo pagal statusas==='baigta', praleisdamas vykstančias korteles su realiu likučiu. Pataisyta: filtras dabar pagal sandelyje > 0 (pagaminta/supakuota minus išvežta), nepriklausomai nuo statuso..btn klasės (buvo tik .btn-primary), pataisyta btnClass konstrukcijoje._submitGamybaMaisymas() gavo automatinį 1x retry (800ms) tinklo klaidai + aiškų „įvyko X/N" pranešimą vietoj tylaus nutraukimo pirmos klaidos metu.renderGamybaTab()/_renderGamybaLangas() turi 21 iškvietimo vietą (ne 1, kaip manyta anksčiau) — žr. KRITINĖ PASTABA aukščiau ir atmintį feedback_dead_code_full_callsite_audit.md. Ištaisytas TIK vienas patvirtintas bug'as (kortelės ištrynimo handleris klaidingai tikrino 'gaminama' vietoj 'gamyba'). Likę ~19 iškvietimų palikti kitai sesijai su vartotoju prie kompiuterio.2026-07-30 sesija — vaztarascio PDF schema fix, OF/Medigate/Optifarma, isvezta bug'ai, KPI perdizainas
vaztarasciai.payload JSON. Kadangi stock nurašymas skaičiuojamas per kortelės bendrą kiekį (ne per paletės eilutę), perstumdymas grynai kosmetinis — patikrinta, kad viso_vnt/viso_deziu nepasikeitė (201960/249).GET /api/vaztarasciai/:id/html (server.js ~5472) yra ATSKIRA, senesnė implementacija nuo klientinės vzBuildVaztarastisHtml (index.html), kuri niekad nebuvo atnaujinta suprasti pilnos/nepilna/nepilnaDez/factor/dez_dezeje/pak_dezuteje laukus — vietoj to naudojo seną tipas/dezuciu_kiekis/pktl_dezeje/viso_vnt schemą. Pasekmė: PAK./DĖŽ. stulpelis visada tuščias (factor niekas neskaitydavo), o pilnos+nepilna dėžės susilieja į vieną bendrą skaičių (2 pilnos+1 nepilna rodė kaip „3 pilnos"). Pataisyta — prodRow() dabar tikrina it.type !== undefined ir šakoja į prodRowNew/prodRowOld; taip pat pataisyti sumMap/pallet-level palVnt/palDez skaičiavimai. Šis bug'as buvo sisteminis — paveikė VISUS važtaraščius nuo maždaug 2026-07 pradžios, kurie naudoja pilnos/nepilna skaidymą su custom factor arba region.klientai lentelėje kodas='OF' turėjo pavadinimas='UAB „Medigate' bet adresas buvo IŠ TIKRŲJŲ Optifarma adresas (Gedvydžių g. 24-2, LT-06308 Vilnius). Vartotojas patikslino: Medigate tikras adresas — 9-ojo Forto g. 70, Kaunas. Pataisyta: adresas → teisingas Medigate, Optifarma pridėta kaip alternatyvus gavėjas per papildomi JSON lauką (jau esanti, bet OF klientui tuščia funkcija — važtaraščio pallet-builder'yje jau seniai yra „Pristatymo adresas" dropdown, skaitantis papildomi, tiesiog niekad nebuvo užpildytas šiam klientui).GET /api/gamybos-korteles/:id/dosje-html — jei efektyvus klientas yra OF, ieškoma „Optifarma" įrašo kliento papildomi sąraše ir naudojamas JO pavadinimas antraštei, nepriklausomai nuo važtaraščio pasirinkimo.index.html openVeiklaPanel()) — veiklos_zurnalas.laikas saugomas UTC (dbNow(), be 'Z' galūnės), bet panelė tiesiog substring()'ino simbolius kaip jau vietinį laiką → visada -3h paklaida (Lietuvos vasaros laikas UTC+3). Pataisyta: new Date(laikas.replace(' ','T')+'Z') + naujas formatavimas iš naršyklės vietinės zonos; tas pats pritaikyta „Šiandien" dienos etiketės palyginimui.telegram-bot.js getIsvezta() — sisteminė batch-matching klaida: lygino LOWER(TRIM(batch))=? TIKSLIA lygybe su vien LOT, bet IŠVEŽTA įrašuose batch saugomas kaip "LOT | EXP:data" — lygybė NIEKAD nesutapdavo, isvezta visad grįždavo 0. Pasekmė: Telegram „Sandėlio likučiai" ataskaita rodė PILNĄ supakuotą kiekį kaip vis dar sandėlyje, net kai viskas (ir supakuota, ir palaidais) jau seniai išsiųsta (pvz. BACK TO LIFE — 21280 supakuota + 15400 palaidi, 100% išsiųsta, bet rodė 21280 likutį). Pataisyta į LOWER(batch) LIKE '%lot%' (kaip server.js visur jau darė — ten referencinis pavyzdys). Taip pat pataisyta sąrašo praleidimo sąlyga (buvo sandelyje<=0 && supak<=0, praktiškai niekad netiko — dabar tik sandelyje<=0).renderHome() mobile.html) rodė pilnai baigtas IR išsiųstas korteles — filtravo tik gamyba_pradeta===1, visiškai neatsižvelgdamas į statusą/išsiuntimą. Desktop computeGasStatus() jau seniai turi tikslią „ARCHYVAS" sąlygą (statusas==='baigta' && isvezta>=supakuota>0) tokiam atvejui, bet Pultas jos netaikė. Pritaikyta ta pati sąlyga — patikrinta naršyklėje (BACK TO LIFE dingo iš sąrašo, kitos aktyvios kortelės liko).#eef0fc/#eef0f8 per silpnai sodrus mėlynas, atrodė pilkas). Pasiūlyti 3 KPI variantai per Artifact vizualų palyginimą (statistikos juosta / dvitoniai plyteliai / kontūrinė su kampo žyma) + 4→3 fono variantai — vartotojas pasirinko B (dvitoniai plyteliai) + šiltas dramblio kaulas #f7f2e8. Įgyvendinta: .kpi-card/.kpi-chip (desktop+mobile) dabar pilnai nudažyti gradiento plyteliai su baltu tekstu ir dideliu pritildytu ikonos vandenženkliu vietoj balto fono su maža spalvota ikonos dėžute. --bg-primary (desktop šviesi tema) ir --bg/THEME_META.light (mobile šviesi tema) → #f7f2e8. Patikrinta abiejose temose, abiejose platformose, naršyklėje.2026-07-28 sesijos naujienos
registruoti-maisyma endpoint — SQLite busy_timeout + transakcija (server.js ~601, ~2013): DB rišta be busy_timeout, tad susidūrus rašymui su kitu procesu (telegram-bot, terminal-server, rankiniai skriptai) SQLite iškart mesdavo „database is locked", o pats maišymo registravimas nebuvo apvyniotas transakcija — dalis nurašymų likdavo įrašyti DB, nors klientas gaudavo klaidą (pusiau užregistruotas maišymas). Pridėta PRAGMA busy_timeout = 5000 + BEGIN/COMMIT/ROLLBACK visam rašymo blokui.public/mobile.html): renderZaliavuLikuciai() ir renderEtiketes() oninput/onfocus kviesdavo pilną render(), kuris perrašo #app.innerHTML ir sukuria naują 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).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. 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).
.sign-col{border-top} + nauja border-bottom po vardu), paliktas tik vienas švarus brūkšnys su vardu virš jo.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į).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.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
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ė).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ų.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)._tipGrupes sort tvarka: plevele→pouch→stick, groupHeader injekcija filtered.map() viduje pagal tipo pasikeitimą). filterByTipas('visi') naudoja esamą renderProductionRows() (jau apima per else šaką)._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-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./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.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).openwong2kim/wmux repo).2026-07-21 sesijos naujienos
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).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.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
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.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 ✅.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.2026-07-17 sesijos naujienos
2026-07-17 popietės/vakaro Agy priežiūros sesija (BF inventorizacijos tęsinys)
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").jauSunaudota formulės taikymu (PUT /api/gavimai/:id, kiekis_naujas = tikslinis_likutis + jauSunaudota).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).UPDATE kiekis/likutis_kg pirmajai partijai, antrosios (tuščio LOT) eilutės pašalinimu.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.CLAUDE.md kaip nuolatinė taisyklė visiems agentams — vartotojo tiesioginis prašymas Agy.2026-07-17 sesijos naujienos
C:\Users\justa\.claude\plans\kind-chasing-pinwheel.md, vartotojo patvirtintas srautas: eilutės paspaudimas iškart atidaro pilną langą, be tarpinio quick-menu):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.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).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.kind-chasing-pinwheel.md faile):_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ą._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.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ų.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.openKorteleModal (nepaliesta, patikrinta atskirai) — jokių konsolės klaidų.2026-07-16 sesijos naujienos
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.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).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.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.gamybos_korteles.maisymo_pakaitalai (JSON {originali_zaliava_id: pakaitalo_zaliava_id}), migracija idiomu kaip faktiniai_duomenys (server.js ~759, ~1414).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.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.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 ir gmCalcList preview rodo pakaitalo pavadinimą per bendrus helperius _pakaitalaiMapFromCard()/_pakZaliavaFromMap().renderAktyviuKorteliuMRP) NEŽINO apie kortelės pakaitalus — vis dar skaičiuoja pagal recepto numatytąją žaliavą. Jei sukels realios painiavos, reikės ten irgi skaityti maisymo_pakaitalai.node --check, endpoint curl testai (invalid id → 400, set → {}→{zal:pak}, clear → {}), naršyklėje realiu Olvel Magnesium kortelės testu (badge, select label, gmCalcList preview) — visi veikė teisingai po API mapping fix'o, testinis pakaitalas išvalytas po testavimo (kortelė grąžinta į tuščią {} būseną).public/index.html):_zpNeedsByZaliavaId(), _zpComputeReserved(), prieš _zpApplyFilters(), ~6117 eil.): paima bendrą kiekvienos žaliavos poreikį iš aktyvaus _rezervacijaItems sąrašo (ta pati logika kaip _rezervacijaComputeNeeds(), bet keyed pagal zaliava_id), tada paskirsto per tos žaliavos aktyvias partijas FIFO tvarka (data ASC, seniausia pirma) — identiškai kaip serverio fifoConsume(). Grynai front-end skaičiavimas, jokių DB/API pakeitimų._zpBuildRowsHtml() prideda Rezervuota/Laisva stulpelius (Sunaudota eilutėms — visada „—"). Perskaičiuojama kiekvieną kartą, kai lentelė perpiešiama (filtras/paieška) — pigu, nes partijų <300.browser_evaluate, ne tik node --check): vieno batch atvejis (likutis 22kg → rezervuota 11 → laisva 11, tiksliai norma×planas) IR daugiabatch FIFO atvejis (Braškių milteliai (DS): batch1 8.5kg pilnai išnaudotas PIRMAS nes data='' < '2026-07-15', batch2 75kg gauna likusį poreikį 37.5kg) — abu matematiškai tikslūs. Testavimo metu _rezervacijaItems/localStorage NEBUVO pakeisti (backup+restore kiekvieno testo gale, patikrinta localStorage.getItem() grąžina originalią "[]" reikšmę).zaliavu_gavimai eilutes su SKIRTINGU zaliava_pavadinimas_raw tekstu („Braškiu milteliai (DS)" vs „Braškiu milteliai") bet tuo pačiu zaliava_id — patvirtina, kodėl reikėjo grupuoti pagal zaliava_id, NE pagal pavadinimo tekstą (šis jau žinomas atviras klausimas — žr. MEMORY.md „LAUKIA" sekciją, ta pati žaliava be pilnų duomenų).zaliavu_gavimai eilutes su LOT/EXP/kiekiu, ne tik teisingą cache skaičių. Agy pane nebuvo atidaryta šioje wmux sesijoje — užduotis palikta faile, ne per gyvą kanalą.icudtl.dat) — perinstaliuota į v3.23.0 per GitHub release, dabar veikia (patvirtinta paties vartotojo).telegram-bot.js, vartotojo prašymas 2026-07-16 prieš BF inventorizaciją): buvęs „🧺 Mišri paletė" mygtukas pervadintas, dabar siūlo pasirinkimą pradedant:laukia_nemisri_pavadinimo state), toliau kiekvienai nuotraukai užtenka LOT+kiekio (sidecar gauna papildomą pavadinimas lauką automatiškai iš aktyvios paletės). PDF antraštėje pavadinimas rodomas kartą, stulpelis vadinasi „LOT / kiekis".DRIVE/telegram-foto/_paleciu_zurnalas.json) — KIEKVIENA uždaryta paletė (abi rūšys) prisegama su pilnu items turiniu PRIEŠ išvalant aktyvios paletės būseną — niekas nedingsta net per kelias atskiras sesijas per dieną. Naujas meniu punktas „📜 Visos praeitos paletės" (palete_istorija) rodo paskutines 15._printZaliavosKlientoPDF() (Žaliavos langas arba Klientai tabas, filtruotas pagal BF).netstat -ano | findstr :3000) yra paleistas per VM-AutoStart Scheduled Task (setup-autostart-task.ps1, principal SYSTEM, start-background.ps1 → node --watch server.js) — NE interaktyvi justa sesija. SYSTEM paskyra turi VISIŠKAI ATSKIRĄ profilį (C:\WINDOWS\system32\config\systemprofile), kuriame Playwright Chromium NIEKADA nebuvo įdiegtas (tik justa profilyje: C:\Users\justa\AppData\Local\ms-playwright\). Todėl VISOS kitos funkcijos veikė (nenaudoja Playwright), bet /api/mobile/print ir važtaraščio PDF endpoint'ai tyliai lūžo su „Failed to launch chromium" klaida — tai NEBUVO sąmoningas pakeitimas, o šalutinis nepastebėtas anksčiau padaryto autostart patobulinimo efektas.chromium_headless_shell-1223 ir chromium-1223) nukopijuoti į fiksuotą, nuo paskyros nepriklausomą vietą C:\SQL\pw-browsers\ (naudojant tą patį candidates.find(existsSync) fallback raštą, kuris JAU buvo važtaraščio endpoint'e, bet trūko /api/mobile/print ir naujoje TG paletės PDF funkcijoje — abi papildytos). Patikrinta realiu curl POST /api/mobile/print — sėkmė. Ateityje bet kokia NAUJA Playwright PDF funkcija (server.js AR telegram-bot.js) TURI naudoti šį C:\SQL\pw-browsers\... fiksuotą kelią PIRMU kandidatu, ne vien process.env.LOCALAPPDATA — kitaip vėl lūš, kai serveris veikia per SYSTEM autostart.telegram-bot.js ~1650): nusiuntus nuotrauką, žinutė dabar siunčiama su reply_markup: {force_reply:true, input_field_placeholder:'...'} — Telegram klientas automatiškai atidaro klaviatūrą su fokusu būtent šiam atsakymui (vartotojui nereikia patiems spausti į įvesties lauką). Taip pat prompt tekstas pakeistas į „Įrašyk pavadinimą ir kiekį" (vietoj vien „kiekį"), kad tas pats laukas veiktų ir su Mišrios paletės spausdinimo srautu. Paruošta vartotojo prašymu prieš didelę BF žaliavų faktinę inventorizaciją (2026-07-16 popietė).telegram-bot.js): leidžia sugrupuoti kelias iš eilės fotografuojamas žaliavas į vieną paletę ir gauti spausdinamą PDF sąrašą telefonu, kad prieš prieinant prie fizinės paletės žinotum, kas joje sudėta. Paprastesnė versija nei Agy pasiūlyta pilna DB schema (žr. agy-uzduotis.md #48) — vartotojo reali reikmė buvo tik identifikacinis lapas, ne visas TG NLP+DB projektas:📦 Mišri paletė meniu mygtukas → 🆕 Pradėti naują paletę sukuria paletesId (PAL-YYYYMMDD-HHmmss) ir įrašo į DRIVE/telegram-foto/_aktyvi_pale.json (paprastas failas, JOKIO DB rašymo)..json gauna papildomą paletesId lauką (esama gavimo/kiekio įvedimo logika NEPAKEISTA — vartotojas tiesiog raginamas rašyti pavadinimą+kiekį kartu vienu tekstu, nes botas neturi vaizdo atpažinimo).✅ Uždaryti ir gauti PDF — nuskaito visus sidecar failus su tuo paletesId, generuoja A4 PDF (Playwright, ta pati technika kaip server.js /api/mobile/print) ir siunčia kaip dokumentą tiesiai į Telegram pokalbį (bot.sendDocument).renderRezervacijaWidescreen() (public/index.html, ~15581 eil.) dabar turi sub-tab perjungiklį _switchRezSubTab(): „📋 Planavimas" (senas rankinis _rezervacijaItems krepšelis, nepakitęs) / „⚙️ Aktyvios kortelės" (naujas renderAktyviuKorteliuMRP(), ~15644 eil. — visas kodas 1:1 perkeltas iš buvusio Žaliavos lango „Rezervacijos & MRP" pod-tabo: trūkumų banner, kortelės grupuotos pagal klientą, expandinama MRP lentelė kiekvienai kortelei, PDF eksportas).renderZaliavosTab()) „Rezervacijos & MRP" mygtukas ir jo rendering šaka PAŠALINTI — liko tik Visos partijos / Sandėlio Likučiai. SVARBU: pati reservations/shortageList/activeCards DUOMENŲ skaičiavimo dalis renderZaliavosTab() VIDUJE PALIKTA nepaliesta (eil. ~6644-6726) — ją vis dar naudoja Sandėlio Likučiai pod-tabas (_showReservationDetails popup'ai) ir _printZaliavosReportPDF/window._zaliavosReportData. Pašalinta TIK dubliuota UI rendering šaka (klientų kortelių tinklelis), ne pati duomenų logika._toggleResFilter() (6152 eil.) perrašytas kviesti renderAktyviuKorteliuMRP() vietoj renderZaliavosTab()._zaliavosReportData teisingai užpildytas (22 trūkumai realiuose duomenyse).public/index.html, openPakavimoQuickModal()/_pqSave()/_pqUpdateChain(), ~4260 eil.): paspaudus produkto pavadinimą Gavimai lentelėje (bet kuriame lange, kur ji naudojama), atsidaro maža modalė Pak/dėžutė × Dėž/dėžė = Pak/dėžė redagavimui — NEBEREIKIA eiti į pilną Receptai langą vien šiam skaičiui pataisyti (vartotojo prašymas, kilo iš pak_dezuteje 20→30 klausimo bioMAGNEZ atveju). Naudoja tą patį PUT /api/receptai/:id endpoint'ą kaip pilnas Receptai redaktorius, bet siunčia TIK 3 pakavimo laukus (endpoint'as jau palaikė dalinį atnaujinimą per !== undefined tikrinimus — nieko serveryje keisti nereikėjo). Patikrinta naršyklėje realiu save-round-trip testu (MAGNESIUM CITRATE, 50×22=1100, reikšmės nepakitusios po išsaugojimo).gamybos_ciklas.js, registruotiGavima() ~eil. 505-568): anksčiau auto-kortelės kūrimas veikė TIK plėvelei/pouchui (yraPirminePak) — jei dėžutės atkeliaudavo PIRMOS (dar be jokios kortelės, receptas jau egzistuoja), registravimas žlugdavo su „Dėžutėms nerasta aktyvi kortelė". Realus atvejis: bioMAGNEZ 500mg, 2760 dėž. iš Santa Print, EXP 2029-10-30 — Agy rado šią spragą ir siūlė apeiti ją per rankinį Variantą A/B. Vartotojas paaiškino teisingą numatytą elgesį (dėžutės turi veikti identiškai plėvelei — sukurti „laukia" kortelę su dezuciu_statusas='Gauta'). Ištaisyta: else if (yraPirminePak) → else if (yraPirminePak || tipas === 'dezutes'); taip pat dezutes grąžos šaka (~eil. 594) papildyta autoSukurta/receptasId laukais (be jų naujai sukurta kortelė nebūtų sinchronizuota į PocketBase — server.js /api/registruoti-gavima PB-sync blokas tikrina būtent šiuos laukus). Recepto auto-kūrimas (kai VISAI nėra recepto) LIEKA tik plėvelei/pouchui — jei receptas neegzistuoja, dėžutės registravimas vis tiek grąžins „Receptas nerastas". Patikrinta realiu POST testu (sukurta/patikrinta/ištrinta scratch kortelė receptui DE-STRESS).2026-07-15 sesijos naujienos
uzsakovo_zaliavos laukas buvo 0 vietoj 1, nors klientas tiekia savo žaliavas be atsargos nuobiroms; standartinis 3% nuostolių priedas dirbtinai rodydavo trūkumą. Pataisyta (PUT /api/receptai/:id)._kpiPanelRenderTruksta) buvo antras bug'as — kai kortelė neturi LOT, senų žurnalo ĮSPĖJIMŲ paieška lygino tuščią batch su tuščiu card.lot ir klaidingai „prilipdavo" nesusijusius senus įspėjimus. Fix: ispejimai sąrašas dabar tuščias, jei card.lot tuščias. Du senus tuščio-batch ĮSPĖJIMO įrašus (dėl „Plant based protein Dark chocolate (mėginėlis)") ištryniau iš gamybos_zurnalas.recepto_sudetis tuščia) — 480 pagamintų pouch'ų (200g) niekada neatskaitė žaliavos. Susieta (0,2 kg/vnt.) + likutis nustatytas pagal faktinį pasvėrimą.icudtl.dat/app.asar) — perinstaliuota v3.23.0 per GitHub release, dabar veikia. Windows boot triktis tą pačią dieną (Startup Repair nepavyko, bet antras bandymas pavyko) — NTFS sveikas, nesusijusi su wmux.C:\Users\justa\.claude\plans\synthetic-percolating-pond.md):zaliavos.likutis tapo IŠVESTINIS dydis (= SUMA aktyvių zaliavu_gavimai partijų likutis_kg), ne nepriklausomai redaguojamas laukas. Nauja zaliavu_gavimai.likutis_kg kolona. Nauji fifoConsume/fifoReplenish helperiai server.js (~eilutė 3434) — VISI 9 senojo tiesioginio UPDATE zaliavos SET likutis write-site'ai perrašyti juos naudoti (mixing, baigti-gamyba, gavimai PUT/DELETE, papildyti-zaliava, priimti-medziagas, nurasyti-vaztarasti grąžinimai, mobilus/priimti; PUT /api/zaliavos/:id nebepriima likutis — naujas POST /api/zaliavos/:id/koreguoti tam skirtas).busena='Aktyvi' net su neigiamu likutis_kg — pažymėjus 'Sunaudota', fifoRecalc (SUM ... WHERE busena='Aktyvi') tą eilutę praleidžia ir neigiamas likutis dingsta. Pati ant to užkliuvau reconciliacijos metu (Creatine Monohydrate BF rodė 0 vietoj −89,875), atstačiau iš backup'o ir perleidau su fix'u._backup_auto/pre_fifo_reconcile_20260715_162357/); 19 papildomų (SL/BF, neturėjusių jokio žurnalo įrašo) backfill'inta (Agy, užduotis #41).zaliavos įrašai, kurių pavadinimai sutapo su PRODUKTŲ/RECEPTŲ pavadinimais (ne žaliavomis) ir niekur nebuvo naudojami kaip ingredientas: HYDRO FORTE 1 (2512 kg), Creatine MONO (9 kg), SPORT CREATINE (109 007 kg), VITAL TITAN COMPLEX (235 550 vnt.), MAGNESIUM CITRATE (1200 vnt.).agy-uzduotis.md #40 žurnalo įrašų (Cocoa padalinta į 2 tikras partijas: LOT 210828A1/94kg + LOT 220056A1/300kg). Pamoka ateičiai: bet kokia automatinė likučio korekcija/reconciliacija TURI PIRMA patikrinti, ar tai konkreti žaliava jau turi žinomą LOT/EXP iš tos pačios sesijos (pvz. agy-uzduotis.md TG žurnalo), o ne aklai kurti tuščią suderinimo eilutę.renderZaliavosTab, numatytasis pod-tabas, public/index.html):renderZaliavuPartijosTable() — viena paieškos/filtrų lentelė (Data/Siuntėjas/Pavadinimas/Užsakovas/LOT/Galiojimas/Kiekis/Likutis/Būsena/Veiksmai), duomenys iš naujo endpoint'o GET /api/zaliavu-partijos (tiesiai iš zaliavu_gavimai, be senojo /api/gavimai dvigubo šaltinio merge'o)._zpDeriveKlientas — pirmenybė klientas_id, kitaip „(XX)" sufiksas pavadinime, nes daug senų žaliavų klientą turi TIK pavadinime), filtras pagal būseną, „+ Naujas gavimas" (→ fifoReplenish), redagavimas/trynimas (_zpEditRow/_zpDeleteRow → PUT/DELETE /api/gavimai/:id).pakuociu_sandelis, susietas su receptu, ne su žaliava)._histEditRow/_histEditSave/_histDelete/_filterGavimaiHist + promptRefillZaliava pašalinti (Agy, užduotis #42) — „Visos partijos" juos pilnai pakeičia. renderSandelysTab PALIKTA — vis dar naudojama „Pakuotės" tabo (switchTab('sandelys')).pakuociu_sandelis, POST /api/pakuociu-sandelis): faktinio pasvėrimo/suskaičiavimo metu SENI įrašai (balandžio, konkretaus tiekėjo LOT) IŠTRINAMI ir pakeičiami VIENU nauju įrašu su faktiniu kiekiu — NE pridedami prie seno (ta pati "faktinis likutis = galutinis šaltinis" taisyklė kaip žaliavoms). Šiandien atnaujinta: Garden strawberry (7880 vnt.), Plant based protein Dark chocolate (6300 vnt.).renderKlientaiTab, public/index.html, ~13944):likuciai pod-tabas, filtruotas pagal tą klientą) ir „PDF" (_printZaliavosKlientoPDF()) mygtukais — duomenys iš /api/zaliavos + /api/receptai-detalus, klientas priskiriamas per klientas_id → (XX) pavadinimo sufiksą → single-recipe fallback.). _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ą.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/ (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)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.vzDownloadPDFFromHistory) — generuoja PDF iš jau išsaugoto payload, nereikia pirma atidaryti „Žiūrėti".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į._ 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]).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).openPouchSandelioModal()), unifikuotas _pouchSandelisRefreshed() atnaujina teisingą kontekstą (senas Gamyba langas ARBA naujas modalas).openKorteleQuickMenu) — anksčiau buvo tik senos Gamyba lango kortelėje._renderGamybaLangas, renderGamybaTab ir kt.) PALIKTOS kode, nebepasiekiamos per UI — pilnas išvalymas atskirai, kai patvirtinta, kad nieko netrūksta realiame naudojime.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".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)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ų._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"..lbl-top/.lbl-bot nebeturi #f2f2f2 fono (spausdintuve virsdavo pilkais taškeliais) — juodos skiriančios linijos vietoj pilkų./api/etiketes-laisvos + regioninis openEtiketesModal)./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).vzAddItemToPallet) IR abiejuose atvaizdavimo keliuose (klientinis vzBuildVaztarastisHtml + serverio prodRow istorijos/archyvo peržiūrai) — pasitaiso ir jau išsaugoti seni važtaraščiai.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.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).2026-07-10 sesijos naujienos (commit'ai
60d3969…e2d2f76)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ų./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).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./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.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).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./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.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-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).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/), žr. atmintį feedback_agy_confirmations.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.cardAC): receptai be kortelės ieškomi includes (ne startsWith), pradžios atitikmenys pirmi — „titan" randa „VITAL TITAN COMPLEX".2026-07-07/08 sesijų naujienos (dokumentuota 2026-07-08, commit'ai
0404cbe…f0c8a42)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.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.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).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.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).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-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.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()).--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.state.stats.menuo.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
C:\VM\DRIVE\telegram-foto\) — vartotojas siunčia botui nuotrauką (žaliavos etiketė) → botas parsisiunčia į šį aplanką kaip foto_, 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).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).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-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.pakuociu_sandelis įrašo).1. PROJEKTO ESMĖ
Pakuočių tipai (
pakuotes_tipas)Vertė UI pavadinimas Fizinis tipas Gamybos būdas | 'plevele'Paketeliai Sachet — plokščia maža pakuotė Plėvelė ritinyje → staklinė formuoja ir užpildo | 'pouch'Pauchai Pouch — didelė stovinčio maiši pakuotė Mišinys pilamas į jau pagamintą maišą iš tiekėjo | 'stick'Stickai Stick — pailga siaura pakuotė Plėvelė ritinyje → staklinė formuoja stick formą | 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'x2 = vieno kanalo (1 eilutė), x4 = dviejų kanalų (2 eilutės vienu metu)[Raidė][DDMMYY] → pvz. A260617, B260617🥢 Stickai (Stick) —
'stick'[Raidė][DDMMYY])🥤 Pouchai (Pouch) —
'pouch'allDone = card.stakles_baigtos (vietoj abiejų staklių ir pakavimo baigimo tikrinimo).✓.display:grid maketą.2. TECH STACK
pb_data/data.db — VIENINTELIS DB šaltinis šiame kompiuteryje.
gamybos_korteles3. DB SCHEMA
— pagrindinė lentelė
`sql
`
receptai — receptūros
`sql
`
pakuociu_sandelis — pouch sandėlis *(pridėta 2026-06-17)*
`sql
`
gamybos_zurnalas — žurnalas
`sql
`
darbo_laikas — darbuotojų darbo laiko apskaita
`sql
`
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
`
ingredientai — recepto sudėtis (žaliavos)
`sql
`
isvezimai — prekių išvežimo pagal važtaraščius registras
`sql
`
klientai — partneriai / klientai
`sql
`
korteles_regionai — gamybos kortelės paskirstymas regionams (combo)
`sql
`
nurasymai — gamybos metu nurašytų žaliavų registras
`sql
`
recepto_sudetis — recepto sudėties lentelė (gali dubliuoti/pakeisti ingredientai)
`sql
`
recepto_sudetis yra NEGYVA/sugadinta lentelė — nulis nuorodų server.js verslo logikoje.
ingredientai). Tikrinant "ar receptas turi sudėtį?" — visada
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
`
pakuociu_sandelis "rezervuota" skaičiavimas žiūrėjo tik į AKTYVIŲ kortelių planuojamą
laisva = gauta_viso - rezervuota - nurasyta, kur nurasyta = SUM iš šios lentelės.
archyvuoti endpoint'e, PASKUTINIS žingsnis (po galutinio UPDATE) — atomiškumui.
vaztarasciai — prekių išvežimo važtaraščiai
`sql
`
zaliavos — žaliavų sandėlio likučiai
`sql
`
zaliavu_gavimai — žaliavų gavimo iš tiekėjų žurnalas
`sql
`
`4. GAMYBOS CIKLAS
`
`Pouchų workflow
`
GET /wolf5. API ENDPOINT'AI
🕸️ Sistemos žemėlapis (Wolf)
— projekto žemėlapis naršyklėje (tekstinė versija)
GET /wolf/graph — interaktyvus D3.js tinklo grafas
GET /api/gamybos-korteles📋 Gamybos kortelės (Planavimas ir gamybos eiga)
— 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)
GET /api/receptai🥣 Receptūros ir sudėtis
— 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
GET /api/zaliavos🧪 Žaliavų sandėlis (Likučiai ir nurašymai)
— 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)
GET /api/gavimai🎞️ Medžiagų ir žaliavų gavimai (Pajamavimas)
— 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
GET /api/pakuociu-sandelis🛍️ Pakuočių sandėlis (Pouch)
— 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ą
GET /api/vaztarasciai📦 Važtaraščiai ir išvežimai
— 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ą
GET /api/gamybos-korteles/:id/regionai🗺️ Multi-region (Kortelės 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
GET /api/darbuotojai⏱️ Darbo laikas ir 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šą
GET /api/gamybos-zurnalas📖 Gamybos žurnalas
— 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šą
GET /api/klientai👥 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ą
GET /api/debug/printeriai🖨️ Spausdinimas ir PDF generavimas
— 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
GET /mobile📱 Mobilioji sąsaja
— mobiliosios aplikacijos nukreipimas
POST /api/mobilus/priimti — priimti ir apdoroti duomenis iš mobiliojo įrenginio
GET /api/sync-cloud⚙️ Administravimas, importas ir DB priežiūra
— 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)
activeSidebarTab6. UI STRUKTŪRA
Pagrindiniai tabs (
)
`
`
'gamyba' (planavimo langas, panaikintas 2026-07-14,
'kpi' (žurnalo/ataskaitų tab) — jų switchTab() iškvietimų kode
_gamybaLangasTabGamybos lango sub-tabs (
)
`
`
_pagrindinisTab === 'gavimai' → renderGaminamaGavimaiLentele()
`Svarbūs state kintamieji
javascript
`
receptai7. ŽINOMOS SUBTILYBĖS / SPĄSTAI
lentelė NETURI kodas kolonos
C:\VM\pb_data\data.db (NE vm-darbas.db — senas pavadinimas)
node:sqlite ES module (NE better-sqlite3)
/update-wolfŽinomos klaidos ir sprendimai
Klaida Sprendimas | r.kodas column not found receptai neturi kodas kolonos — pašalinti iš SQL | Pouchai kaip tuščios kortelės Neteisingas 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škai ingredientai (ne ingredients), statusas (ne busena — PB reliktas), norma_porcijai, kiekis_vienai_porcijai — prieš naudojant lauką PATIKRINTI realų API atsakymą |„STAKLĖS ✓" žurnalo įrašas KUMULIACINĖ užbaigimo žymė (visas pagaminta_kiekis), NE nauja produkcija — nesumuoti į KPI | POUCH dublikatai Identiš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 LOT Kai 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 validacijas Bendros 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 —
: kodo pusėje pakeitimų nuo 09-11 nebuvo, bet DB schema turėjo mėnesius senos dokumentacijos drifto
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.
makeSelectSearchable()2026-09-11 — sesija: paieškos-select fokuso fix, baigti-gamyba nurašymo pašalinimas (#84), debounced backup sync į B + failover įrankis (#85)
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.
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.
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.
activate-standby.ps1) dar neįdiegtas — žr. atmintį project_antradienio_uzduotys_20260901.md.
galimaPradetiCia2026-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
/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.
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).
public/mobile.html, Agy #73) — analogiškas ekranas telefonui, integruotas į naršymą.
_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.
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.
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).
#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.
.sidebar-menu2026-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)
index.html). Commit 4638220.
email-notify.js BATCH_DELAY_MS) — vartotojo pastaba, kad registruojant kelias pozicijas iš eilės gali neužtekti laiko. Commit 7e97e6d.
/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.
renderMaisomiGaminamoje(). Commit 1a838b8. Patikrinta gyvai (paieška „spinach" → 1/17, fokusas nedingsta).
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.
2994971) — kliento receptų skaičius, paspaudus atidaro Receptai su tuo klientu filtruotu.
_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.
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, 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).
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.
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).
_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.
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.
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-uzduotis.md, tikslūs eilučių numeriai, GRIEŽTAI DRAUDŽIAMA apribojimai, patikrinimo checklist).
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.
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.
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.
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.
vm_backup_push2026-09-04 — sesija: DS el. pašto pranešimai, važtaraščio šablono suvienodinimas, B serverio (MeshCentral) infrastruktūra
, 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.
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ų).
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.
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ą.
/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).
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).
curl | node -e pipe artefaktas (žr. feedback_curl_utf8_windows_corruption.md), ne reali programos klaida — patvirtinta švariu testu (native fetch, be shell pipe'ų).
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.
vm-mesh.js2026-09-05 — sesija: VM Mesh (savas LAN A↔B mazgų valdymas, keičia Tailscale)
— 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ą
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ų).
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ė).
switchTab('gavimai')2026-09-08 — sesija: Gavimai atskiras meniu punktas, Kliento LOT stulpelis, palaidi/įprasto vaztarasčio fix'ai, paleidimo scenarijaus stabilumas
→ 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().
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.
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()).
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.
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).
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).
1fr auto auto)