{"id":729,"date":"2026-01-06T13:57:34","date_gmt":"2026-01-06T13:57:34","guid":{"rendered":"https:\/\/theriver.ro\/?page_id=729"},"modified":"2026-02-02T13:55:57","modified_gmt":"2026-02-02T13:55:57","slug":"multumim","status":"publish","type":"page","link":"https:\/\/staging.theriver.ro\/en\/multumim\/","title":{"rendered":"Multumim"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"729\" class=\"elementor elementor-729\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-68dbdc20 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"68dbdc20\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-70014e27\" data-id=\"70014e27\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-265029b3 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"265029b3\" data-element_type=\"section\" data-settings=\"{&quot;animation&quot;:&quot;none&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-40a4ebe6\" data-id=\"40a4ebe6\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t<div class=\"elementor-element elementor-element-12a2b1e5 e-flex e-con-boxed e-con e-child\" data-id=\"12a2b1e5\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8b6ad0e elementor-widget elementor-widget-shortcode\" data-id=\"8b6ad0e\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><!-- templates\/booking-header3.html -->\n\n  <div class=\"db3-head\">\n    <div class=\"head-wrap\">\n\n<div id=\"db3-icon\" class=\"db3-icon is-hidden\" aria-hidden=\"true\"><\/div>\n      <h2 id=\"db3-title\">Verific\u0103m statusul pl\u0103\u021bii\u2026<\/h2>\n    <\/div>\n    <p id=\"db3-desc\">\n        Te rug\u0103m s\u0103 a\u0219tep\u021bi c\u00e2teva secunde. Dac\u0103 pagina nu se actualizeaz\u0103, po\u021bi \u00eencerca din nou.\n        Pentru \u00eentreb\u0103ri: <a href=\"mailto:chalet@theriver.ro\">chalet@theriver.ro<\/a>.\n      <\/p>\n  <\/div>\n  \n<div class=\"db3-wrap\" role=\"region\" aria-label=\"Confirmare rezervare\">\n\n\n  <div class=\"db3-list\">\n    <div class=\"db3-item\">\n      <span>ORDER ID<\/span>\n      <strong id=\"db3-order\">\u2014<\/strong>\n    <\/div>\n\n    <div class=\"db3-item\">\n      <span>CHECK-IN<\/span>\n      <strong id=\"db3-ci\">\u2014<\/strong>\n    <\/div>\n\n    <div class=\"db3-item\">\n      <span>CHECK-OUT<\/span>\n      <strong id=\"db3-co\">\u2014<\/strong>\n    <\/div>\n\n    <div class=\"db3-item\">\n      <span>NOP\u021aI<\/span>\n      <strong id=\"db3-nights\">\u2014<\/strong>\n    <\/div>\n\n    <div class=\"db3-item db3-total\">\n      <span>TOTAL<\/span>\n      <strong id=\"db3-total\">\u2014<\/strong>\n    <\/div>\n  <\/div>\n\n  <div class=\"db3-note\" id=\"db3-note\"><\/div>\n\n  <div class=\"db3-actions\">\n    <div class=\"db3-status\">\n      <span>Status<\/span>\n      <strong id=\"db3-status-text\">\u00cen verificare<\/strong>\n    <\/div>\n\n    <a class=\"db3-retry is-hidden\" id=\"db3-retry\" href=\"#\" aria-disabled=\"false\">\u00cencearc\u0103 din nou<\/a>\n    <a class=\"db3-home\" id=\"db3-home\" href=\"https:\/\/staging.theriver.ro\/en\/\">\u00cenapoi acas\u0103<\/a>\n  <\/div>\n<\/div>\n\n\n\n<script>\n(function(){\n  function qp(k){\n    try {\n      const u = new URL(window.location.href);\n      return u.searchParams.get(k) || '';\n    } catch(e) {\n      return '';\n    }\n  }\n\n  const orderId  = qp('orderId') || qp('orderID') || qp('order_id');\n  const ci       = qp('ci') || qp('checkin');\n  const co       = qp('co') || qp('checkout');\n  const nights   = qp('nights');\n  const total    = qp('total');\n  const currency = (qp('currency') || 'RON').toUpperCase();\n\n  const elIcon   = document.getElementById('db3-icon');\n  const elTitle  = document.getElementById('db3-title');\n  const elDesc   = document.getElementById('db3-desc');\n\n  const elOrder  = document.getElementById('db3-order');\n  const elCi     = document.getElementById('db3-ci');\n  const elCo     = document.getElementById('db3-co');\n  const elN      = document.getElementById('db3-nights');\n  const elT      = document.getElementById('db3-total');\n  const elNote   = document.getElementById('db3-note');\n\n  const elStatus = document.getElementById('db3-status-text');\n  const elRetry  = document.getElementById('db3-retry');\n\n  function fmtMoney(n){\n    const val = Number(n);\n    if (!Number.isFinite(val)) return '\u2014';\n    try {\n      return new Intl.NumberFormat('ro-RO', { maximumFractionDigits: 0 }).format(val) + ' ' + currency;\n    } catch(e){\n      return String(Math.round(val)).replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, '.') + ' ' + currency;\n    }\n  }\n\n  if (elOrder) elOrder.textContent = orderId || '\u2014';\n  if (elCi)    elCi.textContent    = ci || '\u2014';\n  if (elCo)    elCo.textContent    = co || '\u2014';\n  if (elN)     elN.textContent     = nights || '\u2014';\n  if (elT)     elT.textContent     = total ? fmtMoney(total) : '\u2014';\n\n  if (!orderId) {\n    if (elNote) elNote.textContent = 'Order ID lipse\u0219te din URL. Nu putem verifica statusul pl\u0103\u021bii.';\n  } else if (!ci || !co || !nights || !total) {\n    if (elNote) elNote.textContent = 'Detaliile rezerv\u0103rii nu au fost transmise complet \u00een URL. Pentru verificare, folose\u0219te Order ID-ul.';\n  } else {\n    if (elNote) elNote.textContent = '';\n  }\n\n  function setRetryVisible(yes){\n    if (!elRetry) return;\n    if (yes) elRetry.classList.remove('is-hidden');\n    else elRetry.classList.add('is-hidden');\n  }\n\n  function setState(state, extraMsg){\n    \/\/ state: 'paid' | 'failed' | 'pending'\n    if (!elIcon || !elTitle || !elDesc || !elStatus) return;\n\n    elIcon.classList.remove('is-ok','is-fail');\n    setRetryVisible(false);\n\n    if (state === 'paid') {\n      elIcon.textContent = '\u2713';\n      elIcon.classList.add('is-ok');\n      elTitle.textContent = 'Felicit\u0103ri! Rezervarea ta a fost efectuat\u0103';\n      elDesc.innerHTML =\n        'Am primit plata \u0219i am \u00eenregistrat solicitarea. ' +\n        'Pentru \u00eentreb\u0103ri ne po\u021bi contacta la <a href=\"mailto:chalet@theriver.ro\">chalet@theriver.ro<\/a>. ' +\n        'Administratorul te va contacta pentru confirmarea meniului \u0219i alte detalii.';\n      elStatus.textContent = 'Plat\u0103 confirmat\u0103';\n      return;\n    }\n\n    if (state === 'failed') {\n      elIcon.textContent = '\u2715';\n      elIcon.classList.add('is-fail');\n      elTitle.textContent = 'Plata nu a fost finalizat\u0103';\n      elDesc.innerHTML =\n        (extraMsg ? ('<span>' + String(extraMsg) + '<\/span><br>') : '') +\n        'Rezervarea nu a putut fi efectuat\u0103. Po\u021bi \u00eencerca din nou cu acela\u0219i interval.';\n      elStatus.textContent = 'Plat\u0103 e\u0219uat\u0103';\n      setRetryVisible(true);\n      return;\n    }\n\n    \/\/ pending\n    elIcon.textContent = '\u2026';\n    elTitle.textContent = 'Plata este \u00een curs de confirmare.';\n    elDesc.innerHTML =\n      'Uneori confirmarea poate dura c\u00e2teva momente. Re\u00eencarc\u0103 pagina sau \u00eencearc\u0103 din nou. ' +\n      'Pentru \u00eentreb\u0103ri: <a href=\"mailto:chalet@theriver.ro\">chalet@theriver.ro<\/a>.';\n    elStatus.textContent = '\u00cen a\u0219teptare';\n    \/\/ dac\u0103 nu se confirm\u0103, dup\u0103 polling ar\u0103t\u0103m retry\n  }\n\n  \/\/ 1) Hint din URL (dac\u0103 Netopia adaug\u0103 parametri la redirect)\n  function statusHintFromUrl(){\n    const err = qp('errorCode') || qp('error_code') || qp('err') || '';\n    const errMsg = qp('errorMessage') || qp('error_message') || qp('message') || '';\n    if (err && String(err) !== '0') return { state:'failed', msg: errMsg || ('Cod eroare: ' + err) };\n\n    const s = (qp('status') || qp('paymentStatus') || qp('payment_status') || '').toLowerCase();\n    if (['paid','success','successful','confirmed','completed','approved','ok'].includes(s)) return { state:'paid', msg:'' };\n    if (['failed','canceled','cancelled','refused','rejected','error'].includes(s)) return { state:'failed', msg: errMsg || '' };\n\n    return null;\n  }\n\n  \/\/ 2) Server-side: GET \/wp-json\/dotbloom-rental\/v1\/booking-status?orderId=...\n  async function fetchServerStatus(){\n    if (!orderId) return null;\n\n    const API_STATUS =\n      (window.DB_RENTAL && window.DB_RENTAL.apiBookingStatus) ||\n      '\/wp-json\/dotbloom-rental\/v1\/booking-status';\n\n    try {\n      const u = new URL(API_STATUS, window.location.origin);\n      u.searchParams.set('orderId', orderId);\n      u.searchParams.set('_', String(Date.now())); \/\/ nocache\n\n      const r = await fetch(u.toString(), { credentials:'same-origin', cache:'no-store' });\n      if (!r.ok) return { state:'pending', msg:'(nu pot citi statusul: HTTP ' + r.status + ')' };\n\n      const j = await r.json();\n      const st = String(j.status || j.state || j.payment_status || 'pending').toLowerCase();\n      const msg = j.message || j.errorMessage || '';\n\n      if (st === 'paid' || st === 'success') return { state:'paid', msg:'' };\n      if (st === 'failed' || st === 'error' || st === 'rejected' || st === 'canceled' || st === 'cancelled') return { state:'failed', msg: msg };\n      return { state:'pending', msg:'' };\n    } catch(e){\n      return { state:'pending', msg:'(eroare re\u021bea la status)' };\n    }\n  }\n\n  async function pollStatus(){\n    \/\/ hint imediat\n    const hint = statusHintFromUrl();\n    if (hint) {\n      setState(hint.state, hint.msg);\n      return;\n    }\n\n    \/\/ polling max ~30 sec\n    setState('pending', '');\n\nconst tries = 120; \/\/ ~4 minute\n    for (let i=0; i<tries; i++){\n      const srv = await fetchServerStatus();\n      if (srv && srv.state === 'paid') { setState('paid'); return; }\n      if (srv && srv.state === 'failed') { setState('failed', srv.msg || ''); return; }\n      await new Promise(r => setTimeout(r, 2000));\n    }\n\n    \/\/ \u00eenc\u0103 pending -> nu \u0219tim sigur; ar\u0103t\u0103m retry\n\/\/ \u00eenc\u0103 pending -> nu \u0219tim sigur; NU pornim iar plata (risc de plat\u0103 dubl\u0103)\nsetState('pending', '');\nsetRetryVisible(false);\nif (elNote) {\n  elNote.innerHTML =\n    '\u00cenc\u0103 a\u0219tept\u0103m confirmarea de la procesator. ' +\n    'Dac\u0103 ai finalizat plata \u0219i ai fost debitat, te rug\u0103m s\u0103 ne scrii la ' +\n    '<a href=\"mailto:chalet@theriver.ro\">chalet@theriver.ro<\/a>. ' +\n    'Dac\u0103 nu ai finalizat plata, po\u021bi reveni \u0219i \u00eencerca din nou.';\n}\n\n  }\n\n  \/\/ 3) Retry: porne\u0219te din nou Netopia cu acelea\u0219i date\n  async function retryPayment(){\n    const API_NETOPIA_START =\n      (window.DB_RENTAL && window.DB_RENTAL.apiNetopiaStart) ||\n      '\/wp-json\/dotbloom-rental\/v1\/netopia\/start';\n\n    if (!ci || !co || !nights || !total) {\n      if (elNote) elNote.textContent = 'Lipsesc datele necesare pentru re\u00eencercarea pl\u0103\u021bii.';\n      return;\n    }\n\n    \/\/ order nou (mai sigur)\n    const newOrderId = (orderId ? (orderId + '-R') : 'DB-') + String(Date.now());\n\n    if (elRetry) {\n      elRetry.classList.add('is-loading');\n      elRetry.setAttribute('aria-disabled','true');\n      elRetry.textContent = 'Se deschide plata\u2026';\n    }\n\n    try {\n      const r = await fetch(API_NETOPIA_START, {\n        method: 'POST',\n        credentials: 'same-origin',\n        headers: {\n  'Content-Type': 'application\/json',\n  'X-DB-Nonce': (window.DB_RENTAL && DB_RENTAL.restNonce) ? DB_RENTAL.restNonce : ''\n},\n        body: JSON.stringify({\n          amount: Number(total),\n          currency: currency,\n          order_id: newOrderId,\n        \n          \/\/ \u2705 IMPORTANT: leag\u0103 re\u00eencercarea de rezervarea ini\u021bial\u0103\n          parent_order_id: orderId,\n        \n          details: ('Rezervare ' + ci + ' \u2192 ' + co + ' (' + nights + ' nop\u021bi)').trim(),\n          checkin: ci,\n          checkout: co,\n          nights: Number(nights)\n        })\n\n      });\n\n      const txt = await r.text();\n      let data;\n      try { data = JSON.parse(txt); } catch(_) { data = { message: txt.slice(0, 300) }; }\n\n      if (!r.ok) {\n        setState('failed', data.message || ('Server error: ' + r.status));\n        return;\n      }\n\n      if (data.mode === 'redirect' && data.url) {\n        window.location.href = data.url;\n        return;\n      }\n\n      if (data.mode === 'post' && data.action && data.formData) {\n        const f = document.createElement('form');\n        f.method = 'POST';\n        f.action = data.action;\n        Object.entries(data.formData).forEach(([k, v]) => {\n          const i = document.createElement('input');\n          i.type = 'hidden';\n          i.name = k;\n          i.value = v;\n          f.appendChild(i);\n        });\n        document.body.appendChild(f);\n        f.submit();\n        return;\n      }\n\n      setState('failed', data.message || 'Eroare NETOPIA (r\u0103spuns nea\u0219teptat).');\n    } catch(err){\n      setState('failed', 'Eroare de re\u021bea c\u0103tre NETOPIA.');\n    } finally {\n      if (elRetry) {\n        elRetry.classList.remove('is-loading');\n        elRetry.setAttribute('aria-disabled','false');\n        elRetry.textContent = '\u00cencearc\u0103 din nou';\n      }\n    }\n  }\n\n  if (elRetry) {\n    elRetry.addEventListener('click', function(e){\n      e.preventDefault();\n      retryPayment();\n    });\n  }\n\n  pollStatus();\n})();\n<\/script>\n<\/div>\n\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\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-729","page","type-page","status-publish","hentry"],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/staging.theriver.ro\/en\/wp-json\/wp\/v2\/pages\/729","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/staging.theriver.ro\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/staging.theriver.ro\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/staging.theriver.ro\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/staging.theriver.ro\/en\/wp-json\/wp\/v2\/comments?post=729"}],"version-history":[{"count":25,"href":"https:\/\/staging.theriver.ro\/en\/wp-json\/wp\/v2\/pages\/729\/revisions"}],"predecessor-version":[{"id":1387,"href":"https:\/\/staging.theriver.ro\/en\/wp-json\/wp\/v2\/pages\/729\/revisions\/1387"}],"wp:attachment":[{"href":"https:\/\/staging.theriver.ro\/en\/wp-json\/wp\/v2\/media?parent=729"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}