{"id":1871,"date":"2026-08-31T08:53:35","date_gmt":"2026-08-31T08:53:35","guid":{"rendered":"https:\/\/geminia.co.ke\/dev\/?page_id=1871"},"modified":"2026-09-04T10:42:44","modified_gmt":"2026-09-04T10:42:44","slug":"geminia-biashara-plus-rater","status":"publish","type":"page","link":"https:\/\/geminia.co.ke\/dev\/geminia-biashara-plus-rater\/","title":{"rendered":"Geminia Biashara Plus Rater"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1871\" class=\"elementor elementor-1871\">\n\t\t\t\t<div class=\"elementor-element elementor-element-15466d9 e-con-full e-flex e-con e-parent\" data-id=\"15466d9\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-74efb55 elementor-widget elementor-widget-html\" data-id=\"74efb55\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section class=\"gem-rater\" data-gem=\"sme-rater\">\r\n<style>\r\n.gem-rater {\r\n  --gem-navy: #393680;\r\n  --gem-blue: #3fa6dd;\r\n  --gem-navy-dark: #2b2960;\r\n  --gem-blue-dark: #2f8ec2;\r\n  --gem-ink: #1f2233;\r\n  --gem-muted: #5b5f73;\r\n  --gem-line: #e6e8f0;\r\n  --gem-bg-soft: #f5f6fb;\r\n  --gem-white: #ffffff;\r\n  --gem-success: #1f8a5f;\r\n  --gem-success-bg: #eaf7f1;\r\n  --gem-warn: #b45309;\r\n  --gem-warn-bg: #fef3e2;\r\n  --gem-radius: 16px;\r\n  --gem-radius-sm: 10px;\r\n  --gem-shadow: 0 10px 30px rgba(57, 54, 128, .10);\r\n  --gem-font-head: 'Poppins', 'Segoe UI', system-ui, sans-serif;\r\n  --gem-font-body: 'Inter', Arial, Helvetica, sans-serif;\r\n  display: block;\r\n  background: var(--gem-bg-soft);\r\n  padding: clamp(16px, 4vw, 40px) clamp(12px, 3vw, 24px);\r\n  font-family: var(--gem-font-body);\r\n  color: var(--gem-ink);\r\n  line-height: 1.5;\r\n}\r\n.gem-rater *, .gem-rater *::before, .gem-rater *::after { box-sizing: border-box; }\r\n.gem-rater h1, .gem-rater h2, .gem-rater h3, .gem-rater h4 {\r\n  font-family: var(--gem-font-head);\r\n  color: var(--gem-navy);\r\n  margin: 0 0 6px;\r\n  font-weight: 600;\r\n}\r\n.gem-rater p { margin: 0 0 12px; color: var(--gem-muted); }\r\n.gem-rater a { color: var(--gem-blue-dark); }\r\n.gem-rater button { font-family: var(--gem-font-body); cursor: pointer; }\r\n.gem-rater input, .gem-rater select { font-family: var(--gem-font-body); }\r\n\r\n\/* ---------- Shell ---------- *\/\r\n.gem-shell { max-width: 1180px; margin: 0 auto; }\r\n.gem-head { text-align: left; margin-bottom: 20px; }\r\n.gem-head__eyebrow { color: var(--gem-blue-dark); font-weight: 600; font-size: .85rem; letter-spacing: .02em; margin-bottom: 4px; }\r\n.gem-head h1 { font-size: clamp(1.5rem, 3vw, 2.1rem); }\r\n.gem-head p { max-width: 60ch; }\r\n\r\n\/* ---------- Progress ---------- *\/\r\n.gem-progress { display: flex; gap: 6px; margin: 20px 0 24px; list-style: none; padding: 0; }\r\n.gem-progress li {\r\n  flex: 1; text-align: center; padding: 10px 6px 12px; border-bottom: 3px solid var(--gem-line);\r\n  color: var(--gem-muted); font-size: .82rem; font-weight: 600; cursor: pointer; transition: border-color .2s, color .2s;\r\n}\r\n.gem-progress li .gem-progress__num {\r\n  display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 50%;\r\n  background: var(--gem-line); color: var(--gem-white); font-size: .74rem; margin-right: 6px; font-family: var(--gem-font-head);\r\n}\r\n.gem-progress li.is-active { border-color: var(--gem-blue); color: var(--gem-navy); }\r\n.gem-progress li.is-active .gem-progress__num, .gem-progress li.is-done .gem-progress__num { background: var(--gem-navy); }\r\n.gem-progress li.is-done { color: var(--gem-navy); }\r\n\r\n\/* ---------- Layout grid ---------- *\/\r\n.gem-grid { display: grid; grid-template-columns: 1fr; gap: 20px; align-items: start; }\r\n@media (min-width: 1024px) {\r\n  .gem-grid { grid-template-columns: minmax(0, 1fr) 320px; }\r\n}\r\n\r\n\/* ---------- Summary card ---------- *\/\r\n.gem-summary {\r\n  background: var(--gem-navy); color: var(--gem-white); border-radius: var(--gem-radius);\r\n  padding: 22px 22px 18px; box-shadow: var(--gem-shadow);\r\n  position: sticky; top: 16px;\r\n}\r\n.gem-summary__label { font-size: .78rem; text-transform: none; color: #cfd0ec; margin-bottom: 2px; }\r\n.gem-summary__amount { font-family: var(--gem-font-head); font-size: clamp(1.6rem, 3vw, 2rem); font-weight: 700; margin-bottom: 14px; }\r\n.gem-summary__rows { border-top: 1px solid rgba(255,255,255,.18); padding-top: 10px; display: flex; flex-direction: column; gap: 6px; max-height: 260px; overflow-y: auto; }\r\n.gem-summary__row { display: flex; justify-content: space-between; font-size: .82rem; color: #dfe0f4; gap: 8px; }\r\n.gem-summary__row span:last-child { font-weight: 600; color: var(--gem-white); white-space: nowrap; }\r\n.gem-summary__foot { border-top: 1px solid rgba(255,255,255,.18); margin-top: 12px; padding-top: 12px; font-size: .78rem; color: #cfd0ec; }\r\n\r\n\/* ---------- Card \/ step panel ---------- *\/\r\n.gem-panel {\r\n  background: var(--gem-white); border-radius: var(--gem-radius); box-shadow: var(--gem-shadow);\r\n  padding: clamp(18px, 3vw, 30px); margin-bottom: 18px;\r\n}\r\n.gem-panel h2 { font-size: 1.3rem; }\r\n.gem-panel__note { background: var(--gem-bg-soft); border-radius: var(--gem-radius-sm); padding: 10px 14px; font-size: .85rem; color: var(--gem-muted); margin-bottom: 16px; }\r\n\r\n\/* ---------- Form fields ---------- *\/\r\n.gem-field { margin-bottom: 14px; }\r\n.gem-field label { display: block; font-size: .85rem; font-weight: 600; color: var(--gem-ink); margin-bottom: 5px; }\r\n.gem-field .gem-hint { font-weight: 400; color: var(--gem-muted); font-size: .78rem; margin-left: 4px; }\r\n.gem-field input[type=text], .gem-field input[type=email], .gem-field input[type=tel], .gem-field input[type=number], .gem-field select {\r\n  width: 100%; padding: 10px 12px; border: 1px solid var(--gem-line); border-radius: var(--gem-radius-sm);\r\n  font-size: .95rem; color: var(--gem-ink); background: var(--gem-white); transition: border-color .15s, box-shadow .15s;\r\n}\r\n.gem-field input:focus, .gem-field select:focus {\r\n  outline: none; border-color: var(--gem-blue); box-shadow: 0 0 0 3px rgba(63,166,221,.18);\r\n}\r\n.gem-row2 { display: grid; grid-template-columns: 1fr; gap: 14px; }\r\n@media (min-width: 640px) { .gem-row2 { grid-template-columns: 1fr 1fr; } }\r\n.gem-row3 { display: grid; grid-template-columns: 1fr; gap: 14px; }\r\n@media (min-width: 720px) { .gem-row3 { grid-template-columns: 1.6fr 0.9fr 0.9fr; } }\r\n\r\n\/* ---------- Item table rows ---------- *\/\r\n.gem-items__head, .gem-item-row {\r\n  display: grid; grid-template-columns: 1fr 130px 130px 30px; gap: 10px; align-items: center; padding: 8px 0;\r\n}\r\n.gem-item-row { border-bottom: 1px solid var(--gem-line); }\r\n.gem-items__head { font-size: .74rem; text-transform: uppercase; letter-spacing: .03em; color: var(--gem-muted); font-weight: 700; border-bottom: 2px solid var(--gem-line); }\r\n.gem-item-row input[type=text] { padding: 8px 10px; border: 1px solid var(--gem-line); border-radius: 8px; font-size: .88rem; }\r\n.gem-item-row input[type=number] { padding: 8px 10px; border: 1px solid var(--gem-line); border-radius: 8px; font-size: .88rem; text-align: right; }\r\n.gem-item-row .gem-item-premium { text-align: right; font-weight: 600; color: var(--gem-navy); font-size: .9rem; }\r\n.gem-item-row__remove { background: none; border: none; color: #b3435a; font-size: 1.1rem; line-height: 1; padding: 4px; }\r\n.gem-item-row__label { font-size: .9rem; color: var(--gem-ink); }\r\n.gem-add-item {\r\n  margin-top: 10px; background: var(--gem-white); border: 1.5px dashed var(--gem-blue); color: var(--gem-blue-dark);\r\n  border-radius: var(--gem-radius-sm); padding: 9px 14px; font-size: .85rem; font-weight: 600;\r\n}\r\n.gem-add-item:hover { background: rgba(63,166,221,.08); }\r\n.gem-total-line {\r\n  display: flex; justify-content: space-between; align-items: baseline; margin-top: 14px; padding-top: 12px;\r\n  border-top: 2px solid var(--gem-navy); font-family: var(--gem-font-head);\r\n}\r\n.gem-total-line span:last-child { font-size: 1.15rem; font-weight: 700; color: var(--gem-navy); }\r\n.gem-excess-note { font-size: .78rem; color: var(--gem-muted); margin-top: 4px; }\r\n\r\n\/* ---------- Refer banner ---------- *\/\r\n.gem-refer { display: none; background: var(--gem-warn-bg); border: 1px solid #f3d9ad; color: var(--gem-warn); border-radius: var(--gem-radius-sm); padding: 10px 14px; font-size: .85rem; margin-top: 12px; font-weight: 600; }\r\n.gem-refer.is-shown { display: block; }\r\n\r\n\/* ---------- Toggle switch ---------- *\/\r\n.gem-switch { position: relative; display: inline-block; width: 42px; height: 24px; flex: 0 0 auto; cursor: pointer; }\r\n.gem-switch input { opacity: 0; width: 0; height: 0; }\r\n.gem-switch__track { position: absolute; inset: 0; background: #cfd2e6; border-radius: 999px; transition: background .18s; }\r\n.gem-switch__track::before { content: \"\"; position: absolute; width: 18px; height: 18px; left: 3px; top: 3px; background: var(--gem-white); border-radius: 50%; transition: transform .18s; box-shadow: 0 1px 3px rgba(0,0,0,.25); }\r\n.gem-switch input:checked + .gem-switch__track { background: var(--gem-success); }\r\n.gem-switch input:checked + .gem-switch__track::before { transform: translateX(18px); }\r\n.gem-switch input:focus-visible + .gem-switch__track { outline: 2px solid var(--gem-blue); outline-offset: 2px; }\r\n\r\n.gem-check { display: flex; align-items: center; gap: 10px; margin: 10px 0; }\r\n.gem-check label { font-size: .88rem; font-weight: 600; color: var(--gem-ink); margin: 0; cursor: pointer; }\r\n\r\n\/* ---------- Optional cover cards \/ accordion ---------- *\/\r\n.gem-cat-title { font-family: var(--gem-font-head); color: var(--gem-navy); font-size: .95rem; margin: 22px 0 10px; padding-top: 4px; }\r\n.gem-cat-title:first-child { margin-top: 0; }\r\n.gem-card { border: 1px solid var(--gem-line); border-radius: var(--gem-radius-sm); margin-bottom: 10px; overflow: hidden; background: var(--gem-white); }\r\n.gem-card__head { width: 100%; display: flex; align-items: center; gap: 12px; padding: 14px 16px; background: var(--gem-white); }\r\n.gem-card__titlebtn { flex: 1; display: flex; align-items: center; gap: 12px; background: none; border: none; padding: 0; text-align: left; min-width: 0; }\r\n.gem-card__title { flex: 1; font-family: var(--gem-font-head); font-weight: 600; color: var(--gem-ink); font-size: .95rem; }\r\n.gem-card__title small { display: block; font-family: var(--gem-font-body); font-weight: 400; color: var(--gem-muted); font-size: .78rem; margin-top: 2px; }\r\n.gem-card__premium { font-weight: 700; color: var(--gem-navy); font-size: .9rem; white-space: nowrap; }\r\n.gem-card__chev { color: var(--gem-muted); transition: transform .18s; flex: 0 0 auto; }\r\n.gem-card.is-open .gem-card__chev { transform: rotate(180deg); }\r\n.gem-card__body { display: none; padding: 4px 18px 18px; border-top: 1px solid var(--gem-line); }\r\n.gem-card.is-open .gem-card__body { display: block; }\r\n\r\n\/* ---------- Nav buttons ---------- *\/\r\n.gem-nav { display: flex; justify-content: space-between; gap: 12px; margin-top: 4px; }\r\n.gem-btn { border-radius: 999px; padding: 12px 26px; font-weight: 600; font-size: .92rem; border: none; transition: background .15s, color .15s, transform .1s; }\r\n.gem-btn:active { transform: scale(.98); }\r\n.gem-btn--primary { background: var(--gem-blue); color: var(--gem-white); }\r\n.gem-btn--primary:hover { background: var(--gem-blue-dark); }\r\n.gem-btn--ghost { background: transparent; color: var(--gem-navy); border: 1.5px solid var(--gem-line); }\r\n.gem-btn--ghost:hover { border-color: var(--gem-navy); }\r\n.gem-btn:disabled { opacity: .4; cursor: not-allowed; }\r\n\r\n\/* ---------- Review step ---------- *\/\r\n.gem-review-table { width: 100%; border-collapse: collapse; margin: 10px 0 20px; font-size: .9rem; }\r\n.gem-review-table th { text-align: left; font-size: .74rem; text-transform: uppercase; letter-spacing: .03em; color: var(--gem-muted); border-bottom: 2px solid var(--gem-line); padding: 8px 6px; }\r\n.gem-review-table td { padding: 10px 6px; border-bottom: 1px solid var(--gem-line); }\r\n.gem-review-table td:last-child, .gem-review-table th:last-child { text-align: right; }\r\n.gem-review-total-row td { font-family: var(--gem-font-head); font-weight: 700; color: var(--gem-navy); font-size: 1.05rem; border-top: 2px solid var(--gem-navy); border-bottom: none; }\r\n.gem-review-sub td { color: var(--gem-muted); }\r\n.gem-client-summary { display: grid; grid-template-columns: 1fr; gap: 4px 30px; font-size: .88rem; margin-bottom: 18px; }\r\n@media (min-width: 640px) { .gem-client-summary { grid-template-columns: 1fr 1fr; } }\r\n.gem-client-summary div span { color: var(--gem-muted); }\r\n.gem-disclaimer { font-size: .78rem; color: var(--gem-muted); border-top: 1px solid var(--gem-line); padding-top: 14px; margin-top: 10px; }\r\n.gem-quote-ref { font-family: var(--gem-font-head); font-size: .8rem; color: var(--gem-blue-dark); font-weight: 600; margin-bottom: 14px; }\r\n.gem-submit-block { margin-top: 20px; padding-top: 18px; border-top: 1px solid var(--gem-line); }\r\n.gem-submit-status { font-size: .85rem; margin: 10px 0 0; }\r\n.gem-submit-status.is-success { color: var(--gem-success); font-weight: 600; }\r\n.gem-submit-status.is-error { color: var(--gem-warn); font-weight: 600; }\r\n\r\n@media print {\r\n  .gem-rater .gem-progress, .gem-rater .gem-nav, .gem-rater .gem-summary, .gem-rater .gem-print-hide { display: none !important; }\r\n  .gem-rater .gem-grid { display: block; }\r\n}\r\n<\/style>\r\n\r\n<div class=\"gem-shell\">\r\n  <div class=\"gem-head\">\r\n    <div class=\"gem-head__eyebrow\">Geminia Biashara Plus Insurance<\/div>\r\n    <h1>Get your Biashara Plus cover quotation<\/h1>\r\n    <p>Answer a few questions about the business and pick the covers that matter. Your estimated annual premium updates as you go.<\/p>\r\n  <\/div>\r\n\r\n  <ul class=\"gem-progress\" id=\"gem-progress\">\r\n    <li data-step=\"1\" class=\"is-active\"><span class=\"gem-progress__num\">1<\/span>Business details<\/li>\r\n    <li data-step=\"2\"><span class=\"gem-progress__num\">2<\/span>Fire &amp; allied perils<\/li>\r\n    <li data-step=\"3\"><span class=\"gem-progress__num\">3<\/span>Optional covers<\/li>\r\n    <li data-step=\"4\"><span class=\"gem-progress__num\">4<\/span>Your quotation<\/li>\r\n  <\/ul>\r\n\r\n  <div class=\"gem-grid\">\r\n    <div class=\"gem-main\">\r\n\r\n      <!-- STEP 1 -->\r\n      <div class=\"gem-panel gem-step\" data-step=\"1\">\r\n        <h2>Tell us about the business<\/h2>\r\n        <p class=\"gem-panel__note\">This information appears on your quotation. Only the industry and business type affect the premium.<\/p>\r\n\r\n        <div class=\"gem-row2\">\r\n          <div class=\"gem-field\">\r\n            <label for=\"cf-name\">Client \/ business name<\/label>\r\n            <input type=\"text\" id=\"cf-name\" placeholder=\"e.g. Ultimate Business Machine Ltd\">\r\n          <\/div>\r\n          <div class=\"gem-field\">\r\n            <label for=\"cf-phone\">Phone number<\/label>\r\n            <input type=\"tel\" id=\"cf-phone\" placeholder=\"e.g. 0700 000 000\">\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"gem-row2\">\r\n          <div class=\"gem-field\">\r\n            <label for=\"cf-email\">Email address<\/label>\r\n            <input type=\"email\" id=\"cf-email\" placeholder=\"e.g. name@business.co.ke\">\r\n          <\/div>\r\n          <div class=\"gem-field\">\r\n            <label for=\"cf-address\">Physical address<\/label>\r\n            <input type=\"text\" id=\"cf-address\" placeholder=\"e.g. Nairobi\">\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"gem-field\">\r\n          <label for=\"cf-occupation\">Occupation \/ industry <span class=\"gem-hint\">\u2014 drives your Fire &amp; Allied Perils rate<\/span><\/label>\r\n          <input type=\"text\" id=\"cf-occupation\" list=\"cf-occupation-list\" placeholder=\"Start typing to search, e.g. Offices, Hotels, Garages\u2026\" autocomplete=\"off\">\r\n          <datalist id=\"cf-occupation-list\"><\/datalist>\r\n        <\/div>\r\n        <p class=\"gem-excess-note\" id=\"cf-deductible-note\" style=\"display:none;\"><\/p>\r\n\r\n        <div class=\"gem-row2\">\r\n          <div class=\"gem-field\">\r\n            <label for=\"cf-businessType\">Business type<\/label>\r\n            <select id=\"cf-businessType\">\r\n              <option value=\"New Business\">New Business<\/option>\r\n              <option value=\"Renewal Business\">Renewal Business<\/option>\r\n            <\/select>\r\n          <\/div>\r\n          <div class=\"gem-field\">\r\n            <label for=\"cf-intermediaryType\">Intermediary type<\/label>\r\n            <select id=\"cf-intermediaryType\">\r\n              <option>Agent<\/option>\r\n              <option selected>Broker<\/option>\r\n              <option>Direct Client<\/option>\r\n              <option>Direct Sale Force<\/option>\r\n              <option>Facultative<\/option>\r\n            <\/select>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"gem-nav\">\r\n          <span><\/span>\r\n          <button class=\"gem-btn gem-btn--primary\" id=\"btn-next-1\">Continue to Fire &amp; Allied Perils<\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- STEP 2: SECTION A -->\r\n      <div class=\"gem-panel gem-step\" data-step=\"2\" hidden>\r\n        <h2>Section A \u2014 Fire &amp; Allied Perils <span class=\"gem-hint\" style=\"font-size:.7em;font-weight:500;\">(compulsory)<\/span><\/h2>\r\n        <p class=\"gem-panel__note\">If stock or contents sit in more than one distinct building, list each building's sum insured as a separate item.<\/p>\r\n\r\n        <div class=\"gem-items__head\"><span>Description<\/span><span>Sum insured (KES)<\/span><span>Premium<\/span><span><\/span><\/div>\r\n        <div id=\"a-fixed-items\"><\/div>\r\n        <div id=\"a-extra-items\"><\/div>\r\n        <button type=\"button\" class=\"gem-add-item\" id=\"a-add-item\">+ Add another item<\/button>\r\n\r\n        <div class=\"gem-total-line\"><span>Total sum insured<\/span><span id=\"a-total-si\">KES 0.00<\/span><\/div>\r\n\r\n        <h3 style=\"margin-top:26px;font-size:1.05rem;\">Optional extensions<\/h3>\r\n        <div class=\"gem-check\">\r\n          <label class=\"gem-switch\"><input type=\"checkbox\" id=\"a-ext-removal-toggle\"><span class=\"gem-switch__track\"><\/span><\/label>\r\n          <label for=\"a-ext-removal-toggle\">Removal of debris<\/label>\r\n        <\/div>\r\n        <div class=\"gem-field\" id=\"a-ext-removal-fields\" style=\"display:none;max-width:280px;\">\r\n          <label for=\"a-ext-removal-si\">Sum insured for this extension (KES)<\/label>\r\n          <input type=\"number\" id=\"a-ext-removal-si\" min=\"0\" step=\"1000\" value=\"0\">\r\n          <p class=\"gem-excess-note\">Premium: <span id=\"a-ext-removal-premium\">KES 0.00<\/span><\/p>\r\n        <\/div>\r\n\r\n        <div class=\"gem-check\">\r\n          <label class=\"gem-switch\"><input type=\"checkbox\" id=\"a-ext-electrical-toggle\"><span class=\"gem-switch__track\"><\/span><\/label>\r\n          <label for=\"a-ext-electrical-toggle\">Electrical clause III<\/label>\r\n        <\/div>\r\n        <div class=\"gem-field\" id=\"a-ext-electrical-fields\" style=\"display:none;max-width:340px;\">\r\n          <p class=\"gem-excess-note\">Automatically rated on your total Section A sum insured (<span id=\"a-ext-electrical-si\">KES 0.00<\/span>). Premium: <span id=\"a-ext-electrical-premium\">KES 0.00<\/span><\/p>\r\n        <\/div>\r\n\r\n        <div class=\"gem-refer\" id=\"a-refer\">This risk's total sum insured exceeds our maximum capacity of KES 500,000,000 and must be referred to Geminia Underwriting. It is not included in the premium below.<\/div>\r\n\r\n        <div class=\"gem-total-line\"><span>Total premium \u2014 Section A<\/span><span id=\"a-total-premium\">KES 0.00<\/span><\/div>\r\n\r\n        <div class=\"gem-nav\">\r\n          <button class=\"gem-btn gem-btn--ghost\" id=\"btn-back-2\">Back<\/button>\r\n          <button class=\"gem-btn gem-btn--primary\" id=\"btn-next-2\">Continue to optional covers<\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- STEP 3: OPTIONAL COVERS -->\r\n      <div class=\"gem-panel gem-step\" data-step=\"3\" hidden>\r\n        <h2>Optional covers<\/h2>\r\n        <p class=\"gem-panel__note\">Switch on any covers the business needs. Everything is off by default \u2014 only what you switch on is added to your premium.<\/p>\r\n\r\n        <div class=\"gem-cat-title\">Business continuity &amp; property<\/div>\r\n        <div id=\"card-B\" class=\"gem-card\" data-key=\"B\"><\/div>\r\n        <div id=\"card-C\" class=\"gem-card\" data-key=\"C\"><\/div>\r\n        <div id=\"card-D\" class=\"gem-card\" data-key=\"D\"><\/div>\r\n        <div id=\"card-E\" class=\"gem-card\" data-key=\"E\"><\/div>\r\n        <div id=\"card-F\" class=\"gem-card\" data-key=\"F\"><\/div>\r\n        <div id=\"card-G\" class=\"gem-card\" data-key=\"G\"><\/div>\r\n        <div id=\"card-H\" class=\"gem-card\" data-key=\"H\"><\/div>\r\n\r\n        <div class=\"gem-cat-title\">Transit<\/div>\r\n        <div id=\"card-I\" class=\"gem-card\" data-key=\"I\"><\/div>\r\n        <div id=\"card-J\" class=\"gem-card\" data-key=\"J\"><\/div>\r\n\r\n        <div class=\"gem-cat-title\">Machinery<\/div>\r\n        <div id=\"card-K\" class=\"gem-card\" data-key=\"K\"><\/div>\r\n        <div id=\"card-L\" class=\"gem-card\" data-key=\"L\"><\/div>\r\n\r\n        <div class=\"gem-cat-title\">People &amp; liability<\/div>\r\n        <div id=\"card-M\" class=\"gem-card\" data-key=\"M\"><\/div>\r\n        <div id=\"card-N\" class=\"gem-card\" data-key=\"N\"><\/div>\r\n        <div id=\"card-O\" class=\"gem-card\" data-key=\"O\"><\/div>\r\n        <div id=\"card-P\" class=\"gem-card\" data-key=\"P\"><\/div>\r\n\r\n        <div class=\"gem-cat-title\">Special risks<\/div>\r\n        <div id=\"card-Q\" class=\"gem-card\" data-key=\"Q\"><\/div>\r\n\r\n        <div class=\"gem-nav\">\r\n          <button class=\"gem-btn gem-btn--ghost\" id=\"btn-back-3\">Back<\/button>\r\n          <button class=\"gem-btn gem-btn--primary\" id=\"btn-next-3\">Review my quotation<\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- STEP 4: REVIEW -->\r\n      <div class=\"gem-panel gem-step\" data-step=\"4\" hidden>\r\n        <h2>Your quotation<\/h2>\r\n        <p class=\"gem-quote-ref\" id=\"quote-ref-display\"><\/p>\r\n        <div class=\"gem-client-summary\" id=\"review-client\"><\/div>\r\n\r\n        <table class=\"gem-review-table\" id=\"review-table\">\r\n          <thead><tr><th>Section<\/th><th>Sum insured<\/th><th>Premium<\/th><\/tr><\/thead>\r\n          <tbody id=\"review-tbody\"><\/tbody>\r\n        <\/table>\r\n\r\n        <p class=\"gem-disclaimer\">This is a quotation only and is not an automatic confirmation of cover. It is an invitation to offer and does not itself constitute an offer. It is valid for 30 days from the date shown below.<\/p>\r\n        <p class=\"gem-client-summary\" id=\"review-footer\" style=\"margin-top:6px;\"><\/p>\r\n\r\n        <div class=\"gem-submit-block gem-print-hide\">\r\n          <button class=\"gem-btn gem-btn--primary\" id=\"btn-submit\">Email this quotation to Geminia<\/button>\r\n          <p class=\"gem-submit-status\" id=\"submit-status\"><\/p>\r\n        <\/div>\r\n\r\n        <div class=\"gem-nav gem-print-hide\">\r\n          <button class=\"gem-btn gem-btn--ghost\" id=\"btn-back-4\">Back<\/button>\r\n          <button class=\"gem-btn gem-btn--ghost\" id=\"btn-print\">Print \/ save as PDF<\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n    <!-- SUMMARY SIDEBAR -->\r\n    <aside class=\"gem-summary\" id=\"gem-summary-card\">\r\n      <div class=\"gem-summary__label\">Estimated annual premium<\/div>\r\n      <div class=\"gem-summary__amount\" id=\"summary-total\">KES 0.00<\/div>\r\n      <div class=\"gem-summary__rows\" id=\"summary-rows\"><\/div>\r\n      <div class=\"gem-summary__foot\" id=\"summary-foot\">Levies and stamp duty are added on the final step.<\/div>\r\n    <\/aside>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function () {\r\n  var root = document.currentScript.closest('[data-gem=\"sme-rater\"]');\r\n  if (!root || root.dataset.gemInit) return;\r\n  root.dataset.gemInit = '1';\r\n\r\n  \/* ============================================================\r\n     SUBMISSION CONFIG \u2014 paste your deployed Google Apps Script\r\n     Web App URL here (see the companion Code.gs). Looks like:\r\n     https:\/\/script.google.com\/macros\/s\/AKfycb...\/exec\r\n     ============================================================ *\/\r\n  var SUBMIT_URL = 'https:\/\/script.google.com\/macros\/s\/AKfycbz6HPstkGciBQ3lO1DKMLeOU2NdpvIeaqjPnaZqlaWKxMe3vNIRYRjCJYYiRuVq4qOh\/exec';\r\n  var quoteRef = 'GEM-SME-' + new Date().getFullYear() + '-' + Date.now().toString(36).toUpperCase().slice(-6);\r\n\r\n  \/* ============================================================\r\n     RATE TABLES \u2014 extracted from Geminia_SME_Rater_20250925L.xlsb\r\n     ============================================================ *\/\r\n  var RATES = {\r\n    occupations: [\r\n[\"Amusement parks\",0.001645],[\"Barber shops\",0.00175],[\"Boarding Schools & Colleges (Boarding) & Hostels\",0.0021],\r\n[\"Broadcasting Stations\",0.0014],[\"Car wash\",0.00175],[\"Chemical manufacturing & Storage\",0.0028],\r\n[\"Churches, Mosques, Temples\",0.0014],[\"Consumer electronics\",0.00175],[\"Day Schools\",0.0014],\r\n[\"Detergent manufacturing\",0.0035],[\"Dry Cleaners\",0.00175],[\"Edible oil\",0.002275],\r\n[\"Export processing zone\",0.0035],[\"Foam and mattress manufacturing\",0.00785],[\"Food processing industries\",0.0021],\r\n[\"Fuelling station (But excluding Garages)\",0.0021],[\"Furniture manufacturing\",0.00785],\r\n[\"Furniture shops (excluding furniture manufacturing)\",0.0035],[\"Garages\",0.002275],[\"Golf courses\",0.001645],\r\n[\"Green houses\",0.00735],[\"Hair salons\",0.00175],[\"Hard Plastics\",0.0035],[\"Home appliances\",0.00175],\r\n[\"Hospitals\",0.0014],[\"Hotels with Standard Construction\",0.00175],[\"Makuti risks\",0.00785],\r\n[\"Metal Manufacturing, Cement Plants,\",0.0021],[\"Mobile network operator\/Telephone Exchanges\",0.001505],\r\n[\"Motor vehicle dealers\",0.00175],[\"Offices\",0.001225],[\"Paint Factory-Nitrocellulose based\",0.0035],\r\n[\"Paint Factory-Others & Varnish\",0.002975],[\"Paint Factory-Water based\",0.00175],\r\n[\"Paper & pulp industries\/ printing works\",0.00785],[\"Pharmaceutical Industry (Manufacturing)\",0.0042],\r\n[\"Pharmacy with storage (Non-manufacturing)\",0.0035],[\"Pharmacy without storage (Non-manufacturing)\",0.00175],\r\n[\"Refineries\",0.00385],[\"Residential Buildings\",0.00119],\r\n[\"Rolling  mills,steel rolling mills, steel bars, strip & girder makers\",0.001925],\r\n[\"SGR, Transportation systems\",0.001925],[\"Shops & shopping malls,\",0.001925],[\"Soft Plastics\",0.00785],\r\n[\"Spas\",0.00175],[\"Steel Furniture Makers\",0.001925],[\"Tank farm Oil Storage Depot\",0.0035],\r\n[\"Tea leaf factories\",0.002275],[\"Tents\/Camps\",0.0035],\r\n[\"Textiles including risks involving cotton and cotton products\/storage\",0.00785],[\"Thatch risks\",0.00785],\r\n[\"Theatres\",0.001645],[\"Tobacco factories including trade in tobacco products\",0.00785],\r\n[\"Transporters, Cargo movers, warehouses in the Airport or Seaport\",0.002975],\r\n[\"Warehouse, Godowns-Hazardous Goods\",0.0035],[\"Warehouse, Godowns-Non-Hazardous Goods\",0.002275],\r\n[\"Warehouses -Government Bonded\",0.0028],[\"Withering houses\",0.0021],\r\n[\"Wood\/ Timber processing\/ sawmills and chipboard\/ wallboard\/ wallpaper manufacturing\",0.00785]\r\n    ],\r\n    deductibles: {\r\n      \"Foam and mattress manufacturing\":\"10% each & every loss Minimum KES 2,000,000\",\r\n      \"Furniture manufacturing\":\"10% each & every loss Minimum KES 2,000,000\",\r\n      \"Makuti risks\":\"10% each & every loss Minimum KES 2,000,000\",\r\n      \"Paper & pulp industries\/ printing works\":\"10% each & every loss Minimum KES 2,000,000\",\r\n      \"Soft Plastics\":\"10% each & every loss Minimum KES 2,000,000\",\r\n      \"Thatch risks\":\"10% each & every loss Minimum KES 2,000,000\",\r\n      \"Textiles including risks involving cotton and cotton products\/storage\":\"10% each & every loss Minimum KES 2,000,000\",\r\n      \"Tobacco factories including trade in tobacco products\":\"10% each & every loss Minimum KES 2,000,000\",\r\n      \"Wood\/ Timber processing\/ sawmills and chipboard\/ wallboard\/ wallpaper manufacturing\":\"10% each & every loss Minimum KES 2,000,000\",\r\n      \"Hard Plastics\":\"10% each & every loss Minimum KES 2,000,000\",\r\n      \"Tea leaf factories\":\"10% each & every loss Minimum KES 1,000,000\"\r\n    },\r\n    pvtRisks: [\r\n      [\"Residential Building in own compound\",0.0005],[\"Apartments\",0.0005],[\"Pure Offices\",0.0006],\r\n      [\"Commercial Building in own compound\",0.00065],[\"Commercial Building not protected by boundary wall\",0.00075],\r\n      [\"Hotels\",0.00075],[\"Industrial Risks in own compound with electric fence\",0.00075],\r\n      [\"Industrial Risks without boundary wall\",0.001],[\"Supermarkets protected by access control\",0.0015],\r\n      [\"Churches\",0.00065],[\"Education Institutions\",0.00065],[\"Construction risks\",0.001],\r\n      [\"Money, GIT, Wiba, Gpa & other property excluding public liability\",0.2]\r\n    ],\r\n    wibaRates: {\r\n      \"Office & clerical\": 0.00693,\r\n      \"General workers\": 0.01974,\r\n      \"Machinists, drivers, watchmen & builders\": 0.03885\r\n    },\r\n    firstLossOptions: [\r\n      [\"Without First Loss\",1],[\"With First Loss - 5%\",0.05],[\"With First Loss - 10%\",0.1],\r\n      [\"With First Loss - 15%\",0.15],[\"With First Loss - 20%\",0.2],[\"With First Loss - 25%\",0.25],\r\n      [\"With First Loss - 30%\",0.3],[\"With First Loss - 35%\",0.35],[\"With First Loss - 40%\",0.4],\r\n      [\"With First Loss - 45%\",0.45],[\"With First Loss - 50%\",0.5]\r\n    ],\r\n    allRisksTerritorial: { \"Kenya Only\": 0.0075, \"Worldwide\": 0.01 },\r\n    indemnityDiscount: { 6: 0.15, 12: 0 },\r\n    elOptions: [\r\n      [\"Option A\",0.25,2000000,10000000,20000000],\r\n      [\"Option B\",0.30,4000000,15000000,30000000],\r\n      [\"Option C\",0.35,6000000,20000000,40000000],\r\n      [\"Option D\",0.40,8000000,25000000,50000000]\r\n    ],\r\n    fireMaxSI: 500000000,\r\n    removalOfDebrisDelta: 0.00035,\r\n    electricalClauseRate: 0.00035,\r\n    burglaryRate: 0.005,\r\n    electronicEquipmentRate: 0.0045,\r\n    moneyGeneralRate: 0.005,\r\n    estAnnualCarryRate: 0.0005,\r\n    plateGlassRate: 0.0075,\r\n    fidelityMaxSI: 5000000,\r\n    fidelityGeneralRate: 0.01,\r\n    fidelityPerCapitaRate: 250,\r\n    goodsAnyOneLoadRate: 0.01,\r\n    territorialExtRate: 0.1,\r\n    pvtExtRate: 0.2,\r\n    carriersAnyOneCarryRate: 0.015,\r\n    machineryMaterialDamageRate: 0.00475,\r\n    machineryOwnSurroundingRate: 0.001,\r\n    machineryOwnSurroundingCapPct: 0.2,\r\n    machineryTPLRate: 0.001,\r\n    machineryTPLCapPct: 0.2,\r\n    gpaLoadingRate: 0.4,\r\n    publicLiabilityRate: 0.0005,\r\n    foodDrinkExtRate: 0.2,\r\n    keymanRate: 0.0055,\r\n    keymanMaxSI: 10000000,\r\n    criticalIllnessMaxSI: 2000000,\r\n    criticalIllnessCapPct: 0.3,\r\n    criticalIllnessRate: 0,\r\n    funeralExpensesSI: 100000,\r\n    funeralExpensesRate: 0,\r\n    levyRate: 0.0045,\r\n    stampDuty: { \"New Business\": 40, \"Renewal Business\": 0 },\r\n    excessText: {\r\n      B: \"Time excess - 7 days\", C: \"5% each & every loss, minimum KES 5,000\",\r\n      D: \"1% of sum insured per item, minimum KES 5,000\", E: \"5% each & every loss, minimum KES 5,000\",\r\n      F: \"5% each & every loss, minimum KES 5,000\", G: \"5% each & every loss, minimum KES 5,000\",\r\n      H: \"10% each & every loss, minimum KES 10,000\", I: \"10% each & every loss, minimum KES 10,000\",\r\n      J: \"10% each & every loss, minimum KES 10,000\", K: \"1% each & every loss, minimum KES 5,000\",\r\n      L: \"Time excess - 7 days\", M: \"KES 5,000 each and every claim, excluding funeral expenses\",\r\n      N: \"KES 25,000 each and every claim\", O: \"Car park excess of KES 2,000 each and every claim\"\r\n    }\r\n  };\r\n  \/* --------------------------------------------------------------\r\n     Occupation matching \u2014 normalized (trim \/ collapse whitespace \/\r\n     case-insensitive) so a stray space or different casing in the\r\n     typed occupation doesn't silently zero out the Fire & Allied\r\n     Perils rate. matchOccupation() returns null when nothing in\r\n     RATES.occupations matches, so callers can warn instead of\r\n     quietly pricing at KES 0.\r\n     -------------------------------------------------------------- *\/\r\n  var occByNorm = {};\r\n  function normOcc(s) { return String(s || '').trim().toLowerCase().replace(\/\\s+\/g, ' '); }\r\n  RATES.occupations.forEach(function (o) { occByNorm[normOcc(o[0])] = { name: o[0], rate: o[1] }; });\r\n  function matchOccupation(input) { return occByNorm[normOcc(input)] || null; }\r\n\r\n  \/* ============================================================\r\n     STATE\r\n     ============================================================ *\/\r\n  var state = {\r\n    client: { name:'', phone:'', email:'', address:'', occupation:'', businessType:'New Business', intermediaryType:'Broker' },\r\n    A: {\r\n      items: [\r\n        { key:'buildings', label:'Buildings', si:0 },\r\n        { key:'ffe', label:'Furniture, Fixtures & Fittings', si:0 },\r\n        { key:'stock', label:'Stock in Trade', si:0 },\r\n        { key:'plant', label:'Plant & Machinery', si:0 },\r\n        { key:'other', label:'All Other Contents', si:0 }\r\n      ],\r\n      extraItems: [],\r\n      extRemoval: { enabled:false, si:0 },\r\n      extElectrical: { enabled:false }\r\n    },\r\n    B: { enabled:false, indemnityMonths:6, items:{ grossProfit:0, wages:0, auditFees:0, icow:0, rentReceivable:0, rentPayable:0 } },\r\n    C: { enabled:false, declaredValue:0, firstLossOption:'Without First Loss' },\r\n    D: { enabled:false, items:{ compAccessories:0, nonComputer:0, compSoftware:0, icow:0 } },\r\n    E: { enabled:false, territorial:'Kenya Only', items:{ laptops:0, cameras:0, other:0 } },\r\n    F: { enabled:false, items:{ toFromBank:0, duringHours:0, outsideHours:0, inHands:0, inSafe:0, damageToSafe:0, estAnnualCarry:0 } },\r\n    G: { enabled:false, si:0 },\r\n    H: { enabled:false, aggregateLimit:0, anyOneClaim:0, perCapitaEmployees:0 },\r\n    I: { enabled:false, anyOneLoad:0, estAnnualCarry:0, extendBeyondKenya:false, pvtExtension:false },\r\n    J: { enabled:false, anyOneCarry:0, estAnnualCarry:0, extendBeyondKenya:false, pvtExtension:false },\r\n    K: { enabled:false, materialDamage:0, ownSurrounding:0, thirdPartyLiability:0 },\r\n    L: { enabled:false, indemnityMonths:12, items:{ grossProfit:0, wages:0, auditFees:0, icow:0, rentReceivable:0, rentPayable:0 } },\r\n    M: { enabled:false, employees:{ office:{count:0,salary:0}, general:{count:0,salary:0}, machinists:{count:0,salary:0} }, gpaExtension:false, pvtExtension:false },\r\n    N: { enabled:false, option:'Option A' },\r\n    O: { enabled:false, si:0, foodDrinkExt:false },\r\n    P: { enabled:false, keymen:[{name:'',position:'',si:0},{name:'',position:'',si:0},{name:'',position:'',si:0},{name:'',position:'',si:0}], criticalIllness:false, funeralExpenses:false },\r\n    Q: { enabled:false, pvtExtension:false, pvtRiskDescription:'Commercial Building in own compound', sections:{A:true,B:false,D:false,E:false,G:false} }\r\n  };\r\n\r\n  var LABELS = {\r\n    B: \"Business Interruption\", C: \"Burglary\", D: \"Electronic Equipment\", E: \"All Risks\",\r\n    F: \"Money\", G: \"Plate Glass\", H: \"Fidelity Guarantee\", I: \"Goods in Transit\",\r\n    J: \"Carriers Liability\", K: \"Machinery Breakdown\", L: \"Machinery Breakdown \u2014 Loss of Profits\",\r\n    M: \"WIBA & WIBA Plus\", N: \"Employer's Liability\", O: \"Public Liability\", P: \"Keyman\",\r\n    Q: \"Terrorism & Political Risks\"\r\n  };\r\n  var SUB = {\r\n    B:\"Cover for loss of income while you can't trade\", C:\"Theft involving forcible\/violent entry\",\r\n    D:\"Computers, non-computer electronics & software\", E:\"Portable items \u2014 laptops, cameras, phones\",\r\n    F:\"Cash in transit, on premises or in a safe\", G:\"Glass within your premises\",\r\n    H:\"Loss from employee dishonesty\", I:\"Goods while being transported\",\r\n    J:\"Liability as a carrier of others' goods\", K:\"Sudden mechanical\/electrical breakdown\",\r\n    L:\"Loss of profit following a machinery breakdown\", M:\"Work injury benefits for employees\",\r\n    N:\"Employer's liability limits, priced off WIBA\", O:\"Third-party injury or property damage claims\",\r\n    P:\"Cover on the life of key personnel\", Q:\"Terrorism, sabotage and political violence cover\"\r\n  };\r\n\r\n  \/* ============================================================\r\n     HELPERS\r\n     ============================================================ *\/\r\n  function num(v) { var n = parseFloat(v); return isNaN(n) ? 0 : n; }\r\n  function fmt(n) { return 'KES ' + (n || 0).toLocaleString('en-KE', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); }\r\n  function esc(s) { return String(s == null ? '' : s).replace(\/[&<>\"']\/g, function (c) { return ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'})[c]; }); }\r\n  function $(sel, ctx) { return (ctx || root).querySelector(sel); }\r\n  function $all(sel, ctx) { return Array.prototype.slice.call((ctx || root).querySelectorAll(sel)); }\r\n\r\n  \/* ============================================================\r\n     CALCULATIONS \u2014 mirrors the workbook formulas exactly\r\n     ============================================================ *\/\r\n  function calcA() {\r\n    var occMatch = matchOccupation(state.client.occupation);\r\n    var rate = occMatch ? occMatch.rate : 0;\r\n    var unmatched = !occMatch && !!state.client.occupation;\r\n    var all = state.A.items.concat(state.A.extraItems);\r\n    var totalSI = all.reduce(function (s, i) { return s + num(i.si); }, 0);\r\n    var refer = totalSI > RATES.fireMaxSI;\r\n    var itemResults = all.map(function (i) { return { label: i.label, si: num(i.si), premium: refer ? null : rate * num(i.si) }; });\r\n    var extRemovalPrem = 0;\r\n    if (state.A.extRemoval.enabled) extRemovalPrem = refer ? 0 : (rate - RATES.removalOfDebrisDelta) * num(state.A.extRemoval.si);\r\n    var extElectricalSI = totalSI;\r\n    var extElectricalPrem = 0;\r\n    if (state.A.extElectrical.enabled) extElectricalPrem = refer ? 0 : RATES.electricalClauseRate * extElectricalSI;\r\n    var sectionTotal = refer ? 0 : itemResults.reduce(function (s, i) { return s + (i.premium || 0); }, 0) + extRemovalPrem + extElectricalPrem;\r\n    return { rate: rate, totalSI: totalSI, refer: refer, itemResults: itemResults, extRemovalPrem: extRemovalPrem, extElectricalSI: extElectricalSI, extElectricalPrem: extElectricalPrem, sectionTotal: sectionTotal, unmatched: unmatched, deductible: occMatch ? (RATES.deductibles[occMatch.name] || 'None') : 'None' };\r\n  }\r\n\r\n  function calcSimpleItemSection(cfg) {\r\n    \/\/ cfg: {enabled, items:{key:val}, labels:{key:label}, rate: number|fn(key), cap}\r\n    if (!cfg.enabled) return { totalSI: 0, refer: false, itemResults: [], sectionTotal: 0 };\r\n    var keys = Object.keys(cfg.labels);\r\n    var totalSI = keys.reduce(function (s, k) { return s + num(cfg.items[k]); }, 0);\r\n    var refer = totalSI > cfg.cap;\r\n    var itemResults = keys.map(function (k) {\r\n      var r = typeof cfg.rate === 'function' ? cfg.rate(k) : cfg.rate;\r\n      return { key: k, label: cfg.labels[k], si: num(cfg.items[k]), premium: refer ? null : r * num(cfg.items[k]) };\r\n    });\r\n    var sectionTotal = refer ? 0 : itemResults.reduce(function (s, i) { return s + (i.premium || 0); }, 0);\r\n    return { totalSI: totalSI, refer: refer, itemResults: itemResults, sectionTotal: sectionTotal };\r\n  }\r\n\r\n  function calcB() {\r\n    var r = calcSimpleItemSection({\r\n      enabled: state.B.enabled, items: state.B.items,\r\n      labels: { grossProfit:'Gross profit', wages:'Wages and salaries of key permanent staff', auditFees:'Audit fees', icow:'Increased cost of working', rentReceivable:'Rent receivable', rentPayable:'Rent payable' },\r\n      rate: (matchOccupation(state.client.occupation) || {}).rate || 0, cap: RATES.fireMaxSI\r\n    });\r\n    var discount = RATES.indemnityDiscount[state.B.indemnityMonths] || 0;\r\n    if (!r.refer && state.B.enabled) {\r\n      r.itemResults = r.itemResults.map(function (i) { return Object.assign({}, i, { premium: i.premium * (1 - discount) }); });\r\n      r.sectionTotal = r.itemResults.reduce(function (s, i) { return s + (i.premium || 0); }, 0);\r\n    }\r\n    r.discount = discount;\r\n    return r;\r\n  }\r\n\r\n  function calcC() {\r\n    if (!state.C.enabled) return { refer: false, sectionTotal: 0, declaredValue: 0 };\r\n    var dv = num(state.C.declaredValue);\r\n    var refer = dv > RATES.fireMaxSI;\r\n    var opt = RATES.firstLossOptions.filter(function (o) { return o[0] === state.C.firstLossOption; })[0] || RATES.firstLossOptions[0];\r\n    var premium = refer ? 0 : RATES.burglaryRate * dv * opt[1];\r\n    return { declaredValue: dv, refer: refer, firstLossPct: opt[1], premium: premium, sectionTotal: premium };\r\n  }\r\n\r\n  function calcD() {\r\n    return calcSimpleItemSection({\r\n      enabled: state.D.enabled, items: state.D.items,\r\n      labels: { compAccessories:'Computer & Accessories \u2014 Material Damage', nonComputer:'Non-Computer Electronic Equipment', compSoftware:'Computer Software & System', icow:'Increased cost of working' },\r\n      rate: RATES.electronicEquipmentRate, cap: RATES.fireMaxSI\r\n    });\r\n  }\r\n\r\n  function calcE() {\r\n    return calcSimpleItemSection({\r\n      enabled: state.E.enabled, items: state.E.items,\r\n      labels: { laptops:'Laptops, Tablets and Accessories', cameras:'Cameras and Mobile Phones', other:'Other Items' },\r\n      rate: RATES.allRisksTerritorial[state.E.territorial] || 0, cap: RATES.fireMaxSI\r\n    });\r\n  }\r\n\r\n  function calcF() {\r\n    return calcSimpleItemSection({\r\n      enabled: state.F.enabled, items: state.F.items,\r\n      labels: { toFromBank:'Money to and from bank', duringHours:'Money in premises during business hours', outsideHours:'Money in premises outside business hours', inHands:'Money in hands of authorised personnel', inSafe:'Money in safe or strong room', damageToSafe:'Damage to safe', estAnnualCarry:'Estimated annual carry' },\r\n      rate: function (k) { return k === 'estAnnualCarry' ? RATES.estAnnualCarryRate : RATES.moneyGeneralRate; },\r\n      cap: RATES.fireMaxSI\r\n    });\r\n  }\r\n\r\n  function calcG() {\r\n    if (!state.G.enabled) return { refer: false, sectionTotal: 0, si: 0 };\r\n    var si = num(state.G.si);\r\n    var refer = si > RATES.fireMaxSI;\r\n    var premium = refer ? 0 : RATES.plateGlassRate * si;\r\n    return { si: si, refer: refer, premium: premium, sectionTotal: premium };\r\n  }\r\n\r\n  function calcH() {\r\n    if (!state.H.enabled) return { refer: false, sectionTotal: 0 };\r\n    var agg = num(state.H.aggregateLimit), any1 = num(state.H.anyOneClaim), pc = num(state.H.perCapitaEmployees);\r\n    var refer = (agg + any1) > RATES.fidelityMaxSI;\r\n    var aggPrem = refer ? null : RATES.fidelityGeneralRate * agg;\r\n    var anyPrem = refer ? null : RATES.fidelityGeneralRate * any1;\r\n    var pcPrem = refer ? null : RATES.fidelityPerCapitaRate * pc;\r\n    var sectionTotal = refer ? 0 : (aggPrem + anyPrem + pcPrem);\r\n    return { agg: agg, any1: any1, pc: pc, refer: refer, aggPrem: aggPrem, anyPrem: anyPrem, pcPrem: pcPrem, sectionTotal: sectionTotal };\r\n  }\r\n\r\n  function calcI() {\r\n    if (!state.I.enabled) return { refer: false, sectionTotal: 0, totalSI: 0, baseTotal: 0 };\r\n    var load = num(state.I.anyOneLoad), carry = num(state.I.estAnnualCarry);\r\n    var totalSI = load + carry;\r\n    var refer = totalSI > RATES.fireMaxSI;\r\n    var loadPrem = refer ? null : RATES.goodsAnyOneLoadRate * load;\r\n    var carryPrem = refer ? null : RATES.estAnnualCarryRate * carry;\r\n    var baseTotal = refer ? 0 : (loadPrem + carryPrem);\r\n    var terExt = state.I.extendBeyondKenya ? RATES.territorialExtRate * baseTotal : 0;\r\n    var pvtExt = state.I.pvtExtension ? RATES.pvtExtRate * baseTotal : 0;\r\n    var sectionTotal = refer ? 0 : (baseTotal + terExt + pvtExt);\r\n    return { load: load, carry: carry, totalSI: totalSI, refer: refer, loadPrem: loadPrem, carryPrem: carryPrem, baseTotal: baseTotal, terExt: terExt, pvtExt: pvtExt, sectionTotal: sectionTotal };\r\n  }\r\n\r\n  function calcJ() {\r\n    if (!state.J.enabled) return { refer: false, sectionTotal: 0, totalSI: 0, baseTotal: 0 };\r\n    var anyC = num(state.J.anyOneCarry), estC = num(state.J.estAnnualCarry);\r\n    var totalSI = anyC + estC;\r\n    var refer = totalSI > RATES.fireMaxSI;\r\n    var anyPrem = refer ? null : RATES.carriersAnyOneCarryRate * anyC;\r\n    var estPrem = refer ? null : RATES.estAnnualCarryRate * estC;\r\n    var baseTotal = refer ? 0 : (anyPrem + estPrem);\r\n    var terExt = state.J.extendBeyondKenya ? RATES.territorialExtRate * baseTotal : 0;\r\n    var pvtExt = state.J.pvtExtension ? RATES.pvtExtRate * baseTotal : 0;\r\n    var sectionTotal = refer ? 0 : (baseTotal + terExt + pvtExt);\r\n    return { anyC: anyC, estC: estC, totalSI: totalSI, refer: refer, anyPrem: anyPrem, estPrem: estPrem, baseTotal: baseTotal, terExt: terExt, pvtExt: pvtExt, sectionTotal: sectionTotal };\r\n  }\r\n\r\n  function calcK() {\r\n    if (!state.K.enabled) return { refer: false, sectionTotal: 0 };\r\n    var md = num(state.K.materialDamage);\r\n    var ownEntered = num(state.K.ownSurrounding), tplEntered = num(state.K.thirdPartyLiability);\r\n    var mdApplied = Math.min(md, RATES.fireMaxSI);\r\n    var ownCap = RATES.machineryOwnSurroundingCapPct * md;\r\n    var ownApplied = Math.min(ownEntered, ownCap);\r\n    var tplCap = RATES.machineryTPLCapPct * md;\r\n    var tplApplied = Math.min(tplEntered, tplCap);\r\n    var refer = (mdApplied + ownApplied + tplApplied) > RATES.fireMaxSI;\r\n    var mdPrem = refer ? null : RATES.machineryMaterialDamageRate * mdApplied;\r\n    var ownPrem = refer ? null : RATES.machineryOwnSurroundingRate * ownApplied;\r\n    var tplPrem = refer ? null : RATES.machineryTPLRate * tplApplied;\r\n    var sectionTotal = refer ? 0 : (mdPrem + ownPrem + tplPrem);\r\n    return { md: md, mdApplied: mdApplied, ownEntered: ownEntered, ownCap: ownCap, ownApplied: ownApplied, tplEntered: tplEntered, tplCap: tplCap, tplApplied: tplApplied, refer: refer, mdPrem: mdPrem, ownPrem: ownPrem, tplPrem: tplPrem, sectionTotal: sectionTotal };\r\n  }\r\n\r\n  function calcL() {\r\n    var r = calcSimpleItemSection({\r\n      enabled: state.L.enabled, items: state.L.items,\r\n      labels: { grossProfit:'Gross profit', wages:'Wages and salaries of key permanent staff', auditFees:'Audit fees', icow:'Increased cost of working', rentReceivable:'Rent receivable', rentPayable:'Rent payable' },\r\n      rate: RATES.machineryMaterialDamageRate, cap: RATES.fireMaxSI\r\n    });\r\n    var discount = RATES.indemnityDiscount[state.L.indemnityMonths] || 0;\r\n    if (!r.refer && state.L.enabled) {\r\n      r.itemResults = r.itemResults.map(function (i) { return Object.assign({}, i, { premium: i.premium * (1 - discount) }); });\r\n      r.sectionTotal = r.itemResults.reduce(function (s, i) { return s + (i.premium || 0); }, 0);\r\n    }\r\n    r.discount = discount;\r\n    return r;\r\n  }\r\n\r\n  function calcM() {\r\n    if (!state.M.enabled) return { sectionTotal: 0, premiumSubtotal: 0, itemResults: [] };\r\n    var cats = [\r\n      { key:'office', label:'Office & clerical' },\r\n      { key:'general', label:'General workers' },\r\n      { key:'machinists', label:'Machinists, drivers, watchmen & builders' }\r\n    ];\r\n    var itemResults = cats.map(function (c) {\r\n      var e = state.M.employees[c.key];\r\n      return { label: c.label, count: num(e.count), salary: num(e.salary), premium: RATES.wibaRates[c.label] * num(e.salary) };\r\n    });\r\n    var premiumSubtotal = itemResults.reduce(function (s, i) { return s + i.premium; }, 0);\r\n    var gpaPrem = state.M.gpaExtension ? RATES.gpaLoadingRate * premiumSubtotal : 0;\r\n    var pvtPrem = state.M.pvtExtension ? RATES.pvtExtRate * (premiumSubtotal + gpaPrem) : 0;\r\n    var sectionTotal = premiumSubtotal + gpaPrem + pvtPrem;\r\n    return { itemResults: itemResults, premiumSubtotal: premiumSubtotal, gpaPrem: gpaPrem, pvtPrem: pvtPrem, sectionTotal: sectionTotal };\r\n  }\r\n\r\n  function calcN(mResult) {\r\n    if (!state.N.enabled) return { sectionTotal: 0 };\r\n    var opt = RATES.elOptions.filter(function (o) { return o[0] === state.N.option; })[0] || RATES.elOptions[0];\r\n    var premium = opt[1] * mResult.premiumSubtotal;\r\n    return { option: opt, premium: premium, sectionTotal: premium };\r\n  }\r\n\r\n  function calcO() {\r\n    if (!state.O.enabled) return { refer: false, sectionTotal: 0, si: 0 };\r\n    var si = num(state.O.si);\r\n    var refer = si > RATES.fireMaxSI;\r\n    var basePrem = refer ? 0 : RATES.publicLiabilityRate * si;\r\n    var foodPrem = state.O.foodDrinkExt ? RATES.foodDrinkExtRate * basePrem : 0;\r\n    var sectionTotal = refer ? 0 : (basePrem + foodPrem);\r\n    return { si: si, refer: refer, basePrem: basePrem, foodPrem: foodPrem, sectionTotal: sectionTotal };\r\n  }\r\n\r\n  function calcP() {\r\n    if (!state.P.enabled) return { refer: false, sectionTotal: 0, totalSI: 0, itemResults: [] };\r\n    var totalSI = state.P.keymen.reduce(function (s, k) { return s + num(k.si); }, 0);\r\n    var refer = totalSI > RATES.keymanMaxSI;\r\n    var itemResults = state.P.keymen.map(function (k) { return { name: k.name, position: k.position, si: num(k.si), premium: refer ? null : RATES.keymanRate * num(k.si) }; });\r\n    var ciSI = 0, ciPrem = 0, feSI = 0, fePrem = 0;\r\n    if (state.P.criticalIllness) { ciSI = Math.min(RATES.criticalIllnessMaxSI, RATES.criticalIllnessCapPct * totalSI); ciPrem = ciSI * RATES.criticalIllnessRate; }\r\n    if (state.P.funeralExpenses) { feSI = RATES.funeralExpensesSI; fePrem = feSI * RATES.funeralExpensesRate; }\r\n    var sectionTotal = refer ? 0 : itemResults.reduce(function (s, i) { return s + (i.premium || 0); }, 0) + ciPrem + fePrem;\r\n    return { totalSI: totalSI, refer: refer, itemResults: itemResults, ciSI: ciSI, ciPrem: ciPrem, feSI: feSI, fePrem: fePrem, sectionTotal: sectionTotal };\r\n  }\r\n\r\n  function calcQ(aR, bR, dR, eR, gR) {\r\n    if (!state.Q.enabled) return { sectionTotal: 0, totalSI: 0, rows: [] };\r\n    var pvt = RATES.pvtRisks.filter(function (p) { return p[0] === state.Q.pvtRiskDescription; })[0];\r\n    var rate = pvt ? pvt[1] : 0;\r\n    var overallYes = state.Q.pvtExtension;\r\n    var map = { A: aR.totalSI || 0, B: bR.totalSI || 0, D: dR.totalSI || 0, E: eR.totalSI || 0, G: gR.si || 0 };\r\n    var labels = { A:'Section A \u2014 Fire & Allied Perils', B:'Section B \u2014 Business Interruption', D:'Section D \u2014 Electronic Equipment', E:'Section E \u2014 All Risks', G:'Section G \u2014 Plate Glass' };\r\n    var rows = Object.keys(map).map(function (k) {\r\n      var included = overallYes && state.Q.sections[k];\r\n      var si = included ? map[k] : 0;\r\n      return { key: k, label: labels[k], included: included, si: si, premium: rate * si };\r\n    });\r\n    var totalSI = rows.reduce(function (s, r) { return s + r.si; }, 0);\r\n    var sectionTotal = rows.reduce(function (s, r) { return s + r.premium; }, 0);\r\n    return { rate: rate, rows: rows, totalSI: totalSI, sectionTotal: sectionTotal };\r\n  }\r\n\r\n  function recalcAll() {\r\n    var a = calcA(), b = calcB(), c = calcC(), d = calcD(), e = calcE(), f = calcF(), g = calcG(), h = calcH();\r\n    var i = calcI(), j = calcJ(), k = calcK(), l = calcL(), m = calcM(), n = calcN(m), o = calcO(), p = calcP();\r\n    var q = calcQ(a, b, d, e, g);\r\n    var totals = { A:a.sectionTotal, B:b.sectionTotal, C:c.sectionTotal, D:d.sectionTotal, E:e.sectionTotal, F:f.sectionTotal, G:g.sectionTotal, H:h.sectionTotal, I:i.sectionTotal, J:j.sectionTotal, K:k.sectionTotal, L:l.sectionTotal, M:m.sectionTotal, N:n.sectionTotal, O:o.sectionTotal, P:p.sectionTotal, Q:q.sectionTotal };\r\n    var totalBasicPremium = Object.keys(totals).reduce(function (s, key) { return s + (totals[key] || 0); }, 0);\r\n    var levies = totalBasicPremium * RATES.levyRate;\r\n    var stampDuty = RATES.stampDuty[state.client.businessType] || 0;\r\n    var totalPayable = totalBasicPremium + levies + stampDuty;\r\n    return { a:a,b:b,c:c,d:d,e:e,f:f,g:g,h:h,i:i,j:j,k:k,l:l,m:m,n:n,o:o,p:p,q:q, totals: totals, totalBasicPremium: totalBasicPremium, levies: levies, stampDuty: stampDuty, totalPayable: totalPayable };\r\n  }\r\n\r\n  \/* ============================================================\r\n     BUILD STATIC MARKUP (occupation list, item rows, cards)\r\n     ============================================================ *\/\r\n  var occDatalist = $('#cf-occupation-list');\r\n  RATES.occupations.forEach(function (o) {\r\n    var opt = document.createElement('option');\r\n    opt.value = o[0];\r\n    occDatalist.appendChild(opt);\r\n  });\r\n\r\n  function buildSimpleRow(container, item, onInput, removable) {\r\n    var row = document.createElement('div');\r\n    row.className = 'gem-item-row';\r\n    var labelHtml = item.editable\r\n      ? '<input type=\"text\" class=\"gem-row-label\" placeholder=\"Describe this item\" value=\"' + esc(item.label) + '\">'\r\n      : '<span class=\"gem-item-row__label\">' + esc(item.label) + '<\/span>';\r\n    row.innerHTML = labelHtml +\r\n      '<input type=\"number\" class=\"gem-row-si\" min=\"0\" step=\"1000\" value=\"' + (item.si || 0) + '\">' +\r\n      '<span class=\"gem-item-premium\">' + fmt(0) + '<\/span>' +\r\n      (removable ? '<button type=\"button\" class=\"gem-item-row__remove\" aria-label=\"Remove item\">&times;<\/button>' : '<span><\/span>');\r\n    container.appendChild(row);\r\n    var siInput = row.querySelector('.gem-row-si');\r\n    var labelInput = row.querySelector('.gem-row-label');\r\n    siInput.addEventListener('input', function () { item.si = num(siInput.value); onInput(); });\r\n    if (labelInput) labelInput.addEventListener('input', function () { item.label = labelInput.value; onInput(); });\r\n    if (removable) row.querySelector('.gem-item-row__remove').addEventListener('click', function () { onInput('remove'); });\r\n    return row;\r\n  }\r\n\r\n  \/\/ ---- Section A rows ----\r\n  var aFixedWrap = $('#a-fixed-items');\r\n  state.A.items.forEach(function (item) { buildSimpleRow(aFixedWrap, item, function () { render(); }, false); });\r\n\r\n  function rebuildAExtras() {\r\n    var wrap = $('#a-extra-items');\r\n    wrap.innerHTML = '';\r\n    state.A.extraItems.forEach(function (item, idx) {\r\n      buildSimpleRow(wrap, item, function (action) {\r\n        if (action === 'remove') { state.A.extraItems.splice(idx, 1); rebuildAExtras(); }\r\n        render();\r\n      }, true);\r\n    });\r\n    $('#a-add-item').style.display = state.A.extraItems.length >= 10 ? 'none' : 'inline-block';\r\n  }\r\n  rebuildAExtras();\r\n  $('#a-add-item').addEventListener('click', function () {\r\n    state.A.extraItems.push({ key: 'extra' + Date.now(), label: '', si: 0, editable: true });\r\n    rebuildAExtras(); render();\r\n  });\r\n  state.A.items.forEach(function (i) { i.editable = false; });\r\n  state.A.extraItems.forEach(function (i) { i.editable = true; });\r\n\r\n  $('#a-ext-removal-toggle').addEventListener('change', function (e) { state.A.extRemoval.enabled = e.target.checked; $('#a-ext-removal-fields').style.display = e.target.checked ? 'block' : 'none'; render(); });\r\n  $('#a-ext-removal-si').addEventListener('input', function (e) { state.A.extRemoval.si = num(e.target.value); render(); });\r\n  $('#a-ext-electrical-toggle').addEventListener('change', function (e) { state.A.extElectrical.enabled = e.target.checked; $('#a-ext-electrical-fields').style.display = e.target.checked ? 'block' : 'none'; render(); });\r\n\r\n  \/* ---- Generic card builder for optional sections ---- *\/\r\n  function cardShell(key, bodyHtml) {\r\n    var el = $('#card-' + key);\r\n    el.innerHTML =\r\n      '<div class=\"gem-card__head\">' +\r\n        '<label class=\"gem-switch\" title=\"Add ' + esc(LABELS[key]) + ' to your quote\"><input type=\"checkbox\" id=\"toggle-' + key + '\"><span class=\"gem-switch__track\"><\/span><\/label>' +\r\n        '<button type=\"button\" class=\"gem-card__titlebtn\" aria-expanded=\"false\">' +\r\n          '<span class=\"gem-card__title\">' + esc(LABELS[key]) + '<small>' + esc(SUB[key]) + '<\/small><\/span>' +\r\n          '<span class=\"gem-card__premium\" id=\"premium-' + key + '\">' + fmt(0) + '<\/span>' +\r\n          '<svg class=\"gem-card__chev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>' +\r\n        '<\/button>' +\r\n      '<\/div>' +\r\n      '<div class=\"gem-card__body\" id=\"body-' + key + '\">' + bodyHtml + '<\/div>';\r\n\r\n    var toggle = $('#toggle-' + key, el);\r\n    var titleBtn = el.querySelector('.gem-card__titlebtn');\r\n    function setOpen(open) {\r\n      el.classList.toggle('is-open', open);\r\n      titleBtn.setAttribute('aria-expanded', open ? 'true' : 'false');\r\n    }\r\n    toggle.addEventListener('change', function () {\r\n      state[key].enabled = toggle.checked;\r\n      setOpen(toggle.checked);\r\n      render();\r\n    });\r\n    titleBtn.addEventListener('click', function () {\r\n      if (!toggle.checked) { toggle.checked = true; toggle.dispatchEvent(new Event('change')); }\r\n      else { setOpen(!el.classList.contains('is-open')); }\r\n    });\r\n    return el;\r\n  }\r\n\r\n  function excessLine(key) { return '<p class=\"gem-excess-note\">Excess: ' + esc(RATES.excessText[key]) + '<\/p>'; }\r\n  function referBanner(key, text) { return '<div class=\"gem-refer\" id=\"refer-' + key + '\">' + text + '<\/div>'; }\r\n  function totalLine(key, label) { return '<div class=\"gem-total-line\"><span>' + (label || 'Section total') + '<\/span><span id=\"total-' + key + '\">' + fmt(0) + '<\/span><\/div>'; }\r\n  function fieldNum(id, label, hint) {\r\n    return '<div class=\"gem-field\"><label for=\"' + id + '\">' + esc(label) + (hint ? ' <span class=\"gem-hint\">' + esc(hint) + '<\/span>' : '') + '<\/label>' +\r\n      '<input type=\"number\" id=\"' + id + '\" min=\"0\" step=\"1000\" value=\"0\"><\/div>';\r\n  }\r\n  function itemsHead() { return '<div class=\"gem-items__head\"><span>Description<\/span><span>Sum insured (KES)<\/span><span>Premium<\/span><span><\/span><\/div>'; }\r\n  function checkRow(id, label) {\r\n    return '<div class=\"gem-check\"><label class=\"gem-switch\"><input type=\"checkbox\" id=\"' + id + '\"><span class=\"gem-switch__track\"><\/span><\/label><label for=\"' + id + '\">' + esc(label) + '<\/label><\/div>';\r\n  }\r\n\r\n  \/\/ ---- B: Business Interruption ----\r\n  cardShell('B',\r\n    '<p class=\"gem-panel__note\">Rated on your Fire &amp; Allied Perils occupation rate, with a discount if you choose a 6-month indemnity period.<\/p>' +\r\n    '<div class=\"gem-field\" style=\"max-width:260px;\"><label for=\"B-indemnity\">Indemnity period<\/label><select id=\"B-indemnity\"><option value=\"6\">6 months<\/option><option value=\"12\" selected>12 months<\/option><\/select><\/div>' +\r\n    itemsHead() + '<div id=\"B-items\"><\/div>' +\r\n    excessLine('B') + referBanner('B', 'Total sum insured exceeds KES 500,000,000 \u2014 please refer this risk to Geminia Underwriting.') + totalLine('B')\r\n  );\r\n  var bItemDefs = [['grossProfit','Gross profit'],['wages','Wages and salaries of key permanent staff'],['auditFees','Audit fees'],['icow','Increased cost of working'],['rentReceivable','Rent receivable'],['rentPayable','Rent payable']];\r\n  var bWrap = $('#B-items');\r\n  bItemDefs.forEach(function (d) {\r\n    var item = { label: d[1], si: 0 };\r\n    buildSimpleRow(bWrap, item, function () { state.B.items[d[0]] = item.si; render(); }, false);\r\n  });\r\n  $('#B-indemnity').addEventListener('change', function (e) { state.B.indemnityMonths = parseInt(e.target.value, 10); render(); });\r\n\r\n  \/\/ ---- C: Burglary ----\r\n  var flOptionsHtml = RATES.firstLossOptions.map(function (o) { return '<option value=\"' + esc(o[0]) + '\">' + esc(o[0]) + '<\/option>'; }).join('');\r\n  cardShell('C',\r\n    '<div class=\"gem-row2\">' +\r\n      fieldNum('C-declaredValue', 'Full declared value of items (KES)') +\r\n      '<div class=\"gem-field\"><label for=\"C-firstLoss\">First loss option<\/label><select id=\"C-firstLoss\">' + flOptionsHtml + '<\/select><\/div>' +\r\n    '<\/div>' +\r\n    excessLine('C') + referBanner('C', 'Declared value exceeds KES 500,000,000 \u2014 please refer this risk to Geminia Underwriting.') + totalLine('C')\r\n  );\r\n  $('#C-declaredValue').addEventListener('input', function (e) { state.C.declaredValue = num(e.target.value); render(); });\r\n  $('#C-firstLoss').addEventListener('change', function (e) { state.C.firstLossOption = e.target.value; render(); });\r\n\r\n  \/\/ ---- D: Electronic Equipment ----\r\n  cardShell('D', itemsHead() + '<div id=\"D-items\"><\/div>' + excessLine('D') + referBanner('D', 'Total sum insured exceeds KES 500,000,000 \u2014 please refer this risk to Geminia Underwriting.') + totalLine('D'));\r\n  var dItemDefs = [['compAccessories','Computer & Accessories \u2014 Material Damage'],['nonComputer','Non-Computer Electronic Equipment'],['compSoftware','Computer Software & System'],['icow','Increased cost of working']];\r\n  var dWrap = $('#D-items');\r\n  dItemDefs.forEach(function (d) { var item = { label: d[1], si: 0 }; buildSimpleRow(dWrap, item, function () { state.D.items[d[0]] = item.si; render(); }, false); });\r\n\r\n  \/\/ ---- E: All Risks ----\r\n  cardShell('E',\r\n    '<div class=\"gem-field\" style=\"max-width:260px;\"><label for=\"E-territorial\">Territorial limit<\/label><select id=\"E-territorial\"><option>Kenya Only<\/option><option selected>Worldwide<\/option><\/select><\/div>' +\r\n    itemsHead() + '<div id=\"E-items\"><\/div>' + excessLine('E') + referBanner('E', 'Total sum insured exceeds KES 500,000,000 \u2014 please refer this risk to Geminia Underwriting.') + totalLine('E')\r\n  );\r\n  var eItemDefs = [['laptops','Laptops, Tablets and Accessories'],['cameras','Cameras and Mobile Phones'],['other','Other Items']];\r\n  var eWrap = $('#E-items');\r\n  eItemDefs.forEach(function (d) { var item = { label: d[1], si: 0 }; buildSimpleRow(eWrap, item, function () { state.E.items[d[0]] = item.si; render(); }, false); });\r\n  $('#E-territorial').addEventListener('change', function (e) { state.E.territorial = e.target.value; render(); });\r\n\r\n  \/\/ ---- F: Money ----\r\n  cardShell('F',\r\n    '<p class=\"gem-panel__note\">Territorial limit: Kenya Only.<\/p>' +\r\n    itemsHead() + '<div id=\"F-items\"><\/div>' + excessLine('F') + referBanner('F', 'Total sum insured exceeds KES 500,000,000 \u2014 please refer this risk to Geminia Underwriting.') + totalLine('F')\r\n  );\r\n  var fItemDefs = [['toFromBank','Money to and from bank'],['duringHours','Money in premises during business hours'],['outsideHours','Money in premises outside business hours'],['inHands','Money in hands of authorised personnel'],['inSafe','Money in safe or strong room'],['damageToSafe','Damage to safe'],['estAnnualCarry','Estimated annual carry']];\r\n  var fWrap = $('#F-items');\r\n  fItemDefs.forEach(function (d) { var item = { label: d[1], si: 0 }; buildSimpleRow(fWrap, item, function () { state.F.items[d[0]] = item.si; render(); }, false); });\r\n\r\n  \/\/ ---- G: Plate Glass ----\r\n  cardShell('G', fieldNum('G-si', 'Sum insured for all glass within premises (KES)') + excessLine('G') + referBanner('G', 'Sum insured exceeds KES 500,000,000 \u2014 please refer this risk to Geminia Underwriting.') + totalLine('G'));\r\n  $('#G-si').addEventListener('input', function (e) { state.G.si = num(e.target.value); render(); });\r\n\r\n  \/\/ ---- H: Fidelity Guarantee ----\r\n  cardShell('H',\r\n    '<div class=\"gem-row2\">' + fieldNum('H-aggregateLimit', 'Aggregate \/ annual limit (KES)') + fieldNum('H-anyOneClaim', 'Any one claim (KES)') + '<\/div>' +\r\n    fieldNum('H-perCapitaEmployees', 'Per capita \u2014 number of employees', 'rated at KES 250 per employee') +\r\n    excessLine('H') + referBanner('H', 'Aggregate + any-one-claim exceeds KES 5,000,000 \u2014 please refer this risk to Geminia Underwriting.') + totalLine('H')\r\n  );\r\n  $('#H-aggregateLimit').addEventListener('input', function (e) { state.H.aggregateLimit = num(e.target.value); render(); });\r\n  $('#H-anyOneClaim').addEventListener('input', function (e) { state.H.anyOneClaim = num(e.target.value); render(); });\r\n  $('#H-perCapitaEmployees').addEventListener('input', function (e) { state.H.perCapitaEmployees = num(e.target.value); render(); });\r\n\r\n  \/\/ ---- I: Goods in Transit ----\r\n  cardShell('I',\r\n    '<div class=\"gem-row2\">' + fieldNum('I-anyOneLoad', 'Any one load (KES)') + fieldNum('I-estAnnualCarry', 'Estimated annual carry (KES)') + '<\/div>' +\r\n    checkRow('I-extendBeyondKenya', 'Extend territorial limit beyond Kenya (+10% loading)') +\r\n    checkRow('I-pvtExtension', 'Add PVT extension (+20% loading)') +\r\n    excessLine('I') + referBanner('I', 'Total sum insured exceeds KES 500,000,000 \u2014 please refer this risk to Geminia Underwriting.') + totalLine('I')\r\n  );\r\n  $('#I-anyOneLoad').addEventListener('input', function (e) { state.I.anyOneLoad = num(e.target.value); render(); });\r\n  $('#I-estAnnualCarry').addEventListener('input', function (e) { state.I.estAnnualCarry = num(e.target.value); render(); });\r\n  $('#I-extendBeyondKenya').addEventListener('change', function (e) { state.I.extendBeyondKenya = e.target.checked; render(); });\r\n  $('#I-pvtExtension').addEventListener('change', function (e) { state.I.pvtExtension = e.target.checked; render(); });\r\n\r\n  \/\/ ---- J: Carriers Liability ----\r\n  cardShell('J',\r\n    '<div class=\"gem-row2\">' + fieldNum('J-anyOneCarry', 'Any one carry (KES)') + fieldNum('J-estAnnualCarry', 'Estimated annual carry (KES)') + '<\/div>' +\r\n    checkRow('J-extendBeyondKenya', 'Extend territorial limit beyond Kenya (+10% loading)') +\r\n    checkRow('J-pvtExtension', 'Add PVT extension (+20% loading)') +\r\n    excessLine('J') + referBanner('J', 'Total sum insured exceeds KES 500,000,000 \u2014 please refer this risk to Geminia Underwriting.') + totalLine('J')\r\n  );\r\n  $('#J-anyOneCarry').addEventListener('input', function (e) { state.J.anyOneCarry = num(e.target.value); render(); });\r\n  $('#J-estAnnualCarry').addEventListener('input', function (e) { state.J.estAnnualCarry = num(e.target.value); render(); });\r\n  $('#J-extendBeyondKenya').addEventListener('change', function (e) { state.J.extendBeyondKenya = e.target.checked; render(); });\r\n  $('#J-pvtExtension').addEventListener('change', function (e) { state.J.pvtExtension = e.target.checked; render(); });\r\n\r\n  \/\/ ---- K: Machinery Breakdown ----\r\n  cardShell('K',\r\n    fieldNum('K-materialDamage', 'Material damage \u2014 sum insured (KES)') +\r\n    fieldNum('K-ownSurrounding', 'Own surrounding property (KES)', 'capped at 20% of material damage') +\r\n    '<p class=\"gem-excess-note\" id=\"K-own-cap\"><\/p>' +\r\n    fieldNum('K-thirdPartyLiability', 'Third party liability (KES)', 'capped at 20% of material damage') +\r\n    '<p class=\"gem-excess-note\" id=\"K-tpl-cap\"><\/p>' +\r\n    excessLine('K') + referBanner('K', 'Total applied sum insured exceeds KES 500,000,000 \u2014 please refer this risk to Geminia Underwriting.') + totalLine('K')\r\n  );\r\n  $('#K-materialDamage').addEventListener('input', function (e) { state.K.materialDamage = num(e.target.value); render(); });\r\n  $('#K-ownSurrounding').addEventListener('input', function (e) { state.K.ownSurrounding = num(e.target.value); render(); });\r\n  $('#K-thirdPartyLiability').addEventListener('input', function (e) { state.K.thirdPartyLiability = num(e.target.value); render(); });\r\n\r\n  \/\/ ---- L: Machinery Breakdown Loss of Profits ----\r\n  cardShell('L',\r\n    '<p class=\"gem-panel__note\">Rated at the Machinery Breakdown material damage rate, with a discount for a 6-month indemnity period.<\/p>' +\r\n    '<div class=\"gem-field\" style=\"max-width:260px;\"><label for=\"L-indemnity\">Indemnity period<\/label><select id=\"L-indemnity\"><option value=\"6\">6 months<\/option><option value=\"12\" selected>12 months<\/option><\/select><\/div>' +\r\n    itemsHead() + '<div id=\"L-items\"><\/div>' + excessLine('L') + referBanner('L', 'Total sum insured exceeds KES 500,000,000 \u2014 please refer this risk to Geminia Underwriting.') + totalLine('L')\r\n  );\r\n  var lItemDefs = [['grossProfit','Gross profit'],['wages','Wages and salaries of key permanent staff'],['auditFees','Audit fees'],['icow','Increased cost of working'],['rentReceivable','Rent receivable'],['rentPayable','Rent payable']];\r\n  var lWrap = $('#L-items');\r\n  lItemDefs.forEach(function (d) { var item = { label: d[1], si: 0 }; buildSimpleRow(lWrap, item, function () { state.L.items[d[0]] = item.si; render(); }, false); });\r\n  $('#L-indemnity').addEventListener('change', function (e) { state.L.indemnityMonths = parseInt(e.target.value, 10); render(); });\r\n\r\n  \/\/ ---- M: WIBA & WIBA Plus ----\r\n  cardShell('M',\r\n    '<div class=\"gem-items__head\" style=\"grid-template-columns:1.4fr 1fr 1fr 1fr;\"><span>Category<\/span><span>No. of employees<\/span><span>Est. annual salary (KES)<\/span><span>Premium<\/span><\/div>' +\r\n    '<div id=\"M-items\"><\/div>' +\r\n    checkRow('M-gpaExtension', 'Add GPA loading (+40% of WIBA premium)') +\r\n    checkRow('M-pvtExtension', 'Add PVT extension (+20%)') +\r\n    excessLine('M') + totalLine('M')\r\n  );\r\n  var mCats = [['office','Office & clerical'],['general','General workers'],['machinists','Machinists, drivers, watchmen & builders']];\r\n  var mWrap = $('#M-items');\r\n  mCats.forEach(function (c) {\r\n    var row = document.createElement('div');\r\n    row.className = 'gem-item-row';\r\n    row.style.gridTemplateColumns = '1.4fr 1fr 1fr 1fr';\r\n    row.innerHTML = '<span class=\"gem-item-row__label\">' + esc(c[1]) + '<\/span>' +\r\n      '<input type=\"number\" class=\"m-count\" min=\"0\" step=\"1\" value=\"0\">' +\r\n      '<input type=\"number\" class=\"m-salary\" min=\"0\" step=\"1000\" value=\"0\">' +\r\n      '<span class=\"gem-item-premium\">' + fmt(0) + '<\/span>';\r\n    mWrap.appendChild(row);\r\n    row.querySelector('.m-count').addEventListener('input', function (e) { state.M.employees[c[0]].count = num(e.target.value); render(); });\r\n    row.querySelector('.m-salary').addEventListener('input', function (e) { state.M.employees[c[0]].salary = num(e.target.value); render(); });\r\n  });\r\n  $('#M-gpaExtension').addEventListener('change', function (e) { state.M.gpaExtension = e.target.checked; render(); });\r\n  $('#M-pvtExtension').addEventListener('change', function (e) { state.M.pvtExtension = e.target.checked; render(); });\r\n\r\n  \/\/ ---- N: Employer's Liability ----\r\n  var elOptHtml = RATES.elOptions.map(function (o) { return '<option value=\"' + esc(o[0]) + '\">' + esc(o[0]) + ' \u2014 ' + o[1] * 100 + '% loading<\/option>'; }).join('');\r\n  cardShell('N',\r\n    '<p class=\"gem-panel__note\">Priced as a loading on your WIBA &amp; WIBA Plus premium (Section M) \u2014 complete that section first for an accurate figure here.<\/p>' +\r\n    '<div class=\"gem-field\" style=\"max-width:340px;\"><label for=\"N-option\">Limit of liability option<\/label><select id=\"N-option\">' + elOptHtml + '<\/select><\/div>' +\r\n    '<p class=\"gem-excess-note\" id=\"N-limits\"><\/p>' +\r\n    excessLine('N') + totalLine('N')\r\n  );\r\n  $('#N-option').addEventListener('change', function (e) { state.N.option = e.target.value; render(); });\r\n\r\n  \/\/ ---- O: Public Liability ----\r\n  cardShell('O',\r\n    fieldNum('O-si', 'General liability \u2014 any one event\/year (KES)') +\r\n    checkRow('O-foodDrinkExt', 'Add Food & Drink extension (+20% loading)') +\r\n    excessLine('O') + referBanner('O', 'Sum insured exceeds KES 500,000,000 \u2014 please refer this risk to Geminia Underwriting.') + totalLine('O')\r\n  );\r\n  $('#O-si').addEventListener('input', function (e) { state.O.si = num(e.target.value); render(); });\r\n  $('#O-foodDrinkExt').addEventListener('change', function (e) { state.O.foodDrinkExt = e.target.checked; render(); });\r\n\r\n  \/\/ ---- P: Keyman ----\r\n  cardShell('P',\r\n    '<div class=\"gem-items__head\" style=\"grid-template-columns:1fr 1fr 130px 130px;\"><span>Name<\/span><span>Position<\/span><span>Sum insured (KES)<\/span><span>Premium<\/span><\/div>' +\r\n    '<div id=\"P-items\"><\/div>' +\r\n    checkRow('P-criticalIllness', 'Add Critical Illness extension') +\r\n    checkRow('P-funeralExpenses', 'Add Funeral Expenses extension (KES 100,000 cover)') +\r\n    referBanner('P', 'Total keyman sum insured exceeds KES 10,000,000 \u2014 please refer this risk to Geminia Underwriting.') + totalLine('P')\r\n  );\r\n  var pWrap = $('#P-items');\r\n  state.P.keymen.forEach(function (person, idx) {\r\n    var row = document.createElement('div');\r\n    row.className = 'gem-item-row';\r\n    row.style.gridTemplateColumns = '1fr 1fr 130px 130px';\r\n    row.innerHTML = '<input type=\"text\" class=\"p-name\" placeholder=\"Full name\">' +\r\n      '<input type=\"text\" class=\"p-position\" placeholder=\"Position\">' +\r\n      '<input type=\"number\" class=\"p-si\" min=\"0\" step=\"1000\" value=\"0\">' +\r\n      '<span class=\"gem-item-premium\">' + fmt(0) + '<\/span>';\r\n    pWrap.appendChild(row);\r\n    row.querySelector('.p-name').addEventListener('input', function (e) { person.name = e.target.value; render(); });\r\n    row.querySelector('.p-position').addEventListener('input', function (e) { person.position = e.target.value; render(); });\r\n    row.querySelector('.p-si').addEventListener('input', function (e) { person.si = num(e.target.value); render(); });\r\n  });\r\n  $('#P-criticalIllness').addEventListener('change', function (e) { state.P.criticalIllness = e.target.checked; render(); });\r\n  $('#P-funeralExpenses').addEventListener('change', function (e) { state.P.funeralExpenses = e.target.checked; render(); });\r\n\r\n  \/\/ ---- Q: Terrorism & Political Risks ----\r\n  var pvtOptHtml = RATES.pvtRisks.map(function (p) { return '<option value=\"' + esc(p[0]) + '\">' + esc(p[0]) + '<\/option>'; }).join('');\r\n  cardShell('Q',\r\n    '<p class=\"gem-panel__note\">Cover applies to the sums insured of the property sections you select below.<\/p>' +\r\n    checkRow('Q-pvtExtension', 'Add Terrorism & Political Risks extension') +\r\n    '<div class=\"gem-field\"><label for=\"Q-pvtRisk\">PVT risk description<\/label><select id=\"Q-pvtRisk\">' + pvtOptHtml + '<\/select><\/div>' +\r\n    '<div id=\"Q-sections\"><\/div>' +\r\n    totalLine('Q')\r\n  );\r\n  $('#Q-pvtExtension').addEventListener('change', function (e) { state.Q.pvtExtension = e.target.checked; render(); });\r\n  $('#Q-pvtRisk').addEventListener('change', function (e) { state.Q.pvtRiskDescription = e.target.value; render(); });\r\n  var qSectionKeys = ['A', 'B', 'D', 'E', 'G'];\r\n  var qSectionLabels = { A:'Section A \u2014 Fire & Allied Perils', B:'Section B \u2014 Business Interruption', D:'Section D \u2014 Electronic Equipment', E:'Section E \u2014 All Risks', G:'Section G \u2014 Plate Glass' };\r\n  var qWrap = $('#Q-sections');\r\n  qSectionKeys.forEach(function (k) {\r\n    var row = document.createElement('div');\r\n    row.className = 'gem-check';\r\n    row.innerHTML = '<span class=\"gem-switch\"><input type=\"checkbox\" id=\"Q-inc-' + k + '\"' + (state.Q.sections[k] ? ' checked' : '') + '><span class=\"gem-switch__track\"><\/span><\/span>' +\r\n      '<label for=\"Q-inc-' + k + '\">' + esc(qSectionLabels[k]) + ' <span class=\"gem-hint\" id=\"Q-si-' + k + '\"><\/span><\/label>';\r\n    qWrap.appendChild(row);\r\n    row.querySelector('input').addEventListener('change', function (e) { state.Q.sections[k] = e.target.checked; render(); });\r\n  });\r\n\r\n  \/* ============================================================\r\n     RENDER\r\n     ============================================================ *\/\r\n  function setText(id, val) { var el = $('#' + id); if (el) el.textContent = val; }\r\n  function setDisplay(id, show) { var el = $('#' + id); if (el) el.style.display = show ? 'block' : 'none'; }\r\n  function setReferShown(id, shown) { var el = $('#' + id); if (el) el.classList.toggle('is-shown', !!shown); }\r\n\r\n  function updateSimpleSectionRows(wrap, itemResults) {\r\n    var rows = wrap.querySelectorAll('.gem-item-row');\r\n    itemResults.forEach(function (item, idx) {\r\n      var row = rows[idx];\r\n      if (!row) return;\r\n      var span = row.querySelector('.gem-item-premium');\r\n      span.textContent = item.premium === null ? '\u2014' : fmt(item.premium);\r\n    });\r\n  }\r\n\r\n  function render() {\r\n    var R = recalcAll();\r\n\r\n    \/\/ Section A \u2014 occupation match \/ deductible note\r\n    var deductNote = $('#cf-deductible-note');\r\n    if (!state.client.occupation) {\r\n      deductNote.style.display = 'none';\r\n    } else if (R.a.unmatched) {\r\n      deductNote.style.display = 'block';\r\n      deductNote.style.color = 'var(--gem-warn)';\r\n      deductNote.textContent = '\\u26A0 \"' + state.client.occupation + '\" doesn\\u2019t match a listed occupation, so no rate is applied yet \\u2014 pick one from the suggestions.';\r\n    } else {\r\n      deductNote.style.display = 'block';\r\n      deductNote.style.color = '';\r\n      deductNote.textContent = 'Excess\/deductible for this occupation: ' + R.a.deductible;\r\n    }\r\n\r\n    updateSimpleSectionRows($('#a-fixed-items'), R.a.itemResults.slice(0, state.A.items.length));\r\n    updateSimpleSectionRows($('#a-extra-items'), R.a.itemResults.slice(state.A.items.length));\r\n    setText('a-total-si', fmt(R.a.totalSI));\r\n    setText('a-ext-removal-premium', fmt(R.a.extRemovalPrem));\r\n    setText('a-ext-electrical-si', fmt(R.a.extElectricalSI));\r\n    setText('a-ext-electrical-premium', fmt(R.a.extElectricalPrem));\r\n    setText('a-total-premium', fmt(R.a.sectionTotal));\r\n    setReferShown('a-refer', R.a.refer);\r\n\r\n    \/\/ Generic optional sections\r\n    updateSimpleSectionRows($('#B-items'), R.b.itemResults);\r\n    setText('total-B', fmt(R.b.sectionTotal)); setReferShown('refer-B', R.b.refer);\r\n\r\n    setText('total-C', fmt(R.c.sectionTotal || 0)); setReferShown('refer-C', R.c.refer);\r\n\r\n    updateSimpleSectionRows($('#D-items'), R.d.itemResults);\r\n    setText('total-D', fmt(R.d.sectionTotal)); setReferShown('refer-D', R.d.refer);\r\n\r\n    updateSimpleSectionRows($('#E-items'), R.e.itemResults);\r\n    setText('total-E', fmt(R.e.sectionTotal)); setReferShown('refer-E', R.e.refer);\r\n\r\n    updateSimpleSectionRows($('#F-items'), R.f.itemResults);\r\n    setText('total-F', fmt(R.f.sectionTotal)); setReferShown('refer-F', R.f.refer);\r\n\r\n    setText('total-G', fmt(R.g.sectionTotal || 0)); setReferShown('refer-G', R.g.refer);\r\n\r\n    setText('total-H', fmt(R.h.sectionTotal || 0)); setReferShown('refer-H', R.h.refer);\r\n\r\n    setText('total-I', fmt(R.i.sectionTotal || 0)); setReferShown('refer-I', R.i.refer);\r\n    setText('total-J', fmt(R.j.sectionTotal || 0)); setReferShown('refer-J', R.j.refer);\r\n\r\n    setText('K-own-cap', 'Maximum allowed: ' + fmt(R.k.ownCap || 0) + ' \u2014 applied: ' + fmt(R.k.ownApplied || 0));\r\n    setText('K-tpl-cap', 'Maximum allowed: ' + fmt(R.k.tplCap || 0) + ' \u2014 applied: ' + fmt(R.k.tplApplied || 0));\r\n    setText('total-K', fmt(R.k.sectionTotal || 0)); setReferShown('refer-K', R.k.refer);\r\n\r\n    updateSimpleSectionRows($('#L-items'), R.l.itemResults);\r\n    setText('total-L', fmt(R.l.sectionTotal)); setReferShown('refer-L', R.l.refer);\r\n\r\n    \/\/ M\r\n    var mRows = $all('#M-items .gem-item-row');\r\n    R.m.itemResults && R.m.itemResults.forEach(function (item, idx) {\r\n      var row = mRows[idx]; if (!row) return;\r\n      row.querySelector('.gem-item-premium').textContent = fmt(item.premium);\r\n    });\r\n    setText('total-M', fmt(R.m.sectionTotal || 0));\r\n\r\n    \/\/ N\r\n    var optN = RATES.elOptions.filter(function (o) { return o[0] === state.N.option; })[0] || RATES.elOptions[0];\r\n    setText('N-limits', 'Any one person: ' + fmt(optN[2]) + ' \u00b7 Any one event: ' + fmt(optN[3]) + ' \u00b7 Any one year: ' + fmt(optN[4]));\r\n    setText('total-N', fmt(R.n.sectionTotal || 0));\r\n\r\n    setText('total-O', fmt(R.o.sectionTotal || 0)); setReferShown('refer-O', R.o.refer);\r\n\r\n    var pRows = $all('#P-items .gem-item-row');\r\n    R.p.itemResults && R.p.itemResults.forEach(function (item, idx) {\r\n      var row = pRows[idx]; if (!row) return;\r\n      row.querySelector('.gem-item-premium').textContent = item.premium === null ? '\u2014' : fmt(item.premium);\r\n    });\r\n    setText('total-P', fmt(R.p.sectionTotal || 0)); setReferShown('refer-P', R.p.refer);\r\n\r\n    qSectionKeys.forEach(function (k) {\r\n      var row = R.q.rows.filter(function (r) { return r.key === k; })[0];\r\n      setText('Q-si-' + k, row ? ('\u2014 ' + fmt(row.si) + ' sum insured') : '');\r\n    });\r\n    setText('total-Q', fmt(R.q.sectionTotal || 0));\r\n\r\n    \/\/ Card premium chips\r\n    ['B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q'].forEach(function (k) {\r\n      setText('premium-' + k, fmt(R.totals[k] || 0));\r\n    });\r\n\r\n    \/\/ Summary sidebar\r\n    setText('summary-total', fmt(R.totalBasicPremium));\r\n    var rowsWrap = $('#summary-rows');\r\n    rowsWrap.innerHTML = '';\r\n    var order = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q'];\r\n    order.forEach(function (k) {\r\n      var val = R.totals[k] || 0;\r\n      if (k !== 'A' && (!state[k] || !state[k].enabled)) return;\r\n      var div = document.createElement('div');\r\n      div.className = 'gem-summary__row';\r\n      div.innerHTML = '<span>' + (k === 'A' ? 'Fire & Allied Perils' : esc(LABELS[k])) + '<\/span><span>' + fmt(val) + '<\/span>';\r\n      rowsWrap.appendChild(div);\r\n    });\r\n    var currentStep = getCurrentStep();\r\n    if (currentStep === 4) {\r\n      $('#summary-foot').innerHTML = 'Levies: ' + fmt(R.levies) + '<br>Stamp duty: ' + fmt(R.stampDuty);\r\n    } else {\r\n      $('#summary-foot').textContent = 'Levies and stamp duty are added on the final step.';\r\n    }\r\n\r\n    if (currentStep === 4) renderReview(R);\r\n    lastResults = R;\r\n  }\r\n  var lastResults = null;\r\n\r\n  function renderReview(R) {\r\n    setText('quote-ref-display', 'Quote reference: ' + quoteRef);\r\n    $('#review-client').innerHTML =\r\n      '<div><span>Client:<\/span> ' + esc(state.client.name || '\u2014') + '<\/div>' +\r\n      '<div><span>Occupation:<\/span> ' + esc(state.client.occupation || '\u2014') + '<\/div>' +\r\n      '<div><span>Phone:<\/span> ' + esc(state.client.phone || '\u2014') + '<\/div>' +\r\n      '<div><span>Business type:<\/span> ' + esc(state.client.businessType) + '<\/div>' +\r\n      '<div><span>Email:<\/span> ' + esc(state.client.email || '\u2014') + '<\/div>' +\r\n      '<div><span>Address:<\/span> ' + esc(state.client.address || '\u2014') + '<\/div>';\r\n\r\n    var rows = [];\r\n    rows.push(['Section A: Fire and Allied Perils (compulsory)', fmt(R.a.totalSI), fmt(R.a.sectionTotal)]);\r\n    var map = [\r\n      ['B','Section B: Business Interruption', R.b.totalSI], ['C','Section C: Burglary', R.c.declaredValue],\r\n      ['D','Section D: Electronic Equipment', R.d.totalSI], ['E','Section E: All Risks', R.e.totalSI],\r\n      ['F','Section F: Money', R.f.totalSI], ['G','Section G: Plate Glass Insurance', R.g.si],\r\n      ['H','Section H: Fidelity Guarantee', (R.h.agg||0)+(R.h.any1||0)], ['I','Section I: Goods in Transit', R.i.totalSI],\r\n      ['J','Section J: Carriers Liability', R.j.totalSI], ['K','Section K: Machinery Breakdown', (R.k.mdApplied||0)],\r\n      ['L','Section L: Machinery Breakdown \u2014 Loss of Profits', R.l.totalSI], ['M','Section M: WIBA & WIBA Plus', null],\r\n      ['N','Section N: Employer\\u2019s Liability', null], ['O','Section O: Public Liability', R.o.si],\r\n      ['P','Section P: Keyman', R.p.totalSI], ['Q','Section Q: Terrorism & Political Risks', R.q.totalSI]\r\n    ];\r\n    map.forEach(function (m) {\r\n      var key = m[0];\r\n      if (!state[key].enabled) return;\r\n      rows.push([m[1], m[2] === null ? '\u2014' : fmt(m[2]), fmt(R.totals[key] || 0)]);\r\n    });\r\n\r\n    var tbody = $('#review-tbody');\r\n    tbody.innerHTML = rows.map(function (r) { return '<tr><td>' + esc(r[0]) + '<\/td><td>' + r[1] + '<\/td><td>' + r[2] + '<\/td><\/tr>'; }).join('') +\r\n      '<tr class=\"gem-review-sub\"><td colspan=\"2\">Total basic premium<\/td><td>' + fmt(R.totalBasicPremium) + '<\/td><\/tr>' +\r\n      '<tr class=\"gem-review-sub\"><td colspan=\"2\">Levies (0.45%)<\/td><td>' + fmt(R.levies) + '<\/td><\/tr>' +\r\n      '<tr class=\"gem-review-sub\"><td colspan=\"2\">Stamp duty<\/td><td>' + fmt(R.stampDuty) + '<\/td><\/tr>' +\r\n      '<tr class=\"gem-review-total-row\"><td colspan=\"2\">Total premium payable<\/td><td>' + fmt(R.totalPayable) + '<\/td><\/tr>';\r\n\r\n    var today = new Date().toLocaleDateString('en-GB', { day: '2-digit', month: 'short', year: 'numeric' });\r\n    $('#review-footer').innerHTML = '<div><span>Prepared by:<\/span> Geminia Biashara Plus Rater<\/div><div><span>Date:<\/span> ' + today + '<\/div>';\r\n  }\r\n\r\n  \/* ============================================================\r\n     SUBMISSION \u2014 sends the quotation to the Google Apps Script\r\n     Web App, which logs it to a Sheet and emails marketing@geminia.co.ke\r\n     ============================================================ *\/\r\n  function buildSubmissionPayload(R) {\r\n    var siByKey = {\r\n      A: R.a.totalSI, B: R.b.totalSI, C: R.c.declaredValue || 0, D: R.d.totalSI, E: R.e.totalSI,\r\n      F: R.f.totalSI, G: R.g.si || 0, H: (R.h.agg || 0) + (R.h.any1 || 0), I: R.i.totalSI, J: R.j.totalSI,\r\n      K: R.k.mdApplied || 0, L: R.l.totalSI, M: 0, N: 0, O: R.o.si || 0, P: R.p.totalSI, Q: R.q.totalSI\r\n    };\r\n    var referByKey = { A:R.a.refer, B:R.b.refer, C:R.c.refer, D:R.d.refer, E:R.e.refer, F:R.f.refer, G:R.g.refer, H:R.h.refer, I:R.i.refer, J:R.j.refer, K:R.k.refer, L:R.l.refer, O:R.o.refer, P:R.p.refer };\r\n    var sections = {};\r\n    ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q'].forEach(function (k) {\r\n      var included = k === 'A' ? true : (state[k] && state[k].enabled);\r\n      sections[k] = { included: !!included, sumInsured: included ? (siByKey[k] || 0) : 0, premium: included ? (R.totals[k] || 0) : 0, referred: !!referByKey[k] };\r\n    });\r\n    return {\r\n      quoteRef: quoteRef,\r\n      submittedAt: new Date().toISOString(),\r\n      client: {\r\n        name: state.client.name, phone: state.client.phone, email: state.client.email,\r\n        address: state.client.address, occupation: state.client.occupation,\r\n        businessType: state.client.businessType, intermediaryType: state.client.intermediaryType\r\n      },\r\n      sections: sections,\r\n      totals: { totalBasicPremium: R.totalBasicPremium, levies: R.levies, stampDuty: R.stampDuty, totalPayable: R.totalPayable }\r\n    };\r\n  }\r\n\r\n  function submitQuotation() {\r\n    var btn = $('#btn-submit');\r\n    var statusEl = $('#submit-status');\r\n    statusEl.className = 'gem-submit-status';\r\n    if (!SUBMIT_URL || SUBMIT_URL.indexOf('PASTE_YOUR') === 0) {\r\n      statusEl.textContent = 'This form isn\\u2019t connected to Geminia yet \u2014 please ask your site administrator to add the Google Apps Script URL. In the meantime, use Print \/ Save as PDF and email it to marketing@geminia.co.ke.';\r\n      statusEl.classList.add('is-error');\r\n      return;\r\n    }\r\n    if (!lastResults) return;\r\n    btn.disabled = true;\r\n    btn.textContent = 'Sending\u2026';\r\n    statusEl.textContent = '';\r\n    var payload = buildSubmissionPayload(lastResults);\r\n    fetch(SUBMIT_URL, { method: 'POST', body: JSON.stringify(payload) })\r\n      .then(function (res) { return res.json(); })\r\n      .then(function (data) {\r\n        if (data && data.status === 'success') {\r\n          statusEl.textContent = 'Sent! Your quotation reference is ' + quoteRef + '. Our team will be in touch shortly.';\r\n          statusEl.classList.add('is-success');\r\n          btn.textContent = 'Sent';\r\n        } else {\r\n          throw new Error((data && data.message) || 'Unknown error');\r\n        }\r\n      })\r\n      .catch(function () {\r\n        statusEl.textContent = 'We couldn\\u2019t send this automatically. Please use Print \/ Save as PDF and email it to marketing@geminia.co.ke.';\r\n        statusEl.classList.add('is-error');\r\n        btn.disabled = false;\r\n        btn.textContent = 'Email this quotation to Geminia';\r\n      });\r\n  }\r\n\r\n  \/* ============================================================\r\n     WIZARD NAVIGATION\r\n     ============================================================ *\/\r\n  function getCurrentStep() {\r\n    var active = $('.gem-step:not([hidden])');\r\n    return active ? parseInt(active.getAttribute('data-step'), 10) : 1;\r\n  }\r\n  function goToStep(n) {\r\n    $all('.gem-step').forEach(function (el) { el.hidden = parseInt(el.getAttribute('data-step'), 10) !== n; });\r\n    $all('#gem-progress li').forEach(function (li) {\r\n      var s = parseInt(li.getAttribute('data-step'), 10);\r\n      li.classList.toggle('is-active', s === n);\r\n      li.classList.toggle('is-done', s < n);\r\n    });\r\n    window.scrollTo({ top: root.offsetTop - 10, behavior: 'smooth' });\r\n    render();\r\n  }\r\n  $all('#gem-progress li').forEach(function (li) {\r\n    li.addEventListener('click', function () { goToStep(parseInt(li.getAttribute('data-step'), 10)); });\r\n  });\r\n  $('#btn-next-1').addEventListener('click', function () { goToStep(2); });\r\n  $('#btn-back-2').addEventListener('click', function () { goToStep(1); });\r\n  $('#btn-next-2').addEventListener('click', function () { goToStep(3); });\r\n  $('#btn-back-3').addEventListener('click', function () { goToStep(2); });\r\n  $('#btn-next-3').addEventListener('click', function () { goToStep(4); });\r\n  $('#btn-back-4').addEventListener('click', function () { goToStep(3); });\r\n  $('#btn-print').addEventListener('click', function () { window.print(); });\r\n  $('#btn-submit').addEventListener('click', submitQuotation);\r\n\r\n  \/* ============================================================\r\n     CLIENT FIELD BINDINGS\r\n     ============================================================ *\/\r\n  $('#cf-name').addEventListener('input', function (e) { state.client.name = e.target.value; });\r\n  $('#cf-phone').addEventListener('input', function (e) { state.client.phone = e.target.value; });\r\n  $('#cf-email').addEventListener('input', function (e) { state.client.email = e.target.value; });\r\n  $('#cf-address').addEventListener('input', function (e) { state.client.address = e.target.value; });\r\n  $('#cf-occupation').addEventListener('input', function (e) { state.client.occupation = e.target.value; render(); });\r\n  $('#cf-businessType').addEventListener('change', function (e) { state.client.businessType = e.target.value; render(); });\r\n  $('#cf-intermediaryType').addEventListener('change', function (e) { state.client.intermediaryType = e.target.value; });\r\n\r\n  \/* ============================================================\r\n     INIT\r\n     ============================================================ *\/\r\n  render();\r\n})();\r\n<\/script>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Geminia Biashara Plus Insurance Get your Biashara Plus cover quotation Answer a few questions about the business and pick the covers that matter. Your estimated annual premium updates as you go. 1Business details 2Fire &amp; allied perils 3Optional covers 4Your quotation Tell us about the business This information appears on your quotation. Only the industry [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1871","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Geminia Biashara Plus Rater - Geminia Insurance<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Geminia Biashara Plus Rater - Geminia Insurance\" \/>\n<meta property=\"og:description\" content=\"Geminia Biashara Plus Insurance Get your Biashara Plus cover quotation Answer a few questions about the business and pick the covers that matter. Your estimated annual premium updates as you go. 1Business details 2Fire &amp; allied perils 3Optional covers 4Your quotation Tell us about the business This information appears on your quotation. Only the industry [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/geminia.co.ke\/dev\/geminia-biashara-plus-rater\/\" \/>\n<meta property=\"og:site_name\" content=\"Geminia Insurance\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-04T10:42:44+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/geminia-biashara-plus-rater\\\/\",\"url\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/geminia-biashara-plus-rater\\\/\",\"name\":\"Geminia Biashara Plus Rater - Geminia Insurance\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/#website\"},\"datePublished\":\"2026-08-31T08:53:35+00:00\",\"dateModified\":\"2026-09-04T10:42:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/geminia-biashara-plus-rater\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/geminia-biashara-plus-rater\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/geminia-biashara-plus-rater\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Geminia Biashara Plus Rater\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/#website\",\"url\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/\",\"name\":\"Geminia Insurance\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/#organization\",\"name\":\"Geminia Insurance\",\"url\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Geminia-Insurance-Logo.png\",\"contentUrl\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Geminia-Insurance-Logo.png\",\"width\":250,\"height\":245,\"caption\":\"Geminia Insurance\"},\"image\":{\"@id\":\"https:\\\/\\\/geminia.co.ke\\\/dev\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Geminia Biashara Plus Rater - Geminia Insurance","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"Geminia Biashara Plus Rater - Geminia Insurance","og_description":"Geminia Biashara Plus Insurance Get your Biashara Plus cover quotation Answer a few questions about the business and pick the covers that matter. Your estimated annual premium updates as you go. 1Business details 2Fire &amp; allied perils 3Optional covers 4Your quotation Tell us about the business This information appears on your quotation. Only the industry [&hellip;]","og_url":"https:\/\/geminia.co.ke\/dev\/geminia-biashara-plus-rater\/","og_site_name":"Geminia Insurance","article_modified_time":"2026-09-04T10:42:44+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/geminia.co.ke\/dev\/geminia-biashara-plus-rater\/","url":"https:\/\/geminia.co.ke\/dev\/geminia-biashara-plus-rater\/","name":"Geminia Biashara Plus Rater - Geminia Insurance","isPartOf":{"@id":"https:\/\/geminia.co.ke\/dev\/#website"},"datePublished":"2026-08-31T08:53:35+00:00","dateModified":"2026-09-04T10:42:44+00:00","breadcrumb":{"@id":"https:\/\/geminia.co.ke\/dev\/geminia-biashara-plus-rater\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/geminia.co.ke\/dev\/geminia-biashara-plus-rater\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/geminia.co.ke\/dev\/geminia-biashara-plus-rater\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/geminia.co.ke\/dev\/"},{"@type":"ListItem","position":2,"name":"Geminia Biashara Plus Rater"}]},{"@type":"WebSite","@id":"https:\/\/geminia.co.ke\/dev\/#website","url":"https:\/\/geminia.co.ke\/dev\/","name":"Geminia Insurance","description":"","publisher":{"@id":"https:\/\/geminia.co.ke\/dev\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/geminia.co.ke\/dev\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/geminia.co.ke\/dev\/#organization","name":"Geminia Insurance","url":"https:\/\/geminia.co.ke\/dev\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/geminia.co.ke\/dev\/#\/schema\/logo\/image\/","url":"https:\/\/geminia.co.ke\/dev\/wp-content\/uploads\/2026\/04\/Geminia-Insurance-Logo.png","contentUrl":"https:\/\/geminia.co.ke\/dev\/wp-content\/uploads\/2026\/04\/Geminia-Insurance-Logo.png","width":250,"height":245,"caption":"Geminia Insurance"},"image":{"@id":"https:\/\/geminia.co.ke\/dev\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/geminia.co.ke\/dev\/wp-json\/wp\/v2\/pages\/1871","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geminia.co.ke\/dev\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/geminia.co.ke\/dev\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/geminia.co.ke\/dev\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geminia.co.ke\/dev\/wp-json\/wp\/v2\/comments?post=1871"}],"version-history":[{"count":16,"href":"https:\/\/geminia.co.ke\/dev\/wp-json\/wp\/v2\/pages\/1871\/revisions"}],"predecessor-version":[{"id":2124,"href":"https:\/\/geminia.co.ke\/dev\/wp-json\/wp\/v2\/pages\/1871\/revisions\/2124"}],"wp:attachment":[{"href":"https:\/\/geminia.co.ke\/dev\/wp-json\/wp\/v2\/media?parent=1871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}