{"id":22061,"date":"2025-12-01T18:10:14","date_gmt":"2025-12-01T16:10:14","guid":{"rendered":"https:\/\/tilde.ai\/?page_id=22061"},"modified":"2026-04-24T13:21:18","modified_gmt":"2026-04-24T11:21:18","slug":"ai-assistant-roi-calculator","status":"publish","type":"page","link":"https:\/\/tilde.ai\/lt\/ai-assistant-roi-calculator\/","title":{"rendered":"AI asistento Rio kalkuliatorius"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"22061\" class=\"elementor elementor-22061\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-24a074d e-flex e-con-boxed e-con e-parent\" data-id=\"24a074d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b1825e3 elementor-widget elementor-widget-heading\" data-id=\"b1825e3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">IG skai\u010diuotuvas <\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-da51fe9 elementor-widget elementor-widget-text-editor\" data-id=\"da51fe9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>\u0160is skai\u010diuotuvas apskai\u010diuoja, kiek laiko ir pinig\u0173 j\u016bs\u0173 organizacija sutaupyt\u0173 naudodama DI asistent\u0105 klient\u0173 aptarnavimui.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-292a25c e-con-full e-flex e-con e-child\" data-id=\"292a25c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-21d15a4 elementor-widget__width-auto elementor-widget elementor-widget-button\" data-id=\"21d15a4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/tilde.ai\/lt\/contact-us\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Susisiekite su mumis<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c156bc6 elementor-align-center elementor-widget__width-auto elementor-widget elementor-widget-button\" data-id=\"c156bc6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/tilde.ai\/lt\/ai-chatbots\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Nar\u0161yti AI asistent\u0105<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-39e2d38 e-flex e-con-boxed e-con e-parent\" data-id=\"39e2d38\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0c561c7 elementor-widget elementor-widget-html\" data-id=\"0c561c7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\r\n    <style>\r\n    .elementor-kit-8 label {\r\n    color: #ffff;\r\n    font-size: 0.9rem;\r\n    font-weight: 500;\r\n    letter-spacing: -0.1px;\r\n}\r\n    .elementor-kit-8 h2 {\r\n    color: #ffff;\r\n\r\n}\r\n.results-table tbody td {\r\n    padding: 12px;\r\n    color: #ffff;\r\n    border-bottom: 1px solid var(--line);\r\n    font-size: 14px;\r\n}\r\n.elementor-kit-8 input:not([type=\"button\"]):not([type=\"submit\"]) {\r\n      accent-color: #4ca85a;\r\n}\r\n.card{\r\n    background: #353637;\r\n}\r\n\r\n\r\n\r\n    <\/style>\r\n\r\n\r\n<noscript>\r\n    <div style=\"padding:12px; background:#111318; border:1px solid #1f2430; border-radius:8px; margin-bottom:12px;\">\r\n        Kad veikt\u0173 \u0161is skai\u010diuotuvas, turi b\u016bti \u012fgalintas \u201eJavaScript\u201c.\r\n    <\/div>\r\n<\/noscript>\r\n<main class=\"wrapper\">\r\n    <!-- Inputs -->\r\n    <section class=\"card\">\r\n        <h2>\u012evestys<\/h2>\r\n        <div class=\"sub\">Visos reik\u0161m\u0117s turi b\u016bti sveikieji skai\u010diai. Procent\u0173 slankikliai siekia iki 100 %.<\/div>\r\n\r\n        <form id=\"calc-form\" autocomplete=\"off\" novalidate action=\"\">\r\n            <div class=\"field\"\r\n             title=\"Bendros metin\u0117s i\u0161laidos DI asistentui: k\u016brimo mokestis + prenumerata, konvertuota \u012f bendr\u0105 metin\u0119 sum\u0105. \u0160iuos skai\u010dius pateik\u0117 \u201eTilde\u201c.\">\r\n                <label for=\"AI_License_Cost_per_Year_EUR\">Metin\u0117s i\u0161laidos DI asistentui (EUR) <\/label>\r\n                <input id=\"AI_License_Cost_per_Year_EUR\" name=\"AI_License_Cost_per_Year_EUR\" type=\"number\"\r\n                       inputmode=\"numeric\" min=\"0\" step=\"1\" value=\"55000\" required\r\n data-field=\"AI_License_Cost_per_Year_EUR\" \/>\r\n            <\/div>\r\n         \r\n\r\n            <div class=\"field\" title=\"Vidutinis vieno agento darbo laikas per savait\u0119 (pvz., 40 valand\u0173).\">\r\n                <label for=\"Working_Hours_per_Week\">Agent\u0173 darbo valand\u0173 per savait\u0119 skai\u010dius<\/label>\r\n                <input id=\"Working_Hours_per_Week\" name=\"Working_Hours_per_Week\" type=\"number\"\r\n                       inputmode=\"numeric\" min=\"0\" step=\"1\" value=\"40\" required\r\n data-field=\"Working_Hours_per_Week\" \/>\r\n            <\/div>\r\n\r\n            <div class=\"field\" title=\"Kiek savai\u010di\u0173 per metus, i\u0161skyrus \u0161ventes ir atostogas, dirba agentai.\">\r\n                <label for=\"Working_Weeks_per_Year\">Darbo savai\u010di\u0173 per metus skai\u010dius<\/label>\r\n                <input id=\"Working_Weeks_per_Year\" name=\"Working_Weeks_per_Year\" type=\"number\"\r\n                       inputmode=\"numeric\" min=\"0\" step=\"1\" value=\"52\" required\r\n data-field=\"Working_Weeks_per_Year\" \/>\r\n            <\/div>\r\n\r\n            <div class=\"field\" title=\"Vidutinis per m\u0117nes\u012f gaunam\u0173 u\u017eklaus\u0173, pokalbi\u0173, el. lai\u0161k\u0173 ar skambu\u010di\u0173 skai\u010dius.\">\r\n                <label for=\"Customer_Requests_per_Month\">Klient\u0173 u\u017eklaus\u0173 per m\u0117nes\u012f skai\u010dius<\/label>\r\n                <input id=\"Customer_Requests_per_Month\" name=\"Customer_Requests_per_Month\" type=\"number\"\r\n                       inputmode=\"numeric\" min=\"0\" step=\"1\" value=\"65000\" required\r\n data-field=\"Customer_Requests_per_Month\" \/>\r\n            <\/div>\r\n\r\n            <div class=\"field\" title=\"Kiek laiko agentas praleid\u017eia apdorodamas vien\u0105 u\u017eklaus\u0105 nuo prad\u017eios iki pabaigos, \u012fskaitant skaitym\u0105, atsakym\u0105, registravim\u0105 ir sprendim\u0105.\">\r\n                <label for=\"Avg_Minutes_per_Request\">Vidutinis u\u017eklausos apdorojimo laikas (minut\u0117mis)<\/label>\r\n                <input id=\"Avg_Minutes_per_Request\" name=\"Avg_Minutes_per_Request\" type=\"number\"\r\n                       inputmode=\"numeric\" min=\"0\" step=\"1\" value=\"5\" required\r\n data-field=\"Avg_Minutes_per_Request\" \/>\r\n            <\/div>\r\n\r\n            <div class=\"field\" title=\"Vieno vis\u0105 darbo dien\u0105 dirban\u010dio pagalbos agento metinis atlyginimas bruto, neatskai\u010dius darbdavio prid\u0117tini\u0173 i\u0161laid\u0173. Nurodykite vidurk\u012f, jei atlyginimai skiriasi.\">\r\n                <label for=\"Base_Salary_per_Agent_EUR\">Metinis bazinis vieno darbuotojo atlyginimas (EUR)<\/label>\r\n                <input id=\"Base_Salary_per_Agent_EUR\" name=\"Base_Salary_per_Agent_EUR\" type=\"number\"\r\n                       inputmode=\"numeric\" min=\"0\" step=\"1\" value=\"20400\" required\r\n data-field=\"Base_Salary_per_Agent_EUR\" \/>\r\n            <\/div>\r\n\r\n            <div class=\"field\" style=\"grid-column: 1 \/ -1;\" title=\"Papildomos i\u0161laidos, pridedamos prie atlyginimo, pvz., mokes\u010diai, premijos, darbo \u012franki\u0173 ir biuro i\u0161laidos. \u012eprastas ma\u017eesni\u0173 komand\u0173 diapazonas yra 20\u201330\u202f%, o didesni\u0173 \u012fmoni\u0173 \u2013 40\u201360\u202f%.\">\r\n                <label>Darbdavio prid\u0117tin\u0117s i\u0161laidos \/ ka\u0161tai (%)  <\/label>\r\n                <div class=\"range-row\">\r\n                    <input id=\"Oncost_Percent_range\" type=\"range\" min=\"0\" max=\"100\" step=\"1\" aria-label=\"Slankiklis Oncost procentais\"\r\n                           value=\"15\" data-field=\"Oncost_Percent\" data-role=\"range\" \/>\r\n                    <input id=\"Oncost_Percent\" name=\"Oncost_Percent\" type=\"number\" inputmode=\"numeric\"\r\n                           min=\"0\" max=\"100\" step=\"1\" value=\"15\" required\r\n data-field=\"Oncost_Percent\" data-role=\"number\" \/>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"field\" style=\"grid-column: 1 \/ -1;\" title=\"Klient\u0173 u\u017eklaus\u0173, kurias DI asistentas gali apdoroti be \u017emogaus \u012fsiki\u0161imo, procentas. Naudojant pradines DI asistento versijas skai\u010dius da\u017enai sudaro apie 10\u201335 %, o naudojant patobulintas konfig\u016bracijas gali vir\u0161yti 50\u202f%.\">\r\n                <label>Agent\u0173 sutaupytas laikas tvarkant u\u017eklausas (%) <\/label>\r\n                <div class=\"range-row\">\r\n                    <input id=\"Auto_Resolved_Rate_range\" type=\"range\" min=\"0\" max=\"100\" step=\"1\" aria-label=\"Automati\u0161kai i\u0161spr\u0119sto tarifo slankiklis\"\r\n                           value=\"55\" data-field=\"Auto_Resolved_Rate\" data-role=\"range\" \/>\r\n                    <input id=\"Auto_Resolved_Rate\" name=\"Auto_Resolved_Rate\" type=\"number\" inputmode=\"numeric\"\r\n                           min=\"0\" max=\"100\" step=\"1\" value=\"55\" required\r\n data-field=\"Auto_Resolved_Rate\" data-role=\"number\" \/>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"field\" style=\"grid-column: 1 \/ -1;\" title=\"Kiek grei\u010diau agentai sutvarko likusias u\u017eklausas padedami DI (juodra\u0161\u010diai, santraukos, informacijos ap\u017evalgos). Nustatykite 0, jei DI pagalba agentams apsiriboja tik u\u017eklaus\u0173 tvarkymu. Nedidel\u0117 pagalba paprastai vertinama kaip 5\u201310\u202f%, o taikant i\u0161pl\u0117stines konfig\u016bracijas gali siekti 15\u201330\u202f%.\">\r\n                <label>Agento tvarkom\u0173 u\u017eklaus\u0173 laiko sutrumpinimas (%)<\/label>\r\n                <div class=\"range-row\">\r\n                    <input id=\"Time_Reduction_on_Non_Auto_range\" type=\"range\" min=\"0\" max=\"100\" step=\"1\" aria-label=\"Laiko ma\u017einimas ne automatiniame slankiklyje\"\r\n                           value=\"5\" data-field=\"Time_Reduction_on_Non_Auto\" data-role=\"range\" \/>\r\n                    <input id=\"Time_Reduction_on_Non_Auto\" name=\"Time_Reduction_on_Non_Auto\" type=\"number\" inputmode=\"numeric\"\r\n                           min=\"0\" max=\"100\" step=\"1\" value=\"5\" required\r\n data-field=\"Time_Reduction_on_Non_Auto\" data-role=\"number\" \/>\r\n                <\/div>\r\n            <\/div>\r\n\r\n        <input type=\"hidden\" name=\"twt-form-language\" value=\"lt\"\/><\/form>\r\n    <\/section>\r\n\r\n    <!-- Results -->\r\n    <aside class=\"card\">\r\n        <h2>Rezultatai<\/h2>\r\n        <div class=\"sub\">Kai pakei\u010diate \u012fvedamas reik\u0161mes, rezultatai atnaujinami.<\/div>\r\n\r\n        <table class=\"results-table\">\r\n            <thead>\r\n            <tr>\r\n                <th style=\"width:65%;\">Metrika<\/th>\r\n                <th style=\"width:35%; text-align:right;\">Reik\u0161m\u0117:<\/th>\r\n            <\/tr>\r\n            <\/thead>\r\n            <tbody>\r\n            <tr>\r\n                <td class=\"metric\">Dabartin\u0117s metin\u0117s pagalbos i\u0161laidos (EUR)<\/td>\r\n                <td class=\"value\" id=\"out_Current_Annual_Cost_EUR\">\u20ac0<\/td>\r\n            <\/tr>\r\n            <tr>\r\n                <td class=\"metric\">Metin\u0117s pagalbos i\u0161laidos su DI (EUR)<\/td>\r\n                <td class=\"value\" id=\"out_New_Annual_Cost_EUR\">\u20ac0<\/td>\r\n            <\/tr>\r\n            <tr>\r\n                <td class=\"metric\">Sutaupoma per metus bruto (EUR)<\/td>\r\n                <td class=\"value good\" id=\"out_Gross_Savings_EUR_per_Year\">\u20ac0<\/td>\r\n            <\/tr>\r\n            <tr>\r\n                <td class=\"metric\">Sutaupoma per metus neto (EUR)<\/td>\r\n                <td class=\"value good\" id=\"out_Net_Savings_EUR_per_Year\">\u20ac0<\/td>\r\n            <\/tr>\r\n            <tr>\r\n                <td class=\"metric\">Investicij\u0173 gr\u0105\u017ea (IG)<\/td>\r\n                <td class=\"value\" id=\"out_ROI_Percent\">0%<\/td>\r\n            <\/tr>\r\n            <tr>\r\n                <td class=\"metric\">Atsipirkimo laikotarpis (m\u0117nesiais) <\/td>\r\n                <td class=\"value\" id=\"out_Payback_Months\">\u2014<\/td>\r\n            <\/tr>\r\n            <tr>\r\n                <td class=\"metric\">Sutaupytas laikas per metus (valandomis)<\/td>\r\n                <td class=\"value\" id=\"out_Time_Saved_Hours_per_Year\">0<\/td>\r\n            <\/tr>\r\n            <tr>\r\n                <td class=\"metric\">Sutaupyti visos darbo dienos ekvivalentai (VDDE)<\/td>\r\n                <td class=\"value\" id=\"out_FTE_Saved\">0<\/td>\r\n            <\/tr>\r\n            <\/tbody>\r\n        <\/table>\r\n    <\/aside>\r\n<\/main>\r\n<div id=\"results\" aria-live=\"polite\" hidden><\/div>\r\n\r\n\r\n\r\n<script>\r\n\/* =========================\r\n   Pure config + helpers\r\n   ========================= *\/\r\n\r\nconst FIELD_CONSTRAINTS = {\r\n  Number_of_Agents: {min: 1, max: null},\r\n  Working_Hours_per_Week: {min: 0, max: null},\r\n  Working_Weeks_per_Year: {min: 0, max: 52\r\n  },\r\n  Customer_Requests_per_Month: {min: 0, max: null},\r\n  Avg_Minutes_per_Request: {min: 0, max: null},\r\n  Base_Salary_per_Agent_EUR: {min: 0, max: null},\r\n  Oncost_Percent: {min: 0, max: 100},\r\n  Auto_Resolved_Rate: {min: 0, max: 99.99},\r\n  Time_Reduction_on_Non_Auto: {min: 0, max: 100},\r\n  AI_License_Cost_per_Year_EUR: {min: 0, max: null},\r\n};\r\n\r\nfunction clamp(n, min, max) {\r\n  if (n < min) return min;\r\n  if (max !== null && n > max) return max;\r\n  return n;\r\n}\r\n\r\nfunction sanitizeValue(raw, {min, max}) {\r\n  if (raw === \"\" || raw === null || raw === undefined) return 0;\r\n\r\n  let n = Number(raw);\r\n  if (!Number.isFinite(n)) n = 0;\r\n\r\n  n = Math.floor(n);\r\n  n = clamp(n, min, max);\r\n\r\n  return n;\r\n}\r\n\r\nfunction getRepresentativeInput(formEl, fieldName) {\r\n  return formEl.querySelector(\r\n    `[data-field=\"${fieldName}\"][data-role=\"number\"], [data-field=\"${fieldName}\"]:not([data-role])`\r\n  );\r\n}\r\n\r\nfunction setFieldValue(formEl, fieldName, value) {\r\n  const inputs = formEl.querySelectorAll(`[data-field=\"${fieldName}\"]`);\r\n  inputs.forEach((el) => {\r\n    if (String(el.value) !== String(value)) {\r\n      el.value = value;\r\n    }\r\n  });\r\n}\r\n\r\nfunction getSanitizedValuesFromForm(formEl) {\r\n  const values = {};\r\n\r\n  for (const fieldName of Object.keys(FIELD_CONSTRAINTS)) {\r\n    const input = getRepresentativeInput(formEl, fieldName);\r\n    const raw = input ? input.value : \"0\";\r\n\r\n    const sanitized = sanitizeValue(raw, FIELD_CONSTRAINTS[fieldName]);\r\n    values[fieldName] = sanitized;\r\n\r\n    setFieldValue(formEl, fieldName, sanitized);\r\n  }\r\n\r\n  return values;\r\n}\r\n\r\n\/* =========================\r\n   Formulas\r\n   ========================= *\/\r\n\r\nfunction computeResults(values) {\r\n  const Annual_Working_Hours =\r\n    values.Working_Hours_per_Week * values.Working_Weeks_per_Year;\r\n\r\n  const Fully_Loaded_Salary =\r\n    values.Base_Salary_per_Agent_EUR * (1 + values.Oncost_Percent \/ 100);\r\n\r\n  const Hourly_Cost =\r\n    Annual_Working_Hours === 0 ? 0 : Fully_Loaded_Salary \/ Annual_Working_Hours;\r\n\r\n  const Requests_per_Year =\r\n    values.Customer_Requests_per_Month * 12;\r\n\r\n  const Hours_per_Request =\r\n    values.Avg_Minutes_per_Request \/ 60;\r\n\r\n  const Current_Handling_Hours =\r\n    Requests_per_Year * Hours_per_Request;\r\n\r\n  const Current_Annual_Cost_EUR =\r\n    Current_Handling_Hours * Hourly_Cost;\r\n\r\n  const AutoResolved_Requests =\r\n    Requests_per_Year * values.Auto_Resolved_Rate \/ 100;\r\n\r\n  const NonAuto_Requests =\r\n    Requests_per_Year - AutoResolved_Requests;\r\n\r\n  const New_Hours_for_NonAuto =\r\n    NonAuto_Requests *\r\n    (values.Avg_Minutes_per_Request * (1 - values.Time_Reduction_on_Non_Auto \/ 100)) \/\r\n    60;\r\n\r\n  const New_Total_Handling_Hours =\r\n    New_Hours_for_NonAuto;\r\n\r\n  const New_Annual_Cost_EUR =\r\n    New_Total_Handling_Hours * Hourly_Cost;\r\n\r\n  const Time_Saved_Hours_per_Year =\r\n    New_Total_Handling_Hours * Hourly_Cost;\r\n\r\n  const FTE_Saved =\r\n    Annual_Working_Hours === 0 ? 0 : Time_Saved_Hours_per_Year \/ Annual_Working_Hours;\r\n\r\n  const Gross_Savings_EUR_per_Year =\r\n    Current_Annual_Cost_EUR - New_Annual_Cost_EUR;\r\n\r\n  const Net_Savings_EUR_per_Year =\r\n    Gross_Savings_EUR_per_Year - values.AI_License_Cost_per_Year_EUR;\r\n\r\n  const ROI_Percent =\r\n    values.AI_License_Cost_per_Year_EUR === 0\r\n      ? 0\r\n      : Net_Savings_EUR_per_Year \/ values.AI_License_Cost_per_Year_EUR;\r\n\r\n  const Payback_Months =\r\n    Gross_Savings_EUR_per_Year === 0\r\n      ? \"\"\r\n      : 12 * values.AI_License_Cost_per_Year_EUR \/ Gross_Savings_EUR_per_Year;\r\n\r\n  return {\r\n    Annual_Working_Hours,\r\n    Fully_Loaded_Salary,\r\n    Hourly_Cost,\r\n    Requests_per_Year,\r\n    Hours_per_Request,\r\n    Current_Handling_Hours,\r\n    Current_Annual_Cost_EUR,\r\n    AutoResolved_Requests,\r\n    NonAuto_Requests,\r\n    New_Hours_for_NonAuto,\r\n    New_Total_Handling_Hours,\r\n    New_Annual_Cost_EUR,\r\n    Time_Saved_Hours_per_Year,\r\n    FTE_Saved,\r\n    Gross_Savings_EUR_per_Year,\r\n    Net_Savings_EUR_per_Year,\r\n    ROI_Percent,\r\n    Payback_Months,\r\n  };\r\n}\r\n\r\n\/* =========================\r\n   Class: DOM orchestration\r\n   ========================= *\/\r\n\r\nclass LiveCalculator {\r\n  constructor({formId, resultsId, onResults}) {\r\n    this.formEl = document.getElementById(formId);\r\n    this.resultsEl = document.getElementById(resultsId);\r\n    this.onResults = typeof onResults === \"function\" ? onResults : null;\r\n\r\n    if (!this.formEl) throw new Error(`Form element #${formId} not found`);\r\n    if (!this.resultsEl) throw new Error(`Results element #${resultsId} not found`);\r\n\r\n    this.handleInput = this.handleInput.bind(this);\r\n    this.formEl.addEventListener(\"input\", this.handleInput);\r\n\r\n    this.recalculate();\r\n  }\r\n\r\n  getValues() {\r\n    return getSanitizedValuesFromForm(this.formEl);\r\n  }\r\n\r\n  setValues(partialValues = {}) {\r\n    for (const [fieldName, rawValue] of Object.entries(partialValues)) {\r\n      if (!FIELD_CONSTRAINTS[fieldName]) continue;\r\n\r\n      const sanitized = sanitizeValue(rawValue, FIELD_CONSTRAINTS[fieldName]);\r\n      setFieldValue(this.formEl, fieldName, sanitized);\r\n    }\r\n\r\n    this.recalculate();\r\n  }\r\n\r\n  recalculate() {\r\n    const values = this.getValues();\r\n    const results = computeResults(values);\r\n\r\n    this.render(results);\r\n\r\n    if (this.onResults) {\r\n      this.onResults(results, values);\r\n    }\r\n  }\r\n\r\n  handleInput(e) {\r\n    const target = e.target;\r\n    const fieldName = target.getAttribute(\"data-field\");\r\n    if (!fieldName || !FIELD_CONSTRAINTS[fieldName]) return;\r\n\r\n    const sanitized = sanitizeValue(target.value, FIELD_CONSTRAINTS[fieldName]);\r\n    setFieldValue(this.formEl, fieldName, sanitized);\r\n\r\n    this.recalculate();\r\n  }\r\n\r\n  render(results) {\r\n    const eur = (n) =>\r\n      \"\u20ac\" + Math.round(n).toLocaleString(\"en-US\");\r\n\r\n    const num = (n, digits = 0) =>\r\n      Number.isFinite(n)\r\n        ? n.toLocaleString(\"en-US\", { maximumFractionDigits: digits })\r\n        : \"0\";\r\n\r\n    const pct = (n, digits = 1) =>\r\n      num(n * 100, digits) + \"%\";\r\n\r\n    document.getElementById(\"out_Current_Annual_Cost_EUR\").textContent =\r\n      eur(results.Current_Annual_Cost_EUR);\r\n\r\n    document.getElementById(\"out_New_Annual_Cost_EUR\").textContent =\r\n      eur(results.New_Annual_Cost_EUR);\r\n\r\n    document.getElementById(\"out_Gross_Savings_EUR_per_Year\").textContent =\r\n      eur(results.Gross_Savings_EUR_per_Year);\r\n\r\n    document.getElementById(\"out_Net_Savings_EUR_per_Year\").textContent =\r\n      eur(results.Net_Savings_EUR_per_Year);\r\n\r\n    document.getElementById(\"out_ROI_Percent\").textContent =\r\n      pct(results.ROI_Percent);\r\n\r\n    document.getElementById(\"out_Payback_Months\").textContent =\r\n      results.Payback_Months === \"\" ? \"\u2014\" : num(results.Payback_Months, 2);\r\n\r\n    document.getElementById(\"out_Time_Saved_Hours_per_Year\").textContent =\r\n      num(results.Time_Saved_Hours_per_Year, 2);\r\n\r\n    document.getElementById(\"out_FTE_Saved\").textContent =\r\n      num(results.FTE_Saved, 2);\r\n  }\r\n\r\n\r\n  destroy() {\r\n    this.formEl.removeEventListener(\"input\", this.handleInput);\r\n  }\r\n}\r\n\r\n\/* =========================\r\n   Init on DOM ready\r\n   ========================= *\/\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", () => {\r\n  window.calculator = new LiveCalculator({\r\n    formId: \"calc-form\",\r\n    resultsId: \"results\",\r\n  });\r\n});\r\n\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-672685c e-flex e-con-boxed e-con e-parent\" data-id=\"672685c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-963f5f9 elementor-widget elementor-widget-text-editor\" data-id=\"963f5f9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Rezultatai yra tik orientaciniai ir n\u0117ra sutaupom\u0173 l\u0117\u0161\u0173 ar rezultat\u0173 garantija.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>IG skai\u010diuotuvas \u0160is skai\u010diuotuvas apskai\u010diuoja, kiek laiko ir pinig\u0173 j\u016bs\u0173 organizacija gal\u0117t\u0173 sutaupyti naudodama AI asistent\u0105 klient\u0173 palaikymui. Susisiekite su mumis Nar\u0161ymo AI asistentu \u0160iam skai\u010diuotuvui reikia \u012fgalinti JavaScript, kad jis veikt\u0173. \u012evestys Visos reik\u0161m\u0117s yra sveikieji skai\u010diai. Slankikli\u0173 procentas ne didesnis kaip 100. AI pad\u0117j\u0117jo metin\u0117s i\u0161laidos (EUR) agento darbo valandos per savait\u0119 [\u2026]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-22061","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tilde.ai\/lt\/wp-json\/wp\/v2\/pages\/22061","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tilde.ai\/lt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tilde.ai\/lt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tilde.ai\/lt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tilde.ai\/lt\/wp-json\/wp\/v2\/comments?post=22061"}],"version-history":[{"count":0,"href":"https:\/\/tilde.ai\/lt\/wp-json\/wp\/v2\/pages\/22061\/revisions"}],"wp:attachment":[{"href":"https:\/\/tilde.ai\/lt\/wp-json\/wp\/v2\/media?parent=22061"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}