{"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\/et\/ai-assistant-roi-calculator\/","title":{"rendered":"AI assistent Rio kalkulaator"},"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\">Investeeringutasuvuse kalkulaator <\/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>See kalkulaator hindab, kui palju aega ja raha v\u00f5iks teie organisatsioon s\u00e4\u00e4sta, kui kasutaksite klienditoe pakkumiseks tehisaruassistenti.<\/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\/et\/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\">V\u00f5tke meiega \u00fchendust<\/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\/et\/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\">Tutvuge AI abimehega<\/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        Selle kalkulaatori t\u00f6\u00f6tamiseks peab JavaScript olema lubatud.\r\n    <\/div>\r\n<\/noscript>\r\n<main class=\"wrapper\">\r\n    <!-- Inputs -->\r\n    <section class=\"card\">\r\n        <h2>Sisendid<\/h2>\r\n        <div class=\"sub\">K\u00f5ik v\u00e4\u00e4rtused on t\u00e4isarvud. Protsendiliugurid ulatuvad kuni 100%-ni.<\/div>\r\n\r\n        <form id=\"calc-form\" autocomplete=\"off\" novalidate action=\"\">\r\n            <div class=\"field\"\r\n             title=\"Tehisaruassistendi aastane kogukulu: arendustasu + tellimus, mis teisendatakse aastaseks kogukuluks. Need numbrid esitab Tilde\">\r\n                <label for=\"AI_License_Cost_per_Year_EUR\">Tehisaruassistendi aastane kulu (eurodes) <\/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=\"Keskmine igan\u00e4dalane t\u00f6\u00f6aeg agendi kohta (nt 40 tundi).\">\r\n                <label for=\"Working_Hours_per_Week\">Agendi t\u00f6\u00f6tundide arv n\u00e4dalas<\/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=\"Mitu n\u00e4dalat aastas agendid tegelikult t\u00f6\u00f6tavad, kui j\u00e4tta v\u00e4lja p\u00fchad ja puhkused.\">\r\n                <label for=\"Working_Weeks_per_Year\">T\u00f6\u00f6n\u00e4dalate arv aastas<\/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=\"Keskmine \u00fches kuus t\u00f6\u00f6deldavate tugiteenusepiletite, vestluste, meilis\u00f5numite v\u00f5i k\u00f5nede arv.\">\r\n                <label for=\"Customer_Requests_per_Month\">Klienditaotluste arv kuus<\/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=\"Kui kaua aega kulutab agent \u00fche taotluse k\u00e4sitlemisele algusest l\u00f5puni, sh lugemine, vastamine, logimine ja lahendamine.\">\r\n                <label for=\"Avg_Minutes_per_Request\">Keskmine t\u00f6\u00f6tlemisaeg taotluse kohta (minutites)<\/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=\"\u00dche t\u00e4ist\u00f6\u00f6ajaga tugiteenuseagendi aastane brutopalk, enne t\u00f6\u00f6andja \u00fcldkulusid. Kui palgad on erinevad, kasutage keskmist v\u00e4\u00e4rtust.\">\r\n                <label for=\"Base_Salary_per_Agent_EUR\">Aastane p\u00f5hipalk agendi kohta (eurodes)<\/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=\"Muud kulud lisaks palgale, nt maksud, h\u00fcvitised, t\u00f6\u00f6riistad ja kontorikulud. T\u00fc\u00fcpilised vahemikud on 20\u201330% v\u00e4iksemate meeskondade puhul ja 40\u201360% suuremate ettev\u00f5tete puhul.\">\r\n                <label>T\u00f6\u00f6andja \u00fcldkulud\/lisakulud (%)  <\/label>\r\n                <div class=\"range-row\">\r\n                    <input id=\"Oncost_Percent_range\" type=\"range\" min=\"0\" max=\"100\" step=\"1\" aria-label=\"Liugur oncost protsent\"\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=\"Nende klienditaotluste protsent, mille lahendamisega saab tehisaruassistent hakkama ilma inimese sekkumiseta. Varajaste juurutuste puhul on see sageli umbes 10\u201335%, l\u00f5ppj\u00e4rgus seadistuste puhul v\u00f5ivad \u00fcletada 50%.\">\r\n                <label>T\u00e4ielikult tehisaru poolt lahendatud taotluste hulk (%) <\/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=\"Automaatlahendatud kiiruse liugur\"\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=\"Kui palju kiiremini t\u00f6\u00f6tlevad agendid \u00fclej\u00e4\u00e4nud taotlusi t\u00e4nu tehisarult saadavale lisatoele (mustandid, kokkuv\u00f5tted, teabe otsimine). Seadke v\u00e4\u00e4rtuseks 0, kui tehisaru ei aita agente muuga kui taotluse t\u00f6\u00f6tlemisega. Lihtsa abi puhul on see tavaliselt 5\u201310%, keerukate h\u00e4\u00e4lestuste puhul v\u00f5ib see aga ulatuda 15\u201330%-ni.\">\r\n                <label>Agendi t\u00f6\u00f6deldavatele taotlustele kuluva aja v\u00e4henemine (%)<\/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=\"Aja v\u00e4hendamine mitteautomaatsel liuguril\"\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=\"et\"\/><\/form>\r\n    <\/section>\r\n\r\n    <!-- Results -->\r\n    <aside class=\"card\">\r\n        <h2>Tulemused<\/h2>\r\n        <div class=\"sub\">Kui muudate sisendeid, v\u00e4rskendatakse tulemusi reaalajas.<\/div>\r\n\r\n        <table class=\"results-table\">\r\n            <thead>\r\n            <tr>\r\n                <th style=\"width:65%;\">M\u00f5\u00f5dik<\/th>\r\n                <th style=\"width:35%; text-align:right;\">V\u00e4\u00e4rtus:<\/th>\r\n            <\/tr>\r\n            <\/thead>\r\n            <tbody>\r\n            <tr>\r\n                <td class=\"metric\">Praegune aastane tugiteenusekulu (eurodes)<\/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\">Iga-aastane tugiteenusekulu koos tehisaruga (eurodes)<\/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\">Brutos\u00e4\u00e4st aastas (eurodes)<\/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\">Netos\u00e4\u00e4st aastas (eurodes)<\/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\">Investeeringutasuvus (ROI)<\/td>\r\n                <td class=\"value\" id=\"out_ROI_Percent\">0%<\/td>\r\n            <\/tr>\r\n            <tr>\r\n                <td class=\"metric\">Tasuvusperiood (kuudes) <\/td>\r\n                <td class=\"value\" id=\"out_Payback_Months\">\u2014<\/td>\r\n            <\/tr>\r\n            <tr>\r\n                <td class=\"metric\">Aastas salvestatud aeg (tundides)<\/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\">S\u00e4\u00e4stetud t\u00e4ist\u00f6\u00f6aja ekvivalendid<\/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>Tulemused on ainult soovituslikud ega kajasta garanteeritud s\u00e4\u00e4ste v\u00f5i tulemusi.<\/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>ROI kalkulaator See kalkulaator hindab, kui palju aega ja raha v\u00f5iks teie organisatsioon klienditoe AI assistendi abil s\u00e4\u00e4sta. V\u00f5tke meiega \u00fchendust Uuri AI abimeest See kalkulaator vajab t\u00f6\u00f6tamiseks lubatud JavaScripti. Sisendid K\u00f5ik v\u00e4\u00e4rtused on t\u00e4isarvud. Liugurite protsent max 100 juures. AI assistendi aastane kulu (eurodes) agendi t\u00f6\u00f6tunnid n\u00e4dalas t\u00f6\u00f6 [\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\/et\/wp-json\/wp\/v2\/pages\/22061","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tilde.ai\/et\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tilde.ai\/et\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tilde.ai\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tilde.ai\/et\/wp-json\/wp\/v2\/comments?post=22061"}],"version-history":[{"count":0,"href":"https:\/\/tilde.ai\/et\/wp-json\/wp\/v2\/pages\/22061\/revisions"}],"wp:attachment":[{"href":"https:\/\/tilde.ai\/et\/wp-json\/wp\/v2\/media?parent=22061"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}