from pathlib import Path import re, zipfile, json, os src_path = Path("/mnt/data/agem_tool.html") html = src_path.read_text(encoding="utf-8") # --- Apply modifications (same as before) --- pattern = r'([\s\S]*?[\s\S]*?\s*
)' m = re.search(pattern, html) if not m: raise ValueError("Comparer table block not found") dash_html = r"""

Dashboard: koszt całkowity na hektar

Podsumowanie dla porównywanych nawozów: dawka, koszt produktu, koszt aplikacji i koszt łączny (PLN/ha).

Najniższy koszt całkowity (PLN/ha)
Brak danych
Nawóz Dawka (kg/ha) Koszt produktu (PLN/ha) Koszt aplikacji (PLN/ha) Koszt łączny (PLN/ha)
Wprowadź dane i kliknij „Oblicz” dla nawozów.
Jak liczymy: koszt produktu/ha = (cena PLN/t ÷ 1000) × dawka kg/ha. Koszt łączny/ha = koszt produktu/ha + koszt aplikacji/ha.
""" # Avoid duplicate injection if user reruns if "cmpDashBody" not in html: html = html[:m.start()] + m.group(1) + "\n" + dash_html + html[m.end():] # Extend cmpRead only if not already extended if "const costPerKgProduct = c.value;" in html and "productCostHa" not in html: html = html.replace( " const costPerKgProduct = c.value;", " const costPerKgProduct = c.value;\n const baseCostPerKg = priceT / 1000.0;\n const appCostHa = (Number.isNaN(appHa) ? 0 : appHa);\n const doseKgHa = dose;\n const productCostHa = baseCostPerKg * doseKgHa;\n const totalCostHa = productCostHa + appCostHa;" ) # Update return object html = html.replace( " return {ok:true, name, type, unit, costs};", " return {ok:true, name, type, unit, costs, baseCostPerKg, appCostHa, doseKgHa, productCostHa, totalCostHa};" ) # Early no-data return patch html = html.replace( '$("#cmpVerdict").textContent = "Brak danych";\n $("#cmpVerdict").className = "badge warn";\n return;', '$("#cmpVerdict").textContent = "Brak danych";\n $("#cmpVerdict").className = "badge warn";\n const bestEl = $("#cmpBestTotal");\n if (bestEl){ bestEl.textContent = "Brak danych"; bestEl.className = "badge warn"; }\n const db0 = $("#cmpDashBody");\n if (db0) db0.innerHTML = `Wprowadź dane i kliknij „Oblicz” dla nawozów.`;\n return;' ) # Add helper cmpRenderDashboard if not present if "function cmpRenderDashboard()" not in html: inject_point = "function cmpRender(){" if inject_point not in html: raise ValueError("cmpRender function not found") helper = r""" function cmpRenderDashboard(){ const db = $("#cmpDashBody"); const bestEl = $("#cmpBestTotal"); if (!db || !bestEl) return; db.innerHTML = ""; const items = CMP.items.filter(x=>x && x.ok); if (items.length === 0){ db.innerHTML = `Wprowadź dane i kliknij „Oblicz” dla nawozów.`; bestEl.textContent = "Brak danych"; bestEl.className = "badge warn"; return; } let best = null; items.forEach(it=>{ const tr = document.createElement("tr"); tr.innerHTML = ` ${it.name} ${fmt(it.doseKgHa,0)} ${fmt(it.productCostHa,0)} ${fmt(it.appCostHa,0)} ${fmt(it.totalCostHa,0)} `; db.appendChild(tr); if (best===null || it.totalCostHa < best.totalCostHa) best = it; }); bestEl.textContent = `${best.name} (${fmt(best.totalCostHa,0)} PLN/ha)`; bestEl.className = "badge ok"; } """ html = html.replace(inject_point, helper + "\n" + inject_point, 1) # Ensure cmpRender calls cmpRenderDashboard in warn and ok branches warn_block_pat = r'if \(candidates\.length < 2\)\{\n\s*\$\("#cmpVerdict"\)\.textContent = "Oblicz co najmniej 2 nawozy \(z danym parametrem\)";\n\s*\$\("#cmpVerdict"\)\.className = "badge warn";\n\s*return;\n\s*\}' if re.search(warn_block_pat, html): html = re.sub( warn_block_pat, 'if (candidates.length < 2){\n $("#cmpVerdict").textContent = "Oblicz co najmniej 2 nawozy (z danym parametrem)";\n $("#cmpVerdict").className = "badge warn";\n cmpRenderDashboard();\n return;\n }', html ) ok_set_point = '$("#cmpVerdict").className = "badge ok";' if ok_set_point in html: # call dashboard right after verdict OK if not already called nearby if "cmpRenderDashboard();" not in html.split(ok_set_point,1)[1][:120]: html = html.replace(ok_set_point, ok_set_point + "\n cmpRenderDashboard();", 1) # --- Write to new file (permission safe) --- out_path = Path("/mnt/data/agem_tool_updated.html") out_path.write_text(html, encoding="utf-8") # Also update PWA package as separate zip (optional) pwa_out = Path("/mnt/data/agem_tool_pwa_updated.zip") # Build minimal PWA folder using existing pwa zip if present; else just create one with index + existing assets if available base_dir = Path("/mnt/data/agem_tool_pwa") if base_dir.exists(): # update index in a temp copy directory tmp = Path("/mnt/data/agem_tool_pwa_updated") if tmp.exists(): import shutil; shutil.rmtree(tmp) import shutil shutil.copytree(base_dir, tmp) (tmp/"index.html").write_text(html, encoding="utf-8") with zipfile.ZipFile(pwa_out, "w", zipfile.ZIP_DEFLATED) as z: for fp in tmp.rglob("*"): z.write(fp, fp.relative_to(tmp)) # cleanup not necessary else: with zipfile.ZipFile(pwa_out, "w", zipfile.ZIP_DEFLATED) as z: z.writestr("index.html", html) (str(out_path), str(pwa_out))
Ag'em tool - Kalkulator śladu węglowego - kiszonka z kukurydzy (PL, uproszczony)

Ag'em Tool - Kalkulator śladu węglowego - kiszonka z kukurydzy (PL, uproszczony)

Zakres: „od pola do silosu” (nawozy + operacje + zbiór/transport + zakiszanie). N₂O z gleby: IPCC Tier 1 (domyślne wartości edytowalne).
Uwaga: to narzędzie jest uproszczeniem MRV/LCA. Do raportowania formalnego (np. PEF, audyty Scope 3) zwykle potrzebna jest walidacja współczynników, danych i granic systemu.

Dane wejściowe

System uprawy nowy moduł
Moduł ustawia pole „Zużycie ON – uprawa i zabiegi (l/ha)” tylko gdy włączony jest tryb automatyczny.
Automatycznie ustaw paliwo dla uprawy i zabiegów
Wybierz system, aby zobaczyć rekomendację.
Rekomendacje to wartości robocze (typowe zakresy dla PL) pomocne, gdy nie ma danych z telemetrii / ewidencji paliwa. Jeśli masz dane rzeczywiste, wybierz „Ręcznie” lub odznacz tryb automatyczny.
Nawożenie (na 1 ha)
Uwaga: wartość zależy od technologii produkcji i bazy LCA. Edytuj wg przyjętego standardu.
W tym uproszczeniu: emisje N₂O liczone są od całkowitego N wniesionego (mineralny + organiczny). Emisje związane z produkcją nawozów dotyczą tylko N mineralnego (dla obornika/gnojowicy zwykle raportuje się emisje w ramach systemu zwierzęcego - to zależy od granic).
Operacje, zbiór, transport i zakiszanie
Prosty parametr: jeśli masz lepsze dane (l/ha), użyj ich przez ustawienie transportu na 0 i dodanie do ON zbioru.
Założenia i współczynniki (IPCC Tier 1 i paliwo)
Domyślnie AR6 (100 lat) = 273. Jeśli w Twoim standardzie obowiązuje inna wartość, zmień.
Współczynniki dla ON i tworzyw są zależne od bazy (UE/PL) i standardu raportowania. Wartości domyślne są „robocze” do analiz porównawczych, nie jako finalny audyt.
Tool develped by Ag'em Agency.

Wyniki

Ślad węglowy (kg CO₂e / t FM)
Ślad węglowy (kg CO₂e / t SM)
Całkowita emisja (t CO₂e) dla areału
Produkcja netto kiszonki (po stratach)
t FM netto oraz t SM netto

Rozbicie emisji (na całość)

Kategoria kg CO₂e Udział
Brak danych – kliknij „Oblicz”.
Podgląd obliczeń (szczegóły)

    

KONTAKT

BAZA WIEDZY

OFERTA

O NAS

STRONA GŁÓWNA

ul. Kętrzyńska 11, 11-420 Srokowo

REGON 529448314

Privacy policy

kontakt@agem-agency.eu 

NIP 5214082848