> [!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-08-14
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 renderGaminamaGavimaiLentele() (~2517 eil., TIKRASIS per filterByTipas('gavimai') — gamybos kortelių plėvelės/dėžučių statusas). Skirtinga paskirtis, abu turi „Gavimai" pavadinime.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./inv komanda, 2 realūs production bug'ai, važtaraščio 2 naujos funkcijos, OmniRoute atsisakymas, atostogų paruošimasNauja /inv slash komanda (.claude/commands/inv.md) — pilnas inventorizacijos-per-nuotraukas workflow su sprendimų medžiu: (a) LOT jau DB+sutampa→nieko, (b) tuščias LOT placeholder+kiekis sutampa→backfill (PUT /api/gavimai/:id, kiekio nekeisti), (c) tikrai naujas LOT→nauja partija (POST /api/papildyti-zaliava/:id), (d) LOT yra bet kiekis nesutampa→klausti, nekeisti tyliai. Per sesiją realiai panaudota ~15 kartų (Vitamin A/B6 placeholder skaidymas į realius LOT'us pagal vartotojo fizinį pallet-tikrinimą, Licorice/Antilles Cherry likučio korekcijos, naujos žaliavos „Green Tea Extract 50% EGCG" sukūrimas kai paaiškėjo, kad tas pats LOT numeris atsitiktinai sutapo su kitu, nesusijusiu produktu).
FEFO nurašymas gali neatitikti realaus fizinio atidarymo — sistema sąmoningai nurašo pagal ankstyviausią galiojimą (žr. 2026-07-29 įrašą žemiau), bet jei vartotojas FIZIŠKAI atidarė kitą (pvz. anksčiau gautą) partiją, reikia rankinio perkėlimo tarp partijų (viena grąžinama į pilną, kita sumažinama tuo pačiu kiekiu, zaliavos.likutis perskaičiuojamas kaip SUM). Realus atvejis: Lemon Juice powder 637/319-92 (FEFO nurašė) vs AN25604950 (realiai atidaryta) — 5,17kg perkelta.
Bug #1 — plevelesGauta() niekad neužpildydavo planuojamas_kiekis (gamybos_ciklas.js): auto-sukurta kortelė (mobile „Priimti") visada gaudavo planuojamas_kiekis=0, ir šis metodas — nors registruoja LOT/EXP/žurnalą — niekad nepataisydavo plano net gavus realų plėvelės kiekį. Pasekmė: maišymo kortelė rodydavo „Pagal planą (0 vnt)", PAKETELIAI laukas neužsipildydavo. Pataisyta — jei planuojamas_kiekis===0, gauto kiekio registravimas jį automatiškai užpildo (esamo rankinio plano neperrašo). Patikrinta REALIU naršyklės testu per Orca (MAGNESIUM CITRATE kortelė, planas 0→163000, matoma maišymo kortelės modale).
Bug #2 — mobili dėžučių registracija VISADA klaidos „Nurodykite gamybos kortelę" (public/mobile.html): dėžučių/pouch registravimas kvietė seną /api/priimti-medziagas, kuris dėžutėms neturi jokios paieškos pagal produkto pavadinimą — reikalauja korteles_id, kurio forma net nesiunčia (tik pavadinimą). Kodo komentaras KLAIDINGAI teigė, kad jau eina per registruotiGavima() — buvo suplanuota, bet niekad nebaigta. Pataisyta — perjungta į /api/registruoti-gavima (auto-paieška/auto-sukūrimas pagal pavadinimą, jau seniai veikiantis kitiems atvejams).
Nauja funkcija — Sąskaitos numeris važtaraščio Istorijoje: kiekvienoje eilutėje laukelis (auto-save onblur), užpildytas → žalias rėmelis + ✅. Nauja vaztarasciai.saskaitos_numeris kolona (tiesioginė SQLite migracija, ne per PocketBase schema — tas pats modelis kaip created/updated), PATCH /api/vaztarasciai/:id/saskaita.
Nauja funkcija — Nestandartinis (laisvo teksto) važtaraštis: trečias Važtaraštis sub-tab'as „✍️ Nestandartinis" — vartotojas ranka įrašo gavėją + laisvą tekstą, be produktų/LOT/palečių builderio. Sandėlio NELIEČIA (jokio isvezimai/nurašymo). Gauna savą VM-numerį, Istorijoje su „✍️ LAISVAS TEKSTAS" ženkliuku. Reikėjo ATSKIROS, paprastos HTML atšakos IR serverio /api/vaztarasciai/:id/html (peržiūrai), IR klientinėje vzBuildVaztarastisHtml (PDF/spausdinimui) — abi funkcijos anksčiau besąlygiškai tikėjosi payload.paletes masyvo.
Orca embedded naršyklė — patikrinimo metodo atnaujinimas (žr. [[feedback_orca_cli_usage]]): ankstesnė 2026-08-01 išvada „nepatikimas, tikrinti Node skriptu" PAKEISTA — šiandien pilnai veikė realiam UI testavimui (snapshot→fill/click→keypress Tab blur→tikrinti DB), naudojant DABARTINĘ (orca skills get orca-cli) sintaksę, ne seną --page/--timeout. Naudota 3 kartus šią sesiją sėkmingai (sąskaitos numerio laukas, maišymo plano bug fix, nestandartinis važtaraštis).
OmniRoute MCP serveris pašalintas (claude mcp remove omniroute) iš C:/VM projekto — buvo palikta registracija ~/.claude.json, kiekvieną sesiją bandanti jungtis į localhost:20128 (503, nebenaudojamas nuo 2026-08-14, žr. [[project_omniroute_valdymo_setup]]).
Atostogų (2 sav.) paruošimas — kritinė spraga rasta: anksčiau sukurtas SYSTEM-lygio VM-AutoStart scheduled task BUVO DINGĘS (nežinia kodėl). Pataisyta be admin teisių (UAC blokavo Register-ScheduledTask/Set-LocalUser): (1) Startup aplanko .lnk (veikia nes Autologon jau įjungtas), (2) VM-Watchdog scheduled task kas 5 min (vartotojo-lygio, ne SYSTEM — tikrina HTTP+procesą, restartuoja per start-background.ps1 jei negyva). Admin teisių reikalaujantis veiksmas, kurį vartotojas atliko pats: vm lokalios paskyros slaptažodis buvo PASIBAIGĘS (2026-07-31) — SSH/RDP fallback nebeveiktų; Set-LocalUser -PasswordNeverExpires $true sutvarkyta.
Vartotojo skundas: barkodų (GS1) skaitymas iš telefono foto nepatikimas — teisingas skepticizmas. GS1 parseriai (gs1js ir pan.) sprendžia TIK jau-iššifruoto barkodo teksto parsinimą, NE vaizdo dekodavimą iš pikselių — realioms sandėlio nuotraukoms (Telegram kompresija, kampas, šešėliai) reikėtų atskiro image-decoding sluoksnio (ZXing/jsQR), kuris irgi nepatikimas tokiom sąlygom. Dabartinis vision-modelio spausdinto teksto skaitymas (kaip visą šią sesiją) realybėje patikimesnis.
Commit'ai: 3cee267 (feat: sąskaitos nr.), 3f001eb (fix: mobili dėžučių registracija), 3298b37 (fix: planuojamas_kiekis), bad7219 (feat: nestandartinis važtaraštis).
Naujas endpoint GET /api/gamybos-korteles/:id/nurasymai (server.js) — VIENOS kortelės nurašymai tiesiai iš SQLite (šaltinis), LEFT JOIN zaliavos (pavadinimas/vienetas), ORDER BY rowid. Skirtingai nei /api/nurasymai, kuris skaito PocketBase veidrodį ir gali būti atsilikęs.
Ryšys: nurasymai NETURI maišymo sesijos FK — maišymo žurnalo įrašo gamybos_zurnalas.data TIKSLIAI sutampa su to maišymo nurašymų nurasymai.created (abu rašomi iš to paties serverio formattedDate, sekundės tikslumu; galioja IR web registruoti-maisyma, IR telegram apdorotiMaisyma). Grupuojant pagal created, vienareikšmiškai atskiriami skirtingi tos pačios kortelės maišymai (patikrinta: BIOCINKAS A260622 — 4 maišymai → 4 grupės; VENOLEGS A260721 — 8 žaliavos). Paskirstytų maišymų kitoms kortelėms atitikimo nėra — rodoma „nerasta" (normalu).
UI (desktop 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
> pb_data/data.db --- ` 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) 'gamyba' → Gamybos langas (planavimas, gamyba_pradeta=0) 'vaztarastis'→ Važtaraščiai 'klientai' → Klientai 'zaliavos' → Žaliavų sandėlis 'receptai' → Receptūros 'kpi' → KPI Ataskaitos (pakeitė seną žurnalo tab) 'istorija' → Istorija (baigtos kortelės) '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 --- - Tailscale Funnel JAU aktyvus → - - Nemokami modeliai VEIKIA per API ( - Kiti tuneliai (neperrašo VM Funnel): cloudflared quick tunnel ( - - - - - - - - Atidėta (architektūrinis sprendimas, ne bugfix): UTC vs Europe/Vilnius laiko zona ( - - - 3× - 🗑 mygtukas dešinėje + žalias „Arch.” kai #### ⚠️ Rytojui: Pouch kortelės tobulinimas
- Receptų dropdown'e filtruojami tik plėvelės/stick tipai (paslėpti - Pridėtas sėkmingo pajamavimo suvestinės konteineris ( - Perkelta inicializavimo logika į - Sutvarkyta, kad formos laukai išsivalytų po sėkmingo išsaugojimo. - Quick Actions home screen (5 action kortelės: Staklės, Pakuoti, Maišyti, Priimti, Išsiųsti) - Swipe gestai (dešinėn=staklės, kairėn=pakavimas) su vizualiniu feedback - Card Detail bottom sheet su statistika ir quick register - 3 tab navigacija (Pultas, Kortelės, Daugiau) vietoj 7 - Offline Queue infrastruktūra (localStorage, auto-sync, badge) - KPI chipai paspaudžiami — rodo produktų breakdown su medaliais - HR ekranas (viršvalandžiai, atostogos nuo-iki, tėvadienis) - Sandėlio likučių ekranas - Perskaitytas ir patvirtintas [AGENTS.md](file:///C:/VM/AGENTS.md) su nustatytomis agentų atsakomybėmis, apribojimais ir saugumo hook'o taisyklėmis. - Atnaujinta sesijos pradžios rutina, įtraukiant naująjį rolių dokumentą (dabar skaitomi 5 failai prieš pradedant darbą). - Įrašytas patvirtinimas į [agy-uzduotis.md](file:///C:/VM/agy-uzduotis.md). - Išanalizuota „GitHub“ repozitorija --- > [!info] Naudojimas
> Šis failas — failų žemėlapis. Patikrink prieš atidarant bet kokį failą. > Pilna projekto logika → [[cerebrum]] Atnaujinta: 2026-08-11 --- `` C:\VM\ ├── server.js ← PAGRINDINIS BACKEND (Express, SQLite, visos API) ├── CLAUDE.md ← Claude instrukcijos (OpenWolf + projekto taisyklės) ├── agy-uzduotis.md ← Agy ↔ Claude komunikacijos kanalas ├── agent-tasks.md ← Bendrų agentų užduočių sąrašas ├── bf-receptai-draft.md ← Agy juodraštis: BF receptų ekstraktas iš senos xlsx (importuota 2026-07-02) ├── of-titan-likuciai-analize.md ← OF/Vital Titan Complex žaliavų likučių analizė (Sheets vs DB, 2026-07-03) ├── bf-zaliavu-likuciai-analize.md ← BF žaliavų likučių analizė (Sheets vs DB, dar NEPERKELTA į DB, 2026-07-04) ├── titan-premix-analize.md ← TITAN premix 2 receptų analizė (Agy #26) + išmanaus maišymo pasiūlymas (2026-07-08) ├── bf-migracijos-planas.md ← BF žaliavų likučių migracijos planas A/B/C/D (Agy #29; importas ĮVYKDYTAS 2026-07-09) ├── mobile-api-auditas.md ← Mobile ↔ API laukų neatitikimų auditas (Agy #30; kritiniai fix'ai 2026-07-10) ├── _backup_auto ← /cm automatinės kopijos (DB snapshot + zip; 7 naujausi, gitignore) ├── .claudecommandscm.md ← /cm komanda: commit + DB snapshot + zip + push ├── .env.example ← Aplinkos kintamųjų šablonas ├── start-background.ps1 ← Windows auto-start skriptas ├── terminal-server.js ← Web terminalas (port 3001) — mobiliems ├── gamybos_ciklas.js ← Gamybos ciklo logikos modulis ├── gamybos_langas.js ← Gamybos lango UI logikos modulis ├── faktinis_sunaudojimas.js ← Faktinio sunaudojimo skaičiavimai ├── telegram-bot.js ← Telegram botas (integruotas ir valdomas iš server.js) ├── darbuotojai.json ← Darbuotojų sąrašas (vietinis registras) ├── code-reviewer.bat ← Paleidžia /code-review skill ├── photo-analyzer.bat ← Nuotraukų analizės paleidimas ├── omni-agent.bat ← OmniRoute/omni agent paleidimas ├── setup-autostart-task.ps1 ← Auto-start užduoties kūrimas (SYSTEM scheduled task, reikia admin — 2026-08-14 rastas dingęs, žr. cerebrum) ├── watchdog.ps1 ← (2026-08-14) kas 5 min tikrina ar serveris gyvas+atsako HTTP, restartuoja per start-background.ps1; VM-Watchdog scheduled task (be admin teisių) ├── ssh-setup.ps1 ← SSH prieigos konfigūracija (Tailscale) ├── run-server.bat, start.bat, dos.bat ← Serverio/daemon paleidimo trumpiniai │ ├── installer-build/ ← Installer/build aplinka (sandbox testai, ai-tools/) ├── ai-tools/ ← AI įrankių diegimo skriptai ├── headscale/ ← Headscale (Tailscale kontrolės serveris) konfigūracija │ ├── public/ │ ├── index.html ← DESKTOP UI (~15k eilučių) │ ├── mobile.html ← MOBILE UI v3 (dviguba tema tamsi/šviesi, aurora, PTR, haptika, ~4000 eil.) │ ├── index_backup_2026-07-04.html ← Senoji desktop versija (backup) │ └── mobile_backup_2026-07-04.html ← Senoji mobile versija (backup) │ ├── tools/ │ └── SumatraPDF-3.5.2-64.exe ← Silent PDF printing (naudoja /api/mobile/print) │ ├── pb_data/ │ └── data.db ← VIENINTELIS DB ŠALTINIS (SQLite) │ ├── .wolf/ ← OpenWolf sistema │ ├── OPENWOLF.md ← Sistemos taisyklės │ ├── cerebrum.md ← Projekto smegenys [[cerebrum]] │ ├── anatomy.md ← Šis failas │ ├── HOME.md ← Obsidian pradinis puslapis │ ├── db-schema.md ← DB lentelės detaliai │ ├── workflow.md ← Gamybos ciklas žingsnis po žingsnio │ ├── pakuotes.md ← Pakuočių tipai ir sandėlis │ ├── klaidos.md ← Žinomos klaidos ir sprendimai │ ├── Atidaryti-Obsidian.bat ← Greitas Obsidian paleidimas │ └── .obsidian/ ← Obsidian konfigūracija │ ├── .claude/ ← (gitignored, tik lokalus šis kompiuteris) │ ├── settings.json ← self-improving-agent hook + block-dangerous PreToolUse │ ├── settings.local.json← Vietiniai leidimai │ ├── hooks/ │ │ └── block-dangerous.sh ← blokuoja rm -rf/, git reset --hard, force push, DROP TABLE, │ │ pb_data trynimą (2026-07-02) │ ├── commands/ ← /cm, /commit, /verify?, /update-wolf, /tgc, /tg, /inv (2026-08-14, inventorizacijos-per-nuotraukas sprendimų medis), /check-server, /doubt, /interview, /spec │ └── skills/ ← (2026-08-11) wmux, orca-cli, orchestration, wmux-browser (žr. [[cerebrum]] §9) │ ├── DRIVE/ │ └── telegram-foto/ ← Telegram foto inbox (nuotrauka+.json kiekis, žr. [[cerebrum]] 2026-07-04) ├── failai/ ← Įkelti failai (Excel, PDF importui) ├── logs/ ← Serverio žurnalai └── node_modules/ ← NPM pakuotės (neredaguoti) --- → → → → → → → _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
` — VIENINTELIS DB šaltinis šiame kompiuteryje.3. DB SCHEMA
gamybos_korteles
— pagrindinė lentelėsqlreceptai — 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 grafasGET /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)
POST /api/gamybos-korteles/:id/registruoti-maisyma — užregistruoti atliktą maišymą (kg)
POST /api/gamybos-korteles/:id/registruoti-gamyba — užregistruoti staklių gamybą
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/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ėtiesGET /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 formatuGET /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 regionuiGET /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 šablonoGET /mobile📱 Mobilioji sąsaja
— mobiliosios aplikacijos nukreipimas
POST /api/mobilus/priimti — priimti ir apdoroti duomenis iš mobiliojo įrenginioGET /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ąactiveSidebarTab6. UI STRUKTŪRA
Pagrindiniai tabs (
)
`
`_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)
sk-91161731e4e0d947-178100-78f44d6bŽ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-08-11 — sesija (3): OmniRoute valdymas agentui
(CLI Auto-Key, id 67af762b-72a3-4ca8-ad05-0fe6af0ea185) suteiktas manage+admin scope tiesiogiai ~/.omniroute/storage.sqlite (backup: storage.sqlite.backup-20260811-234750). Patikrinta gyvai: GET/PATCH /api/settings, GET /api/tunnels/tailscale/check, GET /api/models — visi 200 su Bearer. Agentas dabar gali programiškai keisti visus OmniRoute nustatymus: omniroute --base-url http://localhost:20128 api settings ..., tunelius (/api/tunnels/*), providerius, rate limit, IP filtrą, requireLogin, modelių routingą.
C:\Users\justa\OMNIROUTE-TAILSCALE-CODEX-ANALIZE.md — Tailscale integracija, agento nustatymų CRUD, Codex nemokamai (pilna diagnozė).
https://justas.tailf67d20.ts.net/ → 127.0.0.1:3000 (VM serveris). OmniRoute savo Funnel įjungimas perrašytų šį maršrutą (vienas root maršrutas). Vartotojo sprendimas užfiksuotas atmintyje: VM puslapis turi likti, OmniRoute tik PRIDĖTI (ne perrašyti) — žr. [[feedback_tailscale_funnel_neraoverwrite]].
oc/* modeliai routeriuje → "codex" provider, kuriam prisijungimo NĖRA (codex OAuth neegzistuoja — 404). opencode/* → "opencode" provider, bet jo raktas sugedęs (upstream "Missing API key", nors statusas "active"). Codex CLI fix reikalauja vartotojo veiksmo: perdaryti opencode API raktą Dashboard → Providers → "OpenCode Account 1".
auto/coding:free, oc/longcat-2.0-free, oc/deepseek-v4-flash-free, opencode/deepseek-v4-flash-free) — Codex CLI kaip klientas NEveikia (žr. aukščiau).
POST /api/tunnels/cloudflared, be paskyros/rakto) ir ngrok (POST /api/tunnels/ngrok, reikia NGROK_AUTHTOKEN). Abu atskiri nuo Tailscale. Vartotojo sprendimas atidėtas rytoj; prieš viešą adresą patikrinti requireLogin. Detaliau — atmintyje [[project_omniroute_valdymo_setup]].darbo_laikas2026-08-11 — sesija (viršvalandžių komentaras + wmux/Orca skills + taisyklių analizė)
DB — nauja komentaras kolona (server.js migracija su guarded ALTER TABLE): POST/PUT priima laisvą komentarą prie dienos, GET grąžina per SELECT *. Desktop „Viršvalandžiai" ir Mobile „Darbo laikas" istorijoje paspaudus dieną su komentaru — komentaro popup (vvShowComment/hrShowComment, fiksuotas overlay su mousedown+click guard). Desktop forma: „Komentaras (nebūtina)" laukas (vvFormKom). Telegram boto INSERTai (be komentaro) veikia per DEFAULT ''. Detaliau — §3 schema + §6 UI.
komentaras (registruota prieš serverio fix) įrašytas tiesiai į DB per UPDATE.*.claude/skills/2026-08-11 — sesija (2): New skills
skill'ai (kaip Orca CLI): wmux (daugiaagentė orkestracija per MCP, Orca vs wmux atskyrimas, „kur vyksta tavo sesija" — išorinė sesija = tik stebėjimas → patikrinta gyvai), orca-cli (darbinis terminalas), orchestration (a2a gyvavimo ciklas, misijos, fanout, deck), wmux-browser (naršyklės automatizavimas). Skill'ai auto-atsidaro pagal description frazes.
workspace_list/a2a_discover/pane_list/surface_list; visi identity-scoped įrankiai (channel_*, a2a_task_*, wmux_events_poll, wmux_search_panes, browser_*, terminal_read su ptyId) grąžina *Workspace identity unknown* / *BROWSER_TABS_WORKSPACE_UNRESOLVED*. Reikia bėgti wmux terminalo workspace'e.b3b6e162026-07-08 — sesija (commit'ai
, 5d7095e, ac405a1, f0c8a42)
index.html): gavimų lentelė perkelta iš Gamybos lango į Gaminama kaip pilnavertis tabas — gamybos būklės dashboard'as (Agy užduotis #25 + Claude pertvarkymas). Virtualios eilutės (_pradetiIsVirtualaus), redagavimas tiesiai lentelėje, „Pradėti gamybą" mygtukas, naujausias gavimas viršuje.
--bg-sheet).
index.html, vakarinė sesija): _premixSmulkus(ings, svorisGr) atrenka smulkius ingredientus (< 0.25 g/pktl ARBA < 2% pakuotės svorio, min 2 vnt.), printPremixLapas() spausdina atskirą violetinį lapą — kiekiai visam užsakymui, LOT/EXP, MIX norma g/pktl ir prisvėrimo pavyzdžiai maišymams. Mygtukas kortelės modale šalia „Spausdinti gamybos užduotį", rodomas tik kai receptas turi smulkių. Jokių DB pakeitimų — viskas dinamiška (vartotojo sprendimas: premix maišomas visam užsakymui iš karto, be atskiros žaliavos/LOT sekimo). Kilmė: Agy #26 TITAN analizė (titan-premix-analize.md) — senoje sistemoje buvo 2 receptai, premix MIX (OF) 0.32037 g/pktl = 9 smulkiųjų suma.
_printKorteleData papildytas dezGauta (žurnalo veiksmai Gauta dėžutės/Dėžutės gautos/Priimta dėžutė, match pagal batch-LOT arba pavadinimą). Premix lape kiekis — redaguojamas #pmQty input su gyvu perskaičiavimu (pmRecalc(), data-norma atributai) ir „Pagal gautas dėžutes: N dėž. × pak_dezuteje ⟵ naudoti" mygtuku. Jei plano nėra — startuoja nuo dėžučių kiekio. Use case: TITAN dėžutės gautos (7 550 dėž. × 30 = 226 500 pktl), plėvelė dar ne.4d647c22026-07-07 — sesija (commit'ai
, 0404cbe, 35b1443)
supakuota_kiekis (anksčiau „įstrigdavo"). Sukurtos/atkurtos kortelės: SELENE (BF), HYDRO FORTE LV/EST (BF).
vzClientChanged() nebeištrina atkurtų palečių), „Dėžučių/dėž." stulpelis, spausdinimo lūžio fix (display:table), regiono pasirinkimas prekės pridėjime, palaidi varnelė BF klientams.
LIKE 'STAKL%' → tikslus veiksmas = 'STAKLĖS' atitikimas 3 žurnalo endpoint'uose (dvigubo pagaminta_kiekis skaičiavimo fix). Agy #22/#23: mobile važtaraščio vaztNepilnaUsesDezSub() helperis + CSS calc(-1 * var()) fix.public/mobile.html2026-07-03 — sesija
) — mobilioji app etikečių ekranas visada naudojo bendrą /api/gamybos-korteles/:id/etiketes-html (24 lipdukai/lape, generinis dizainas), net ir SL klientui, kuriam turi būti spausdinamas kitoks, kliento pateiktas NUTRIOTECA šablonas. Svarbu (dvi skirtingos endpoint'os, nesupainioti): /api/dezes-lipdukas?kortele_id= generuoja 1 lipduką/lape — tai atskiras „🏷️ Dėžės lipdukas" mygtukas transportinės dėžės išorei (desktop index.html). /api/etiketes-laisvos?receptas_id=&lot=&exp=&serija=&lapai= su NUTRIOTECA_LABEL_MAP recepto ID generuoja 14 lipdukų/lape (pagal lapai param) — tai teisingas endpoint'as įprastam „daug etikečių ant lapo" spausdinimui (naudoja desktop'o „Etiketės laisvos" modalas). Pataisyta: naujas _etiketesUrl(id, lapai) helperis, kuris SL kortelėms nukreipia į /api/etiketes-laisvos (su card.kliento_lot||card.lot, card.exp, card.receptas_id), o ne į /api/dezes-lipdukas. „Lapų skaičius" antraštė dinamiškai rodo 14 vs 24 pagal klientą.
public/mobile.html) — pridėtas „Užsakovas" pasirinkimo laukas (dropdown iš unikalių kliento_kodas reikšmių tarp visų kortelių) prieš produkto paieškos lauką; pasirinkus užsakovą, paieškos sąrašas filtruojamas tik pagal jo korteles. Sąrašo įrašuose taip pat pridėta kliento spalvota žymė (renderClientBadge).
curl į /api/etiketes-laisvos — patvirtinta 28 lipdukai (14×2 lapai) su teisingu produkto pavadinimu ir kliento LOT; ne-SL kortelėms senas /etiketes-html + 24/lape srautas nepakitęs.
wmux MCP įrankis įdiegtas (sisteminis, ne repo dalis) — Windows terminalo multiplekseris agentų tarpusavio bendravimui (a2a_send/a2a_broadcast) tarp Claude Code ir kito CLI agento (Agy/Antigravity CLI), be vartotojo rankinio perdavimo. Konfigūracijos backup prieš diegimą: ~/.claude/backups/pre-wmux-20260703-081807/. a2a_discover pasirodė nepatikimas (mato tik save) — žr. [[feedback_wmux_pane_targeting]] atmintyje, naudoti pane_list/surface_list + terminal_send su konkrečiu ptyId.
wmux sukurta antra Claude Code sesija (kartu su Agy) šalia šios, jai priskirta ir užbaigta Užduotis #13/#14 (BF receptų pakavimo konfliktų sprendimas realiais PDF/Excel šaltiniais). Rezultatas: visi 22/22 BF produktai importuoti į DB (SELENE, Laxmag papildyti vartotojo pateiktais duomenimis). Detali eiga → agy-uzduotis.md #14, likę atviri klausimai (LABASEN/SPORT PROTEIN NR.2 dublikatai, COR4 be sudėties, BIOKALCIS svorio neatitikimas) → [[project_bf_receptu_spragos]] atmintyje (bendra abiem sesijoms).
f61f0ac: mobile etikečių fix + AGENTS.md/agy-uzduotis.md/bf-receptai-draft.md pakeitimai.
server.js, telegram-bot.js, public/mobile.html) — pilna analizė (Claude fork + Agy #15) rado bugus abiejuose backend failuose. Pataisyta:
telegram-bot.js: pridėtas escHtml() — Telegram parse_mode:'HTML' pranešimai anksčiau lūždavo su &/</> simboliais vartotojo varde/produkto pavadinime (400 klaida, pranešimas neišsiunčiamas).
telegram-bot.js (apdorotiMaisyma): trūkstama recepto norma (baseNorma/ing.norma = null/undefined) galėjo įrašyti NaN į zaliavos.likutis — pridėta !(x > 0) patikra (pagauna NaN/null/undefined, ne tik <=0).
telegram-bot.js: hrDel_, archyvavimo (confirmF_) ir žurnalo trynimo (dL_) catch blokai anksčiau arba tylėjo apie klaidą, arba apeidavo server.js verslo logiką tiesioginiu DB rašymu — dabar visur tiesiog praneša klaidą vartotojui.
telegram-bot.js: 3 vietose (zGaliojimas|, pGaliojimas|, dGaliojimas|) EXP data priimama be validacijos — pridėta isValidDateStr() (YYYY-MM-DD regex + Date patikra).
server.js (registruoti-pagaminta): KRITINĖ — catch fallback aklai kartodavo pagaminta_kiekis += kiekis, nors faktinis_sunaudojimas.js registruotiPagaminta() (be transakcijos, WAL) galėjo jau būti atlikusi tą pačią operaciją prieš klaidą → galimas dvigubas kiekio užskaitymas. Fallback pašalintas, dabar tiesiog 500 su klaidos tekstu.
server.js (toggle-pill): pridėta isNaN patikra prieš rašant boolean-tipo stulpelį.
public/mobile.html: offlineQueue.processQueue() po sėkmingos sinchronizacijos visada kviesdavo render(), ištrindama darbuotojo pildomą Priėmimo formą (#mBulkRows gyvena tik DOM'e) — dabar render() praleidžiamas, jei state.screen === 'receiving'.
new Date().toISOString() naudojama visur sistemoje vienodai — pataisius tik vieną lauką atsirastų nenuoseklumas).
public/index.html: vz-address-wrap/vzGetRecipient(); mobile public/mobile.html: vaztAddress/vaztGetRecipient()), leidžiantis pasirinkti kliento papildomi sąrašo adresą vietoj pagrindinio važtaraščio kūrimo metu.
klientai.papildomi stulpelis realiai egzistuoja SQLite lentelėje (pridėtas anksčiau tiesiogiai, ne per PB migraciją), bet pb.collection('klientai').getFullList() jo VISAI negrąžina JSON atsakyme — PocketBase serializuoja tik laukus, kuriuos pats žino iš savo schema meta. Bet koks endpoint'as, naudojantis pb.collection() (ne tiesioginį db.prepare()), NEGAUS papildomi reikšmės, net jei ji SQLite yra. Pataisyta GET /api/vaztarastis-duomenys (server.js) — po pb.collection('klientai').getFullList() papildomai užklausiama db.prepare('SELECT id, papildomi FROM klientai') ir sujungiama pagal id. Jei ateityje kitas endpoint'as irgi naudoja papildomi (ar bet kurį stulpelį, pridėtą praeityje tiesiogiai per SQLite, ne PB Admin UI/migraciją) per pb.collection() — jam reikės to paties merge patch'o.
klientai.papildomi laukas naudojamas DVIEM SKIRTINGAIS TIKSLAIS — dauguma klientų jį naudoja kaip masyvą papildomų pristatymo adresų [{pavadinimas, adresas}] (pvz. SOULEL/„SL"), bet bent vienas klientas („SM"/SANTAMED LT) jį naudoja kaip objektą su {imones_kodas, pvm} (įmonės rekvizitai). Kodas, skaitantis papildomi kaip adresų masyvą, turi apsisaugoti nuo šio atvejo (JSON.parse(...) gali grąžinti objektą, ne masyvą — Array.isArray() patikra prieš .map()).
kodas='SL' NEPAKEISTAS (receptai/kortelės sieja per kodą, ne pavadinimą) — pakito tik display laukai.server.js2026-07-02 — sesija (didelė, maratoninė)
) — buvo 4 lygiagrečios, istoriškai išsiskyrusios dosje/kortelės generavimo implementacijos. Ištrinta perteklinė/buginga GET /api/dosje/:id (ir client-side window._printDosje, ~68 eil.) — liko archyvuoti (stored dosje_tekstas), /dosje-html (visada gyvai perskaičiuojamas HTML), ir printGamybosKortele()/_printFaktineKortele() (maišymo kortelės spausdinimas).
pakuociu_nurasymai lentelė (nauja, žr. §3) — pouch pakuočių PASTOVUS nurašymas archyvuojant, kad pakuociu_sandelis "laisva" liktų teisinga po archyvavimo (anksčiau dingdavo iš rezervacijos skaičiavimo).
archyvuoti endpoint fix'ai — idempotencijos apsauga (jei jau archyvuota → klaida), nurasymai SQL trūko zaliava_id (sukeldavo "cannot be bound to SQLite parameter 1" klaidą), važtaraščių paletės/dėžės skaičiavimas filtruojamas pagal PRODUKTĄ (buvo klaidingai imami visos siuntos totalai — dosje rodydavo kitos produkcijos pal./dėž. skaičius), žaliavos grupuojamos pagal pavadinimą, kliento kodo fallback (kliento_kodas → receptas.klientas kai 'KITA'/tuščia).
faktiniai_duomenys TEXT — perkeltas iš retai trigerinamo sync kelio į besąlyginę startup migraciją (anksčiau archyvavimas visada lūždavo "no such column").
baigti-stakles — pouch tipo produktams dabar VIENOJE UPDATE kartu nustato ir stakles_baigtos=1, ir pakavimas_baigtas=1 (pildymas+pakavimas vyksta vienu metu pouchams) — bet koks UI kelias (senas/naujas) dabar nuoseklus.
/api/istorija — grąžindavo be sumaisytas_kiekis/pakuotes_tipas/faktiniai_duomenys laukų → "Gamybos kortelė" iš Istorijos rodydavo 0/tuščia. Papildyta.
index.html) — paspaudus produkto pavadinimą, mažas popup: Maišymai / Etiketės / Baigimo darbai / Kortelė info (vietoj tiesioginio modalo). ~470 eil. pašalinta negyvo kodo (openMaisymasModal, submitMaisymas, vzPrintHistory, _openZaliavosIstorijaModal).
norma_porcijai × sumaisytas_kiekis, BE nuostolių%). Pervadinta "Spausdinti kortelę" → "Spausdinti gamybos užduotį".
_downloadHtmlAsPdf() / _downloadDosjePdf() (naudoja esamą /api/generuoti-pdf), "📥 PDF" mygtukai prie visų "🖨 Dosje" vietų + spausdinimo languose.
recepto_sudetis lentelėje su dubliuotomis žaliavomis); importuota 18 naujų receptų iš senos xlsx (bf-receptai-draft.md). HYDRO FORTE LT/LV-EST liko be savo ingredientai — tai teisinga: jos yra combo-dezute tipo pakavimo įrašai, sudaryti iš HF1+HF2 (žr. pastabos lauką recepte). Neišspręsta: LABASEN 1 GR / SPORT PROTEIN NR.2 (identiški LABANAKT/SPORT PROTEIN — dublikatai?), COR4/SELENE/Laxmag (nėra sudėties senoje sistemoje), BIOKALCIS 1200 (katalogo svoris≠sudėties suma) — žr. [memory: project_bf_receptu_spragos.md].
.claude/hooks/block-dangerous.sh (lokalus, negit'inamas) — pridėta S:\ prieigos blokada bet kokiai Bash/PowerShell komandai (mechaniškai vykdo CLAUDE.md taisyklę, ne tik tekstu). git commit išimtis praplėsta tikrinti bet kur komandoje (ne tik pradžioje), kad neblokuotų git add && git commit -m "..." grandinių, kur žinutėje paminėtas "S:\".
CLAUDE.md — sesijos pabaigos rutina papildyta žingsniu peržiūrėti sesijos klaidas/korekcijas ir jas fiksuoti kaip feedback_*.md atmintį (self-improving-agent formatas), neatidėliojant.index.html2026-07-01 — sesija
) — vzSilentPrint() naudojo seną, neteisingą šabloną (kitas įmonės pavadinimas/adresas). Ištraukta bendra vzBuildVaztarastisHtml() funkcija — dabar „Peržiūra"/PDF/„Spausdinti" visi naudoja tą patį, teisingą GAS stiliaus maketą.
index.html) — nepilnos dėžės +1 buvo pridedama du kartus (prie it.dez/it.space, kurie jau įskaičiuoja nepilną, ir dar kartą suvestinėje) → 8 pilnos + 1 nepilna rodė 10 vietoj 9. Ištaisyta bendroje suvestinėje, paletės antraštėje ir produktų suvestinėje.
index.html + server.js) — pašalintas nereikalingas „DĖŽUČIŲ/DĖŽ." stulpelis, „PKTL./DĖŽ." pervadintas į „PAK./DĖŽ." (abu šablonai: peržiūra/spausdinimas ir istorijos PDF).
index.html) — pouch produktams (dez_dezeje=1 yra tik apeinamasis žymėjimas „nėra tikro sub-lygio", ne reali struktūra) laukelis klaidingai interpretavo įvestą kiekį kaip dėžučių, ne vnt., ir dauginant iš pak_dezuteje gaudavo klaidingą (10–50×) kiekį. Sąlyga pataisyta į dez_dezeje > 1 — realus dėžučių sub-lygis egzistuoja tik HYDRO FORTE tipo produktams.
index.html) — „Paketeliai" grupė neturėjo flex-shrink:0, siaurame lange etiketė persidengdavo su input laukeliu. Pridėta abiem („Nuostoliai", „Paketeliai") grupėms.
index.html) — pridėtas užsakovo pavadinimas (ne tik kodas) prie kiekvienos kortelės; ištaisyta rašybos klaida „Maisomi" → „Maišomi" tab'o etiketėje.
server.js) — svoris nebebuvo reikalingas etikečių info eilutėje (/api/etiketes-laisvos ir kortelės /etiketes-html), trukdė sutilpti likusiai informacijai.
server.js) — nauja funkcija pagal kliento pateiktą .docx šabloną 5 produktams (Daily Creatine, Bone Broth + Creatin, Electrolytes + Creatine/Vitamin C/Red Berries): prekės ženklo pavadinimas, N packs (net Xg), Brutto, Best before, kliento LOT (atskiras nuo mūsų vidinio), Units per box, EAN-13 barkodas (grynas JS, be išorinių bibliotekų — renderEAN13Svg()), UAB Aeterna Cibus rekvizitai. Integruota į /api/etiketes-laisvos (12→14 lipdukų/lape, sutankinta) ir atskirą /api/dezes-lipdukas?kortele_id=. Naujas DB laukas gamybos_korteles.kliento_lot. „🏷 Etiketės" mygtukas šiems produktams automatiškai atidaro šį šabloną.
server.js) — nauji receptai laukai pak_svoris_g (paketėlio plėvelė), dezute_svoris_g (dėžutė), deze_svoris_g (transportinė dėžė). Brutto = (svoris_g+pak_svoris_g)×Units_per_box + dezute_svoris_g×dez_dezeje + deze_svoris_g. Užpildyta 3/5 SL produktams (Vitamin C, Red Berries, Daily Creatine); likusiems 2 (Bone Broth, Electrolytes+Creatine) laukia realių pakuotės svorių — lieka tuščia eilutė kaip originaliame šablone.
server.js) — naktinis cron (3:00) dabar taip pat valo pamirštus _tmp_*.html failus DRIVE/ kataloge (PDF failai/istorija neliečiami).
.mcp.json (mcp-server-sqlite-npx, nukreiptas į pb_data/data.db) tiesioginėms SQL užklausoms be node -e scenarijų.
VM Agentai.lnk „Agy" tab'as klaidingai paleisdavo agy.cmd (senas apsimestinis wrapper'is su Claude Code + custom prompt), nors tikras Antigravity CLI (agy.exe, jau PATH) seniai įdiegtas. Pataisyta nuoroda, ištrintas pasenęs agy.cmd + .claude/agy-prompt.md.index.html2026-06-30 — sesija
+ server.js) — naujas "Paketeliai" laukelis modalo parametrų juostoje: įvedi N vnt → ingredientai perskaičiuojami pagal N × norma × (1+nuostoliai%). Spausdinimas: pktCount query param, antraštė rodo "N pkt" vietoje "1 maišymui". Prioritetas: bazė > paketeliai > planas.
mobile.html) — anksčiau rodė tik aktyvias (gamyba_pradeta=1). Dabar lazy-load visų ne-archyvuotų iš /api/gamybos-korteles kai atidaromas ekranas. Ženkliukai [Plan.] / [Baigta] / [Aktyvi].
mobile.html) — dropdown pakeistas teksto lauku su live filtru pagal pavadinimą arba LOT. Sąrašas rodomas žemiau, paspaudus pasirenka ir užsidaro. ✕ mygtukas valo pasirinkimą.
mobile.html) — safeFetch() grąžina JSON, bet /etiketes-html grąžina HTML → pakeista į fetch() + .text().faktiniai_duomenys2026-06-23 — sesija (pilna diena)
kolona), iš istorijos spausdina faktinę kortelę
_printGamybosKorteleFromIstorija() leidžia spausdinti archyvuotų kortelių maišymo korteles
/api/vaztarastis-duomenys — perrašytas iš PocketBase į tiesioginį SQLite (greitesnis)
gr/pktl headeris kortelėje
pagaminta_kiekisGET /api/gamybos-korteles/:id/etiketes-html2026-06-22 — sesija (pilna diena)
, mobile ekranas, skirtingi šablonai paketeliai/pouch, EXP apačioje
C:\VM\DRIVE\ po nurašymo, Google Drive katalogas paruoštas
tools/jq.exe
pakuociu_sandelis2026-06-17 — sesija 1 (rytas)
lentelė sukurta
/api/pakuociu-sandelis GET/POST/DELETE
.wolf/2026-06-17 — sesija 2 (vakaras)
direktorija su 8 failais
/wolf route — projekto žemėlapis naršyklėje (tekstas su tabs)
/wolf/graph route — interaktyvus D3.js tinklo grafas (8 mazgai, 22 ryšiai)
🕸 Grafas + 🐺 Tekstas mygtukai
self-improving-agent hook aktyvuotas (.claude/settings.json)
C:\Users\justa\AppData\Local\Programs\obsidian\)
VM Wolf.lnk) — atidaroma su vault'u
readdirSync pridėtas prie server.js importų
CLAUDE.md atnaujintas — sesijos pabaigos rutina + teisingas DB pavadinimas
agy-uzduotis.md atnaujintas — sesijos pradžios rutina Agy agentui
nodejs-backend-patterns2026-06-17 — sesija 3 (vėlyvas vakaras)
, nodejs-best-practices, sql-optimization-patterns.
POST /api/gavimai/bulk endpoint'as sukurtas plėvelių rulonų priėmimui su auto-generuojamu LOT kodu [Raidė][YYMMDD].
server.js2026-06-18 — sesija 7 (Agy)
): atnaujintas dosje_tekstas generavimas archyvavimo metu, pridedant išsamų žaliavų LOT/EXP atsekamumą su nurašymų ir gavimų lentelių palyginimu, maišymų suvestinę iš gamybos žurnalo, kliento informaciją su kliento serija etiketėms ir bendro sumaišyto kiekio rodymą.
GET /api/gamybos-korteles/:id/dosje-html): sukurtas naujas endpoint'as, kuris grąžina profesionalų, A4 portrait formatui ir spausdinimui pritaikytą HTML su Daily Spoon logotipu, suvestinėmis ir parašo laukais.
public/index.html): pridėti „🖨 Dosje“ mygtukai istorijos kortelės valdyme bei modaliniame lange, atidarantys naująjį spausdinimo puslapį naujame lange.telegram-bot.js2026-06-18 — sesija 6 (Agy)
) – 100% atstatytas visų funkcijų veikimas (monitorius, maišymai, trūkstamų žaliavų planavimas, UUID-saugus žurnalo ir HR įrašų redagavimas/trynimas, priėmimas, naujų narių admin patvirtinimai).
userStates deklaracija ir suderinta SQLite su Express /api/priimti-medziagas API.
kliento_serija2026-06-18 — sesija 5
— naujas laukas, etiketėse gamintojo serija, važtaraščiuose mūsų LOT
kliento_serija kolona gamybos_korteles — etiketėse gamintojo serija, važtaraščiuose mūsų LOT_saveReceptasExtra(id)2026-06-17 — sesija 4 (naktis)
— saugo stakliu_rekomendacija + gamybos_pastabos per PUT
gamyba-row iš grid → viena flex eilutė su:
gr-name-stack (180px): pavadinimas / LOT / EXP stacked vertikaliai
gr-mix-mini (88px): mini maišymo progress baras su ⚗ etikete ir procentu
progress-block (flex:1 kiekvienas): PAGAMINTA / SUPAKUOTA / IŠSIŲSTA — originalaus dydžio
allDone
! statusas ir 🔍 atsekamumas mygtukai iš kortelės (per daug triukšmo)
stakles_baigtos; SUPAKUOTA lygiai taip pat kai pakavimas_baigtas
display:grid per inline style (nesulaužyta)
instructions.md, agy-uzduotis.md, klaidos.mdpouch2026-06-18 — sesija 1 (rytas - Agy)
receptai).
mBulkResultNotice), rodantis sugeneruotus LOT ir papildomus duomenis.
renderGavimas pabaigą, išsprendžiant tuščio vaizdo bug'ą perpiešiant (renderView()).
GET /api/mobile/dashboard2026-06-19 — sesija 3 (Claude, pagrindinis darbas)
— naujas optimizuotas endpoint mobiliajai app. Vienas API call vietoj 7, ~10KB vietoj 1.5-2MB. Grąžina aktyvias korteles su server-side isvezta skaičiavimu, mėnesio KPI stats, counts, klientus, darbuotojus
public/mobile.html) — premium dark glassmorphism dizainas (Revolut/N26 stilius):
STAKLĖS ✓ ir PAKAVIMAS ✓ baigimo žymos nebedubliuoja kumuliacinio kiekio KPI skaičiuose
index.html KPI panelėje pridėtas "Spausdinti" mygtukas su A4 landscape ataskaita
tailscale funnel aktyvuotas (https://justas.tailf67d20.ts.net/), Telegram WebApp SDK integruotas, Mini App meniu mygtukas užregistruotas per BotFather API
POST /api/mobile/print endpoint: telefonas siunčia HTML → Playwright generuoja PDF → SumatraPDF (portable) tyliai spausdina ant HP LaserJet be jokio dialogo kompe
#headerBackBtn2026-06-19 — sesija 2 (Agy)
) — įdiegtas viršutiniame headeri, dešinėje pusėje prie ⏱ laiktoduko ikonos, kuris dinamiškai rodomas sub-ekranuose (receiving, shipping, hr, sandelys) ir paslepiamas pagrindiniuose dashboard tabuose.
_screenHistory stekas navigate(screen, params) funkcijoje ir globalus goBack() iškvietimas, leidžiantis sklandžiai grįžti į praėjusį langą (vietoj visada navigavimo į 'more').
← Atgal) iš Priėmimo (renderReceiving), Važtaraščių (renderShipping), Darbo laiko (renderHR) bei Sandėlio likučių (renderSandelys) ekranų.
renderReceiving) pakeistas iš atskirų žetonų (chips) į tab-bar stiliaus horizontalius barus (.tab-bar ir .tab-btn), sutapdinant jo dizainą su visa sistemos stilistika.
{ zaliava_id, svoris } parametrus į serverį.
db-schema.md) — prie klientai lentelės schemos aprašyti žinomi sistemos klientai ir papildyta naujo kliento SM (UAB "SANTAMED LT") rekvizitais.isvezta_kiekis2026-06-19 — sesija 1 (Agy)
pataisyma (telegram-bot.js) — išspręsta klaida, kai botas naudojo neegzistuojančią c.isvezta_kiekis koloną iš gamybos_korteles. Sukurtas getIsvezta(lot, recPav) helperis dinamiškai sumuoti išsiuntimus iš gamybos_zurnalas.
public/mobile.html, server.js) — perkeltas tipų pasirinkimas į tab-bar stiliaus kontrolę, viršvalandžių balansas apribotas einamuoju mėnesiu, pridėtas istorijos išskleidimas paspaudus ant balanso kortelės, įdiegtas konkretaus mėnesio pasirinkimas su atitinkamu istorijos ir balanso filtravimu, bei pataisyti backend maršrutai, kad SQLite duomenų bazėje būtų išsaugotas tipas (Atostogos/Tėvadienis/Darbas).
public/mobile.html) — pultas dabar rodo tik KPI suvestinę ir aktyvias gamybos korteles, pašalinti sub-tabai iš „Kortelės“ rodinio, o gamybos kortelių detalių modaliniame lange pridėtas „🧪 Registruoti maišymą“ veiksmas. Visos specifinės valdymo funkcijos ir filtrai perkelti po „Daugiau“ meniu ekranu.system_prompts_leaks2026-06-22 — sesija 1 (Agy)
bei atskirai peržiūrėti nutekinti Google Antigravity CLI nurodymai, patvirtinantys esamą agento elgseną./si:remember9. TOOLS / SKILLS
Aktyvūs
— išsaugoti žinojimą į atmintį
/si:review — atminties sveikatos patikrinimas
/wolf — projekto žemėlapis naršyklėje (http://localhost:3000/wolf)
C:\VM\.wolf\)
telegram-bot.js), startuojamas kartu su Express serveriu.~/.claude/projects/C--VM/memory/MEMORY.mdAtmintis
— automatinė Claude atmintis
.wolf/cerebrum.md` — rankinis žinių žemėlapis (šis failas)
VM Projekto Failų Anatomija
Šaknis
C:\VM\server.jsSvarbiausi failai pagal darbą
🔧 API keitimas
public/index.html🖥️ Desktop UI keitimas
(~15k eilučių — labai didelis, naudoti Grep prieš Read)public/mobile.html📱 Mobile UI keitimas
pb_data/data.db🗄️ DB schema tikrinimas
+ server.js migracijų sekcija viršujegamybos_ciklas.js⚙️ Gamybos ciklo logika
+ gamybos_langas.jsagy-uzduotis.md📨 Agy agento užduotys
.wolf/cerebrum.md` ([[cerebrum]])
🧠 Projekto kontekstas