{"id":11869,"date":"2025-02-16T07:35:26","date_gmt":"2025-02-15T23:35:26","guid":{"rendered":"https:\/\/stooper.co\/?page_id=11869"},"modified":"2025-12-07T12:24:07","modified_gmt":"2025-12-07T04:24:07","slug":"malaysia-income-tax-calculator","status":"publish","type":"page","link":"https:\/\/stooper.co\/ms\/kalkulator-cukai-malaysia\/","title":{"rendered":"Kalkulator Cukai Malaysia"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"11869\" class=\"elementor elementor-11869\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ae32bce e-con-full e-flex e-con e-parent\" data-id=\"ae32bce\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9181b0f e-flex e-con-boxed e-con e-parent\" data-id=\"9181b0f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-0212040 e-con-full e-flex e-con e-child\" data-id=\"0212040\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c98146b elementor-widget elementor-widget-heading\" data-id=\"c98146b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Kalkulator Cukai Malaysia untuk Kira Cukai Pendapatan Anda<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a83222c elementor-widget elementor-widget-text-editor\" data-id=\"a83222c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"406\" data-end=\"758\">Mengisi cukai memang boleh jadi stres, tapi tak semestinya begitu. Kalkulator cukai Malaysia kami direka khas untuk membantu anda menganggarkan cukai pendapatan tahunan berdasarkan kadar cukai semasa, pelepasan dan rebat yang tersedia. Sama ada anda bekerja makan gaji, bekerja sendiri atau menjalankan perniagaan, alat ini memudahkan kiraan cukai\u2014supaya anda boleh merancang dengan lebih bijak dan elakkan kejutan di akhir tahun.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f49427a e-flex e-con-boxed e-con e-parent\" data-id=\"f49427a\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-8386ce4 e-flex e-con-boxed e-con e-child\" data-id=\"8386ce4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9026d39 elementor-widget elementor-widget-shortcode\" data-id=\"9026d39\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">    <style>\r\n    .tcp-card {\r\n        background:#fff; border-radius:14px; box-shadow:0 2px 16px #0002;\r\n        padding:2.5em 2em; margin:2em auto; max-width:1100px;\r\n    }\r\n    .tcp-header {font-size:2.25em; margin-bottom:.7em; font-weight:700; color:#145b29;}\r\n    .tcp-section-title {\r\n        font-size:1.23em; font-weight:700; color:#165e9c;\r\n        background:#e6f2fb; padding:.7em 1em; border-radius:9px; margin:1.7em 0 .8em 0;\r\n        border-left: 5px solid #50a6ff;\r\n    }\r\n    .tcp-form-row {\r\n        display:grid;\r\n        grid-template-columns: 390px 120px 1fr;\r\n        align-items:center; gap:0.5em 1.5em;\r\n        margin-bottom:1em;\r\n    }\r\n    .tcp-label {font-weight:600;}\r\n    .tcp-tip {display:inline-block; margin-left:6px; color:#277be6; cursor:pointer; border-radius:50%; width:1.1em; height:1.1em; background:#eaf4ff; text-align:center; font-size:.97em;}\r\n    .tcp-tip:hover {background:#c3e7ff;}\r\n    .tcp-input, select, input[type=\"number\"] {\r\n        width: 320px !important;\r\n        max-width:100%;\r\n        padding:7px 10px;\r\n        font-size:1.08em;\r\n        border-radius:7px;\r\n        border:1px solid #b6d5f5;\r\n        box-sizing: border-box;\r\n    }\r\n    .tcp-rm {\r\n        color:#444;font-size:1.09em;font-weight:500;text-align:right;width:42px;min-width:40px;display:inline-block;\r\n    }\r\n    .tcp-inline-group {display:inline-flex; align-items:center; gap:1.3em;}\r\n    .tcp-hidden {display:none;}\r\n    @media (max-width:1200px){.tcp-card{padding:1.2em .5em; max-width:98vw;}}\r\n    @media (max-width:600px){\r\n        .tcp-form-row{display:block;}\r\n        .tcp-label, .tcp-rm, .tcp-input {display:block;width:100%;}\r\n    }\r\n\r\n    .tcp-unit {\r\n     display: inline-block;\r\n     min-width: 50px;\r\n     text-align: right;\r\n     margin-right: 0.4em;\r\n     font-weight: 500;\r\n    }\r\n\r\n\r\n    \/* Toggle Switch Improved *\/\r\n    .tcp-toggle {\r\n        position: relative;\r\n        width: 72px;\r\n        height: 34px;\r\n        display: inline-block;\r\n        vertical-align: middle;\r\n        margin-right: 0.7em;\r\n    }\r\n    .tcp-toggle input[type=\"checkbox\"] {\r\n        opacity: 0;\r\n        width: 0; height: 0;\r\n        position: absolute;\r\n    }\r\n    .tcp-toggle-slider {\r\n        position: absolute;\r\n        cursor: pointer;\r\n        top: 0; left: 0; right: 0; bottom: 0;\r\n        background-color: #dadada;\r\n        border-radius: 50px;\r\n        transition: background 0.23s;\r\n        box-shadow: 0 1px 2px #0001;\r\n        display: flex;\r\n        align-items: center;\r\n        font-size: 1.03em;\r\n        font-weight: 600;\r\n        color: #666;\r\n        justify-content: space-between;\r\n        padding: 0 9px;\r\n        letter-spacing: .5px;\r\n    }\r\n    .tcp-toggle-slider:before {\r\n        content: \"\";\r\n        position: absolute;\r\n        left: 3px;\r\n        top: 3px;\r\n        height: 28px; width: 28px;\r\n        background: #fff;\r\n        border-radius: 50%;\r\n        transition: transform 0.23s;\r\n        box-shadow: 0 1px 3px #0002;\r\n        z-index:2;\r\n    }\r\n    .tcp-toggle input:checked + .tcp-toggle-slider {\r\n        background-color: #4fd473;\r\n        color: #fff;\r\n    }\r\n    .tcp-toggle input:checked + .tcp-toggle-slider:before {\r\n        transform: translateX(38px);\r\n    }\r\n    .tcp-toggle-slider .tcp-toggle-yes {\r\n        color: inherit;\r\n        z-index:3;\r\n        margin-left:0;\r\n        margin-right:0;\r\n        transition: color 0.23s;\r\n    }\r\n    .tcp-toggle-slider .tcp-toggle-no {\r\n        color: inherit;\r\n        z-index:3;\r\n        margin-right:0;\r\n        margin-left:0;\r\n        transition: color 0.23s;\r\n    }\r\n    .tcp-toggle input:not(:checked) + .tcp-toggle-slider .tcp-toggle-yes {\r\n        color: #bbb;\r\n    }\r\n    .tcp-toggle input:checked + .tcp-toggle-slider .tcp-toggle-no {\r\n        color: #bbb;\r\n    }\r\n    \/* Add spacing below the calculate button *\/\r\n    #taxcalcpro_form button[type=\"submit\"] {\r\n        margin-bottom: 2.3em;\r\n        margin-top: 1.5em;\r\n        padding:13px 33px;\r\n        background:#187e42;\r\n        color:#fff;\r\n        font-weight:700;\r\n        font-size:1.1em;\r\n        border-radius:7px;\r\n        border:none;\r\n        cursor:pointer;\r\n    }\r\n    \/* Summary Header: Blue *\/\r\n    .tcp-summary-header {\r\n        background:#2373e9!important;\r\n        color:#fff!important;\r\n        padding:18px 18px 0 18px;\r\n        border-radius:9px 9px 0 0;\r\n        font-size:1.33em;\r\n        font-weight:600;\r\n    }\r\n    <\/style>\r\n\r\n<style>\r\n  .tcp-card { \/* your existing form styles\u2026 *\/ }\r\n\r\n\/* \u2014 refined .toggle-switch to more closely match .tcp-toggle \u2014 *\/\r\n.toggle-switch {\r\n  display: inline-flex;\r\n  border: 1px solid #dadada;   \/* same border color as .tcp-toggle *\/\r\n  border-radius: 50px;         \/* pill shape like .tcp-toggle *\/\r\n  overflow: hidden;\r\n  height: 34px;                \/* same height as your checkbox toggle *\/\r\n  font-size: 1em;              \/* match your form inputs *\/\r\n  vertical-align: middle;\r\n}\r\n.toggle-switch input {\r\n  display: none;               \/* hide the native radios *\/\r\n}\r\n.toggle-switch label {\r\n  flex: 1;                     \/* each label fills half the pill *\/\r\n  text-align: center;\r\n  line-height: 34px;           \/* vertically center the text *\/\r\n  cursor: pointer;\r\n  color: #666;                 \/* same inactive color *\/\r\n  user-select: none;\r\n  transition: background .2s, color .2s;\r\n}\r\n\/* thin divider between segments *\/\r\n.toggle-switch label + input + label {\r\n  border-left: 1px solid #dadada;\r\n}\r\n\/* active segment gets the same green background & white text as .tcp-toggle *\/\r\n#has_children_yes:checked + label[for=\"has_children_yes\"],\r\n#has_children_no:checked  + label[for=\"has_children_no\"] {\r\n  background-color: #4fd473;\r\n  color: #fff;\r\n}\r\n\r\n  \/* \u2026the rest of your styles\u2026 *\/\r\n<\/style>\r\n\r\n<div class=\"tcp-card\">\r\n    <div class=\"tcp-header\">\r\n    Kalkulator Cukai Malaysia \r\n    <span style=\"font-size:.55em;font-weight:400;\">\r\n        2025    <\/span>\r\n<\/div>\r\n\r\n    <form id=\"taxcalcpro_form\" action=\"\">\r\n        <div class=\"tcp-section-title\">Butiran Pendapatan<\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Pendapatan Tahunan Sepenuh Masa <span class=\"tcp-tip\" data-tip=\"Enter your gross annual employment income. Do not include rental income or dividends.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"income\" \r\n            value=\"\" \r\n            min=\"0\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is ');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Adakah anda menerima pampasan kerana kehilangan pekerjaan? <span class=\"tcp-tip\" data-tip=\"Tick if you received compensation (e.g. VSS\/MSS). The tax-free part depends on your service years.\">?<\/span><\/label><span><\/span><div class=\"tcp-inline-group\"><label class=\"tcp-toggle\"><input type=\"checkbox\" name=\"got_compensation\" value=\"yes\" ><span class=\"tcp-toggle-slider\"><span class=\"tcp-toggle-yes\">Ya<\/span><span class=\"tcp-toggle-no\">Tidak<\/span><\/span><\/label><\/div><\/div><div class=\"tcp-form-row\" data-cond=\"got_compensation\"><label class=\"tcp-label\">Tarikh Mula Perkhidmatan <span class=\"tcp-tip\" data-tip=\"Date you joined the company (dd\/mm\/yyyy)\">?<\/span><\/label><span><\/span><input type=\"date\" name=\"comp_start_date\" value=\"\" class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"got_compensation\"><label class=\"tcp-label\">Tarikh Tamat Perkhidmatan <span class=\"tcp-tip\" data-tip=\"Date you left the company (dd\/mm\/yyyy)\">?<\/span><\/label><span><\/span><input type=\"date\" name=\"comp_end_date\" value=\"\" class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"got_compensation\"><label class=\"tcp-label\">Tempoh Perkhidmatan yang Telah Disempurnakan <span class=\"tcp-tip\" data-tip=\"Auto-calculated from start\/end date\">?<\/span><\/label><span class=\"tcp-unit\">Tahun<\/span><input \r\n            type=\"number\" \r\n            name=\"comp_completed_years\" \r\n            value=\"\" \r\n            min=\"0\" readonly oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is ');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"got_compensation\"><label class=\"tcp-label\">Jumlah Pampasan yang Diterima <span class=\"tcp-tip\" data-tip=\"Total compensation payout you received.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"comp_amount\" \r\n            value=\"\" \r\n            min=\"0\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is ');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"got_compensation\"><label class=\"tcp-label\">Jumlah Pampasan yang Dikecualikan <span class=\"tcp-tip\" data-tip=\"Auto\u2010calculated: exempt portion (min of comp_amount vs years \u00d7 exempt per year).\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"comp_exempt_amount\" \r\n            value=\"\" \r\n            min=\"0\" readonly oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is ');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"got_compensation\"><label class=\"tcp-label\">Jumlah Pampasan yang Bercukai <span class=\"tcp-tip\" data-tip=\"Auto\u2010calculated: comp_amount \u2212 exempted amount.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"comp_taxable_amount\" \r\n            value=\"\" \r\n            min=\"0\" readonly oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is ');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Adakah anda menerima sebarang pendapatan sewaan? <span class=\"tcp-tip\" data-tip=\"Tick if you have rental income from property.\">?<\/span><\/label><span><\/span><div class=\"tcp-inline-group\"><label class=\"tcp-toggle\"><input type=\"checkbox\" name=\"has_rental_income\" value=\"yes\" ><span class=\"tcp-toggle-slider\"><span class=\"tcp-toggle-yes\">Ya<\/span><span class=\"tcp-toggle-no\">Tidak<\/span><\/span><\/label><\/div><\/div><div class=\"tcp-form-row\" data-cond=\"has_rental_income\"><label class=\"tcp-label\">Pendapatan Sewa Tahunan <span class=\"tcp-tip\" data-tip=\"Enter your total annual rental income.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"rental_income_amount\" \r\n            value=\"\" \r\n            min=\"0\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is ');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Jumlah Pendapatan (termasuk pampasan &amp; sewa) <span class=\"tcp-tip\" data-tip=\"Auto-calculated: base income + taxable compensation + rental income.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"combined_income_total\" \r\n            value=\"\" \r\n            min=\"0\" readonly oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is ');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-section-title\">Butiran Pelepasan Cukai<\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Adakah anda OKU? <span class=\"tcp-tip\" data-tip=\"If you are a registered disabled individual.\">?<\/span><\/label><span><\/span><div class=\"tcp-inline-group\"><label class=\"tcp-toggle\"><input type=\"checkbox\" name=\"disabled_self\" value=\"yes\" ><span class=\"tcp-toggle-slider\"><span class=\"tcp-toggle-yes\">Ya<\/span><span class=\"tcp-toggle-no\">Tidak<\/span><\/span><\/label><\/div><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Status Perkahwinan <span class=\"tcp-tip\" data-tip=\"Choose your marital status.\">?<\/span><\/label><span><\/span><select name=\"marital_status\" class=\"tcp-input\"><option value=\"single\" >Bujang<\/option><option value=\"married\" >Berkahwin<\/option><option value=\"widowed\" >Balu \/ Bercerai<\/option><\/select><\/div><div class=\"tcp-form-row\" data-cond=\"marital_status!=single\"><label class=\"tcp-label\">Adakah suami\/isteri anda OKU? <span class=\"tcp-tip\" data-tip=\"Tick if your spouse is officially registered as disabled.\">?<\/span><\/label><span><\/span><div class=\"tcp-inline-group\"><label class=\"tcp-toggle\"><input type=\"checkbox\" name=\"spouse_disabled\" value=\"yes\" ><span class=\"tcp-toggle-slider\"><span class=\"tcp-toggle-yes\">Ya<\/span><span class=\"tcp-toggle-no\">Tidak<\/span><\/span><\/label><\/div><\/div><div class=\"tcp-form-row\" data-cond=\"marital_status!=single\"><label class=\"tcp-label\">Adakah suami\/isteri anda bekerja? <span class=\"tcp-tip\" data-tip=\"Tick if your spouse has any income.\">?<\/span><\/label><span><\/span><div class=\"tcp-inline-group\"><label class=\"tcp-toggle\"><input type=\"checkbox\" name=\"spouse_working\" value=\"yes\" ><span class=\"tcp-toggle-slider\"><span class=\"tcp-toggle-yes\">Ya<\/span><span class=\"tcp-toggle-no\">Tidak<\/span><\/span><\/label><\/div><\/div><div class=\"tcp-form-row\" data-cond=\"spouse_working=yes\"><label class=\"tcp-label\">Bayaran nafkah kepada bekas isteri [Maksimum RM4,000] <span class=\"tcp-tip\" data-tip=\"Amount paid as alimony. Max RM4,000.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"alimony\" \r\n            value=\"\" \r\n            min=\"0\" max=\"4000\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 4000');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"marital_status!=single\"><label class=\"tcp-label\">Adakah anda mempunyai anak? <span class=\"tcp-tip\" data-tip=\"Tick &quot;Yes&quot; if you have any children (biological, adopted, or stepchildren).\">?<\/span><\/label><span><\/span>                    <div class=\"toggle-switch\">\r\n                      <input type=\"radio\"\r\n                             id=\"has_children_yes\"\r\n                             name=\"has_children\"\r\n                             value=\"yes\"\r\n                              >\r\n                      <label for=\"has_children_yes\">Ya<\/label>\r\n\r\n                      <input type=\"radio\"\r\n                             id=\"has_children_no\"\r\n                             name=\"has_children\"\r\n                             value=\"no\"\r\n                             checked>\r\n                      <label for=\"has_children_no\">Tidak<\/label>\r\n                    <\/div>\r\n                    <\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Jumlah Amaun Pelepasan <span class=\"tcp-tip\" data-tip=\"Auto\u2010calculated: sum of all reliefs.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"total_relief_amount\" \r\n            value=\"\" \r\n            min=\"0\" readonly oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is ');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-section-title\">Butiran Anak<\/div><div class=\"tcp-form-row\" data-cond=\"has_children=yes\"><label class=\"tcp-label\">Bilangan anak (&lt;18 tahun) x 2,000 <span class=\"tcp-tip\" data-tip=\"Children under 18 years old. Relief per child is admin-set (see settings).\">?<\/span><\/label><span class=\"tcp-unit\">Orang<\/span><input \r\n            type=\"number\" \r\n            name=\"num_child_under18\" \r\n            value=\"\" \r\n            min=\"0\" max=\"12\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 12');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"has_children=yes\"><label class=\"tcp-label\">Bilangan anak (\u226518 tahun), A-Level x 2,000 <span class=\"tcp-tip\" data-tip=\"Children 18+ in Form 6\/A-level. RM2,000 per child.\">?<\/span><\/label><span class=\"tcp-unit\">Orang<\/span><input \r\n            type=\"number\" \r\n            name=\"num_child_alevel\" \r\n            value=\"\" \r\n            min=\"0\" max=\"6\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 6');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"has_children=yes\"><label class=\"tcp-label\">Bilangan anak (\u226518 tahun), diploma dan ke atas x 8,000 <span class=\"tcp-tip\" data-tip=\"Children 18+ studying diploma\/degree and above. RM8,000 per child.\">?<\/span><\/label><span class=\"tcp-unit\">Orang<\/span><input \r\n            type=\"number\" \r\n            name=\"num_child_diploma\" \r\n            value=\"\" \r\n            min=\"0\" max=\"6\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 6');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"has_children=yes\"><label class=\"tcp-label\">Bilangan anak OKU x 6,000 <span class=\"tcp-tip\" data-tip=\"Number of disabled children. RM6,000 per child.\">?<\/span><\/label><span class=\"tcp-unit\">Orang<\/span><input \r\n            type=\"number\" \r\n            name=\"num_disabled_child\" \r\n            value=\"\" \r\n            min=\"0\" max=\"6\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 6');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"has_children=yes\"><label class=\"tcp-label\">Bilangan anak OKU (\u226518 tahun), diploma dan ke atas x 8,000 <span class=\"tcp-tip\" data-tip=\"Disabled children 18+ in higher education. RM8,000 per child.\">?<\/span><\/label><span class=\"tcp-unit\">Orang<\/span><input \r\n            type=\"number\" \r\n            name=\"num_disabled_child_diploma\" \r\n            value=\"\" \r\n            min=\"0\" max=\"6\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 6');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"has_children=yes\"><label class=\"tcp-label\">SSPN (Simpanan Pendidikan Anak) [Maksimum 8,000] <span class=\"tcp-tip\" data-tip=\"SSPN savings. Max claim RM8,000.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"sspn\" \r\n            value=\"\" \r\n            min=\"0\" max=\"8000\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 8000');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"has_children=yes\"><label class=\"tcp-label\">Peralatan Penyusuan Susu Ibu [Maksimum 1,000] <span class=\"tcp-tip\" data-tip=\"Claim up to RM1,000 for breastfeeding equipment.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"breastfeeding\" \r\n            value=\"\" \r\n            min=\"0\" max=\"1000\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 1000');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"has_children=yes\"><label class=\"tcp-label\">Yuran Pusat Asuhan Kanak-Kanak dan Tadika [Maksimum 3,000] <span class=\"tcp-tip\" data-tip=\"Claim up to RM3,000 for child care\/kindergarten fees.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"kindergarten\" \r\n            value=\"\" \r\n            min=\"0\" max=\"3000\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 3000');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\" data-cond=\"has_children=yes\"><label class=\"tcp-label\">Jumlah Pelepasan Anak <span class=\"tcp-tip\" data-tip=\"Auto-calculated: total relief from all children.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"child_relief_amount\" \r\n            value=\"\" \r\n            min=\"0\" readonly oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is ');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-section-title\">Butiran Ibu Bapa<\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Perubatan Ibu Bapa [Maksimum 8,000] <span class=\"tcp-tip\" data-tip=\"Medical expenses for parents, max RM8,000.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"parent_medical\" \r\n            value=\"\" \r\n            min=\"0\" max=\"8000\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 8000');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-section-title\">Butiran Lain-lain<\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Anuiti \/ PRS [Maksimum 3,000] <span class=\"tcp-tip\" data-tip=\"Private Retirement Scheme (PRS) or annuity, max RM3,000.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"prs\" \r\n            value=\"\" \r\n            min=\"0\" max=\"3000\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 3000');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Insurans Pendidikan &amp; Perubatan (Diri\/Suami\/Isteri\/Anak) [Maksimum 3,000] <span class=\"tcp-tip\" data-tip=\"Combined education and medical insurance, max RM3,000.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"insurance\" \r\n            value=\"\" \r\n            min=\"0\" max=\"3000\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 3000');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Yuran Pendidikan (Diri Sendiri) [Maksimum 7,000] <span class=\"tcp-tip\" data-tip=\"Your own approved education fees, max RM7,000.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"edu_fees\" \r\n            value=\"\" \r\n            min=\"0\" max=\"7000\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 7000');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Peralatan Sokongan [Maksimum 6,000] <span class=\"tcp-tip\" data-tip=\"Equipment for disability, max RM6,000.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"support_equip\" \r\n            value=\"\" \r\n            min=\"0\" max=\"6000\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 6000');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Perbelanjaan Perubatan (Diri\/Suami\/Isteri\/Anak) [Maksimum 10,000] <span class=\"tcp-tip\" data-tip=\"Medical expenses for self\/spouse\/child, max RM10,000.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"medical\" \r\n            value=\"\" \r\n            min=\"0\" max=\"10000\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 10000');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">EPF \/ KWSP [Maksimum 4,000] <span class=\"tcp-tip\" data-tip=\"Your KWSP (EPF) contributions, max RM4,000.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"epf\" \r\n            value=\"\" \r\n            min=\"0\" max=\"4000\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 4000');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">nsurans Hayat \/ Takaful Keluarga \/ Caruman Sukarela Tambahan ke EPF\/KWSP [Maksimum 3,000] <span class=\"tcp-tip\" data-tip=\"Life\/family takaful\/AVC to EPF, max RM3,000.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"life_ins\" \r\n            value=\"\" \r\n            min=\"0\" max=\"3000\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 3000');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Gaya Hidup [Maksimum 2,500] <span class=\"tcp-tip\" data-tip=\"Lifestyle expenses (books, gadgets, etc.), max RM2,500.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"lifestyle\" \r\n            value=\"\" \r\n            min=\"0\" max=\"2500\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 2500');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Peralatan &amp; Aktiviti Sukan (Diri\/Suami\/Isteri\/Anak) [Maksimum 1,000] <span class=\"tcp-tip\" data-tip=\"Sport equipment\/fees, max RM1,000.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"sport\" \r\n            value=\"\" \r\n            min=\"0\" max=\"1000\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 1000');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">SOCSO \/ PERKESO [Maksimum 350] <span class=\"tcp-tip\" data-tip=\"SOCSO\/Perkeso contributions, max RM350.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"socso\" \r\n            value=\"\" \r\n            min=\"0\" max=\"350\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 350');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Perbelanjaan Pengecasan Kenderaan Elektrik [Maksimum 2,500] <span class=\"tcp-tip\" data-tip=\"EV charging expenses, max RM2,500.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"ev_charge\" \r\n            value=\"\" \r\n            min=\"0\" max=\"2500\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is 2500');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">PCB (Potongan Cukai Bulanan) <span class=\"tcp-tip\" data-tip=\"Monthly tax (PCB) paid via salary deduction.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"pcb\" \r\n            value=\"\" \r\n            min=\"0\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is ');                }            \"\r\n            class=\"tcp-input\"><\/div><div class=\"tcp-form-row\"><label class=\"tcp-label\">Zakat <span class=\"tcp-tip\" data-tip=\"Zakat paid can offset your tax bill.\">?<\/span><\/label><span class=\"tcp-unit\">RM<\/span><input \r\n            type=\"number\" \r\n            name=\"zakat\" \r\n            value=\"\" \r\n            min=\"0\" \r\n            oninput=\"                if (this.value !== '' && parseFloat(this.value) > parseFloat(this.max)) {                    this.value = this.max;                    alert('Maximum allowed is ');                }            \"\r\n            class=\"tcp-input\"><\/div>        <button type=\"submit\">Kira Cukai<\/button>\r\n    <input type=\"hidden\" name=\"trp-form-language\" value=\"ms\"\/><\/form>\r\n    <div id=\"taxcalcpro_result\"><\/div>\r\n    <button id=\"tcp_export_pdf\" style=\"margin-top:1em;padding:.7em 1.2em;background:#2373e9;color:#fff;border:none;border-radius:7px;cursor:pointer;\">\r\n      Export to PDF\r\n    <\/button>\r\n<script src=\"https:\/\/html2canvas.hertzen.com\/dist\/html2canvas.min.js\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\r\n<script>\r\ndocument.getElementById('tcp_export_pdf').addEventListener('click', function(){\r\n  const { jsPDF } = window.jspdf;\r\n  const doc = new jsPDF({ unit: 'pt', format: 'letter' });\r\n  doc.html(document.getElementById('taxcalcpro_result'), {\r\n    callback: function(pdf) {\r\n      pdf.save(`tax-summary-${window.tcp_settings_active_year}.pdf`);\r\n    },\r\n    x: 20,\r\n    y: 20,\r\n    html2canvas: { scale: 0.5 }\r\n  });\r\n});\r\n<\/script>\r\n<\/div>\r\n\r\n<script>\r\nwindow.tcp_settings = {\"income_details\":{\"title\":\"Income Details\",\"fields\":[{\"name\":\"income\",\"label\":\"Full-Time Annual Income\",\"type\":\"number\",\"max\":\"\",\"desc\":\"Enter your gross annual employment income. Do not include rental income or dividends.\",\"group\":\"income_details\",\"enabled\":1,\"unit\":\"RM\"},{\"name\":\"got_compensation\",\"label\":\"Did you get compensation for loss of employment?\",\"type\":\"checkbox\",\"desc\":\"Tick if you received compensation (e.g. VSS\\\/MSS). The tax-free part depends on your service years.\",\"group\":\"income_details\",\"enabled\":1,\"unit\":\"\",\"max\":\"\"},{\"name\":\"comp_start_date\",\"label\":\"Service Start Date\",\"type\":\"date\",\"desc\":\"Date you joined the company (dd\\\/mm\\\/yyyy)\",\"group\":\"income_details\",\"enabled\":1,\"conditional\":\"got_compensation\",\"unit\":\"\",\"max\":\"\"},{\"name\":\"comp_end_date\",\"label\":\"Service End Date\",\"type\":\"date\",\"desc\":\"Date you left the company (dd\\\/mm\\\/yyyy)\",\"group\":\"income_details\",\"enabled\":1,\"conditional\":\"got_compensation\",\"unit\":\"\",\"max\":\"\"},{\"name\":\"comp_completed_years\",\"label\":\"Years of Service Completed\",\"type\":\"number\",\"desc\":\"Auto-calculated from start\\\/end date\",\"group\":\"income_details\",\"enabled\":1,\"readonly\":1,\"conditional\":\"got_compensation\",\"unit\":\"year\",\"max\":\"\"},{\"name\":\"comp_amount\",\"label\":\"Compensation Amount Received\",\"type\":\"number\",\"max\":\"\",\"desc\":\"Total compensation payout you received.\",\"group\":\"income_details\",\"enabled\":1,\"conditional\":\"got_compensation\",\"unit\":\"RM\"},{\"name\":\"comp_exempt_amount\",\"label\":\"Exempted Compensation Amount\",\"type\":\"number\",\"desc\":\"Auto\\u2010calculated: exempt portion (min of comp_amount vs years \\u00d7 exempt per year).\",\"group\":\"income_details\",\"enabled\":1,\"readonly\":1,\"conditional\":\"got_compensation\",\"unit\":\"RM\",\"max\":\"\"},{\"name\":\"comp_taxable_amount\",\"label\":\"Taxable Compensation Amount\",\"type\":\"number\",\"desc\":\"Auto\\u2010calculated: comp_amount \\u2212 exempted amount.\",\"group\":\"income_details\",\"enabled\":1,\"readonly\":1,\"conditional\":\"got_compensation\",\"unit\":\"RM\",\"max\":\"\"},{\"name\":\"has_rental_income\",\"label\":\"Do you receive any rental income?\",\"type\":\"checkbox\",\"desc\":\"Tick if you have rental income from property.\",\"group\":\"income_details\",\"enabled\":1,\"unit\":\"\",\"max\":\"\"},{\"name\":\"rental_income_amount\",\"label\":\"Annual Rental Income\",\"type\":\"number\",\"max\":\"\",\"desc\":\"Enter your total annual rental income.\",\"group\":\"income_details\",\"enabled\":1,\"conditional\":\"has_rental_income\",\"unit\":\"RM\"},{\"name\":\"combined_income_total\",\"label\":\"Total Income (incl. compensation & rental)\",\"type\":\"number\",\"desc\":\"Auto-calculated: base income + taxable compensation + rental income.\",\"group\":\"income_details\",\"enabled\":1,\"readonly\":1,\"unit\":\"RM\",\"max\":\"\"}]},\"tax_relief\":{\"title\":\"Tax Relief Details\",\"fields\":[{\"name\":\"disabled_self\",\"label\":\"Are you disabled?\",\"type\":\"checkbox\",\"desc\":\"If you are a registered disabled individual.\",\"group\":\"tax_relief\",\"enabled\":1,\"unit\":\"\",\"max\":\"\"},{\"name\":\"marital_status\",\"label\":\"Marital Status\",\"type\":\"select\",\"options\":{\"single\":\"Single\",\"married\":\"Married\",\"widowed\":\"Widowed\\\/Divorced\"},\"desc\":\"Choose your marital status.\",\"group\":\"tax_relief\",\"enabled\":1,\"unit\":\"\",\"max\":\"\"},{\"name\":\"spouse_disabled\",\"label\":\"Is your husband\\\/wife disabled?\",\"type\":\"checkbox\",\"desc\":\"Tick if your spouse is officially registered as disabled.\",\"group\":\"tax_relief\",\"enabled\":1,\"conditional\":\"marital_status!=single\",\"unit\":\"\",\"max\":\"\"},{\"name\":\"spouse_working\",\"label\":\"Is your husband\\\/wife working?\",\"type\":\"checkbox\",\"desc\":\"Tick if your spouse has any income.\",\"group\":\"tax_relief\",\"enabled\":1,\"conditional\":\"marital_status!=single\",\"unit\":\"\",\"max\":\"\"},{\"name\":\"alimony\",\"label\":\"Payment of alimony to former wife [Max 4,000]\",\"type\":\"number\",\"max\":\"4000\",\"desc\":\"Amount paid as alimony. Max RM4,000.\",\"group\":\"tax_relief\",\"enabled\":1,\"conditional\":\"spouse_working=yes\",\"unit\":\"RM\"},{\"name\":\"has_children\",\"label\":\"Do you have child?\",\"type\":\"radio\",\"options\":{\"yes\":\"Yes\",\"no\":\"No\"},\"desc\":\"Tick \\\"Yes\\\" if you have any children (biological, adopted, or stepchildren).\",\"group\":\"tax_relief\",\"enabled\":1,\"conditional\":\"marital_status!=single\",\"unit\":\"\",\"max\":\"\"},{\"name\":\"total_relief_amount\",\"label\":\"Total Relief Amount\",\"type\":\"number\",\"desc\":\"Auto\\u2010calculated: sum of all reliefs.\",\"group\":\"tax_relief\",\"enabled\":1,\"readonly\":1,\"unit\":\"RM\",\"max\":\"\"}]},\"child_details\":{\"title\":\"Child Details\",\"fields\":[{\"name\":\"num_child_under18\",\"label\":\"No. of child (&lt;18) x 2,000\",\"type\":\"number\",\"max\":\"12\",\"desc\":\"Children under 18 years old. Relief per child is admin-set (see settings).\",\"group\":\"child_details\",\"enabled\":1,\"conditional\":\"has_children=yes\",\"unit\":\"person\"},{\"name\":\"num_child_alevel\",\"label\":\"No. of child (\\u226518), A-Level x 2,000\",\"type\":\"number\",\"max\":\"6\",\"desc\":\"Children 18+ in Form 6\\\/A-level. RM2,000 per child.\",\"group\":\"child_details\",\"enabled\":1,\"conditional\":\"has_children=yes\",\"unit\":\"person\"},{\"name\":\"num_child_diploma\",\"label\":\"No. of child (\\u226518), diploma and above x 8,000\",\"type\":\"number\",\"max\":\"6\",\"desc\":\"Children 18+ studying diploma\\\/degree and above. RM8,000 per child.\",\"group\":\"child_details\",\"enabled\":1,\"conditional\":\"has_children=yes\",\"unit\":\"person\"},{\"name\":\"num_disabled_child\",\"label\":\"No. of disabled child x 6,000\",\"type\":\"number\",\"max\":\"6\",\"desc\":\"Number of disabled children. RM6,000 per child.\",\"group\":\"child_details\",\"enabled\":1,\"conditional\":\"has_children=yes\",\"unit\":\"person\"},{\"name\":\"num_disabled_child_diploma\",\"label\":\"No. of disabled child (\\u226518), diploma and above x 8,000\",\"type\":\"number\",\"max\":\"6\",\"desc\":\"Disabled children 18+ in higher education. RM8,000 per child.\",\"group\":\"child_details\",\"enabled\":1,\"conditional\":\"has_children=yes\",\"unit\":\"person\"},{\"name\":\"sspn\",\"label\":\"SSPN (Child Education Saving) [Max 8,000]\",\"type\":\"number\",\"max\":\"8000\",\"desc\":\"SSPN savings. Max claim RM8,000.\",\"group\":\"child_details\",\"enabled\":1,\"conditional\":\"has_children=yes\",\"unit\":\"RM\"},{\"name\":\"breastfeeding\",\"label\":\"Breastfeeding Equipment [Max 1,000]\",\"type\":\"number\",\"max\":\"1000\",\"desc\":\"Claim up to RM1,000 for breastfeeding equipment.\",\"group\":\"child_details\",\"enabled\":1,\"conditional\":\"has_children=yes\",\"unit\":\"RM\"},{\"name\":\"kindergarten\",\"label\":\"Childcare centres and kindergartens fees [Max 3,000]\",\"type\":\"number\",\"max\":\"3000\",\"desc\":\"Claim up to RM3,000 for child care\\\/kindergarten fees.\",\"group\":\"child_details\",\"enabled\":1,\"conditional\":\"has_children=yes\",\"unit\":\"RM\"},{\"name\":\"child_relief_amount\",\"label\":\"Child Relief Total\",\"type\":\"number\",\"desc\":\"Auto-calculated: total relief from all children.\",\"group\":\"child_details\",\"enabled\":1,\"readonly\":1,\"unit\":\"RM\",\"conditional\":\"has_children=yes\",\"max\":\"\"}]},\"parent_details\":{\"title\":\"Parent Details\",\"fields\":[{\"name\":\"parent_medical\",\"label\":\"Parent Medical [Max 8,000]\",\"type\":\"number\",\"max\":\"8000\",\"desc\":\"Medical expenses for parents, max RM8,000.\",\"group\":\"parent_details\",\"enabled\":1,\"unit\":\"RM\"}]},\"other_details\":{\"title\":\"Other Details\",\"fields\":[{\"name\":\"prs\",\"label\":\"Annuity \\\/ PRS [Max 3,000]\",\"type\":\"number\",\"max\":\"3000\",\"desc\":\"Private Retirement Scheme (PRS) or annuity, max RM3,000.\",\"group\":\"other_details\",\"enabled\":1,\"unit\":\"RM\"},{\"name\":\"insurance\",\"label\":\"Education & Medical Insurance (Self\\\/Spouse\\\/Child) [Max 3,000]\",\"type\":\"number\",\"max\":\"3000\",\"desc\":\"Combined education and medical insurance, max RM3,000.\",\"group\":\"other_details\",\"enabled\":1,\"unit\":\"RM\"},{\"name\":\"edu_fees\",\"label\":\"Education Fees (Self) [Max 7,000]\",\"type\":\"number\",\"max\":\"7000\",\"desc\":\"Your own approved education fees, max RM7,000.\",\"group\":\"other_details\",\"enabled\":1,\"unit\":\"RM\"},{\"name\":\"support_equip\",\"label\":\"Supporting Equipment [Max 6,000]\",\"type\":\"number\",\"max\":\"6000\",\"desc\":\"Equipment for disability, max RM6,000.\",\"group\":\"other_details\",\"enabled\":1,\"unit\":\"RM\"},{\"name\":\"medical\",\"label\":\"Medical Expenses (Self\\\/Spouse\\\/Child) [Max 10,000]\",\"type\":\"number\",\"max\":\"10000\",\"desc\":\"Medical expenses for self\\\/spouse\\\/child, max RM10,000.\",\"group\":\"other_details\",\"enabled\":1,\"unit\":\"RM\"},{\"name\":\"epf\",\"label\":\"EPF \\\/ KWSP [Max 4,000]\",\"type\":\"number\",\"max\":\"4000\",\"desc\":\"Your KWSP (EPF) contributions, max RM4,000.\",\"group\":\"other_details\",\"enabled\":1,\"unit\":\"RM\"},{\"name\":\"life_ins\",\"label\":\"Life Insurance \\\/ Family Takaful \\\/ Additional Voluntary Contribution to EPF [Max 3,000]\",\"type\":\"number\",\"max\":\"3000\",\"desc\":\"Life\\\/family takaful\\\/AVC to EPF, max RM3,000.\",\"group\":\"other_details\",\"enabled\":1,\"unit\":\"RM\"},{\"name\":\"lifestyle\",\"label\":\"Lifestyle [Max 2,500]\",\"type\":\"number\",\"max\":\"2500\",\"desc\":\"Lifestyle expenses (books, gadgets, etc.), max RM2,500.\",\"group\":\"other_details\",\"enabled\":1,\"unit\":\"RM\"},{\"name\":\"sport\",\"label\":\"Sport Equipment & Activities (Self\\\/Spouse\\\/Child) [Max 1,000]\",\"type\":\"number\",\"max\":\"1000\",\"desc\":\"Sport equipment\\\/fees, max RM1,000.\",\"group\":\"other_details\",\"enabled\":1,\"unit\":\"RM\"},{\"name\":\"socso\",\"label\":\"SOCSO \\\/ PERKESO [Max 350]\",\"type\":\"number\",\"max\":\"350\",\"desc\":\"SOCSO\\\/Perkeso contributions, max RM350.\",\"group\":\"other_details\",\"enabled\":1,\"unit\":\"RM\"},{\"name\":\"ev_charge\",\"label\":\"Electric Vehicle Charging Expenses [Max 2,500]\",\"type\":\"number\",\"max\":\"2500\",\"desc\":\"EV charging expenses, max RM2,500.\",\"group\":\"other_details\",\"enabled\":1,\"unit\":\"RM\"},{\"name\":\"pcb\",\"label\":\"PCB\",\"type\":\"number\",\"desc\":\"Monthly tax (PCB) paid via salary deduction.\",\"group\":\"other_details\",\"enabled\":1,\"unit\":\"RM\",\"max\":\"\"},{\"name\":\"zakat\",\"label\":\"Zakat\",\"type\":\"number\",\"desc\":\"Zakat paid can offset your tax bill.\",\"group\":\"other_details\",\"enabled\":1,\"unit\":\"RM\",\"max\":\"\"}]}};\r\nwindow.tcp_settings_active_year = \"2025\";\r\nwindow.tcp_exempt_per_year = 10000;\r\n\/\/ v1778160080<\/script>\r\n\r\n<script>\r\nwindow.tcp_relief_individual = 9000;\r\nwindow.tcp_relief_disabled_self         = 7000;\r\nwindow.tcp_relief_disabled_spouse       = 6000;\r\nwindow.tcp_relief_child_under18            = 2000;\r\nwindow.tcp_relief_child_alevel             = 2000;\r\nwindow.tcp_relief_child_diploma            = 8000;\r\nwindow.tcp_relief_child_disabled           = 6000;\r\nwindow.tcp_relief_child_disabled_diploma   = 8000;\r\nwindow.tcp_rebate_threshold = 35000;\r\nwindow.tcp_rebate_amount = 400;\r\nwindow.tcp_tax_bands = [{\"min\":0,\"max\":5000,\"rate\":0},{\"min\":5001,\"max\":20000,\"rate\":0.01},{\"min\":20001,\"max\":35000,\"rate\":0.03},{\"min\":35001,\"max\":50000,\"rate\":0.06},{\"min\":50001,\"max\":70000,\"rate\":0.11},{\"min\":70001,\"max\":100000,\"rate\":0.19},{\"min\":100001,\"max\":400000,\"rate\":0.25},{\"min\":400001,\"max\":600000,\"rate\":0.26},{\"min\":600001,\"max\":2000000,\"rate\":0.28},{\"min\":2000001,\"max\":\"\",\"rate\":0.3}];\r\n<\/script>\r\n\r\n<script>\r\nwindow.tcp_tax_bands = [{\"min\":0,\"max\":5000,\"rate\":0},{\"min\":5001,\"max\":20000,\"rate\":0.01},{\"min\":20001,\"max\":35000,\"rate\":0.03},{\"min\":35001,\"max\":50000,\"rate\":0.06},{\"min\":50001,\"max\":70000,\"rate\":0.11},{\"min\":70001,\"max\":100000,\"rate\":0.19},{\"min\":100001,\"max\":400000,\"rate\":0.25},{\"min\":400001,\"max\":600000,\"rate\":0.26},{\"min\":600001,\"max\":2000000,\"rate\":0.28},{\"min\":2000001,\"max\":\"\",\"rate\":0.3}];\r\n<\/script>\r\n\r\n\r\n<script>\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n    \/\/ Tooltips\r\n    document.querySelectorAll('.tcp-tip').forEach(function(el){\r\n        el.addEventListener('mouseenter', function(e){\r\n            let tip = document.createElement('div');\r\n            tip.className = 'tcp-tooltip-tip';\r\n            tip.style.cssText =\r\n                'position:absolute;z-index:9999;background:#3876ba;color:#fff;padding:7px 11px;'\r\n                + 'border-radius:7px;font-size:.95em;max-width:220px;'\r\n                + 'left:' + (e.pageX + 8) + 'px;top:' + (e.pageY - 14) + 'px;'\r\n                + 'box-shadow:0 2px 8px #0002;';\r\n            tip.innerText = el.getAttribute('data-tip') || '';\r\n            tip.id = 'tcp-tip-pop';\r\n            document.body.appendChild(tip);\r\n        });\r\n        el.addEventListener('mouseleave', function(){\r\n            let tip = document.getElementById('tcp-tip-pop');\r\n            if (tip) tip.remove();\r\n        });\r\n    });\r\n\r\n    \/\/ === Show\/hide by data-cond attribute on each row ===\r\n    function tcp_eval_cond(cond, form) {\r\n        if (!cond) return true;\r\n        \/\/ E.g. 'got_compensation', 'marital_status!=single', 'has_children=yes'\r\n        let match = cond.match(\/^([a-zA-Z0-9_]+)([=!]+)(.+)$\/);\r\n        if (match) {\r\n            let name   = match[1],\r\n                op     = match[2],\r\n                expect = match[3];\r\n            let field = form.querySelector(`[name=\"${name}\"]`);\r\n            let fval  = \"\";\r\n            if (field) {\r\n                if (field.type === \"checkbox\") {\r\n                    fval = field.checked ? \"yes\" : \"no\";\r\n                } else if (field.type === \"radio\") {\r\n                    let sel = form.querySelector(`[name=\"${name}\"]:checked`);\r\n                    fval = sel ? sel.value : \"\";\r\n                } else {\r\n                    fval = field.value;\r\n                }\r\n            }\r\n            if ((op === \"=\" || op === \"==\") && fval == expect) return true;\r\n            if (op === \"!=\" && fval != expect)        return true;\r\n            return false;\r\n        } else {\r\n            \/\/ simple flag (checkbox or any non\u2010empty value)\r\n            let field = form.querySelector(`[name=\"${cond}\"]`);\r\n            if (field) {\r\n                if (field.type === \"checkbox\") return field.checked;\r\n                return !!field.value;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n\r\n\/\/ === Show\/hide by data-cond attribute on each row ===\r\nfunction tcp_apply_conditionals() {\r\n    let form = document.getElementById('taxcalcpro_form');\r\n    form.querySelectorAll('.tcp-form-row[data-cond]').forEach(function(row){\r\n        let cond = row.getAttribute('data-cond');\r\n        row.style.display = tcp_eval_cond(cond, form) ? '' : 'none';\r\n    });\r\n}\r\ndocument.getElementById('taxcalcpro_form').addEventListener('input', tcp_apply_conditionals);\r\ndocument.getElementById('taxcalcpro_form').addEventListener('change', tcp_apply_conditionals);\r\ntcp_apply_conditionals();\r\n\r\n\r\n\/\/ \u2500\u2500\u2500 Service Years + Compensation Exemption Calculator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction calcCompletedYears(start, end) {\r\n    if (!start || !end) return 0;\r\n    let s = new Date(start),\r\n        e = new Date(end);\r\n    if (isNaN(s.getTime()) || isNaN(e.getTime())) return 0;\r\n    let years = e.getFullYear() - s.getFullYear();\r\n    let m     = e.getMonth() - s.getMonth();\r\n    let d     = e.getDate() - s.getDate();\r\n    \/\/ If month\/day in \u201cend\u201d is earlier than \u201cstart,\u201d subtract one year\r\n    if (m < 0 || (m === 0 && d < 0)) years--;\r\n    return years >= 0 ? years : 0;\r\n}\r\n\r\nconst gotCompCheckbox     = document.querySelector('[name=\"got_compensation\"]');\r\nconst compStartInput      = document.querySelector('[name=\"comp_start_date\"]');\r\nconst compEndInput        = document.querySelector('[name=\"comp_end_date\"]');\r\nconst compYearsInput      = document.querySelector('[name=\"comp_completed_years\"]');\r\nconst compAmountInput     = document.querySelector('[name=\"comp_amount\"]');\r\nconst compExemptInput     = document.querySelector('[name=\"comp_exempt_amount\"]');\r\nconst compTaxableInput    = document.querySelector('[name=\"comp_taxable_amount\"]');\r\n\r\n\/\/ \u2500\u2500 NEW: Rental-income & combined total elements \u2500\u2500\r\nconst hasRentalCheckbox    = document.querySelector('[name=\"has_rental_income\"]');\r\nconst rentalAmountInput    = document.querySelector('[name=\"rental_income_amount\"]');\r\nconst combinedIncomeInput  = document.querySelector('[name=\"combined_income_total\"]');\r\nconst baseIncomeInput      = document.querySelector('[name=\"income\"]');\r\n\r\nfunction updateServiceYearsAndComp() {\r\n    \/\/ 1) calculate completed years\r\n    const start = compStartInput.value;\r\n    const end   = compEndInput.value;\r\n    const years = calcCompletedYears(start, end);\r\n    if (compYearsInput) {\r\n        compYearsInput.value = years;\r\n    }\r\n\r\n    \/\/ 2) calculate exempt portion and taxable portion\r\n    let compAmt       = Number(compAmountInput.value || 0);\r\n    let perYearExempt = Number(window.tcp_exempt_per_year || 10000);\r\n    let maxExempt     = years * perYearExempt;\r\n    let actualExempt  = Math.min(compAmt, maxExempt);\r\n    let taxableCompAmt = compAmt - actualExempt;\r\n\r\n    if (compExemptInput) {\r\n        compExemptInput.value = actualExempt;\r\n    }\r\n    if (compTaxableInput) {\r\n        compTaxableInput.value = taxableCompAmt >= 0 ? taxableCompAmt : 0;\r\n    }\r\n    \/\/ \u2500\u2500 After recalculating compensation, update combined income too \u2500\u2500\r\n    updateCombinedIncome();\r\n}\r\n\r\n\/\/ \u2500\u2500 NEW: compute base income + taxable compensation + rental income \u2500\u2500\r\nfunction updateCombinedIncome() {\r\n    let baseInc = Number(baseIncomeInput.value || 0);\r\n    let compTax = Number(compTaxableInput.value || 0);\r\n    \/\/ If rental checkbox is checked, include rental amount; else zero\r\n    let rent = 0;\r\n    if (hasRentalCheckbox && hasRentalCheckbox.checked) {\r\n        rent = Number(rentalAmountInput.value || 0);\r\n    }\r\n    let total = baseInc + compTax + rent;\r\n    if (combinedIncomeInput) {\r\n        combinedIncomeInput.value = total >= 0 ? total : 0;\r\n    }\r\n}\r\n\r\n\r\nif (gotCompCheckbox) {\r\n    gotCompCheckbox.addEventListener('change', function() {\r\n        \/\/ Clear all compensation-related inputs if checkbox is unticked\r\n        if (!gotCompCheckbox.checked) {\r\n            compStartInput.value  = '';\r\n            compEndInput.value    = '';\r\n            compAmountInput.value = '';\r\n            if (compYearsInput)   compYearsInput.value = '';\r\n            if (compExemptInput)  compExemptInput.value = '';\r\n            if (compTaxableInput) compTaxableInput.value = '';\r\n        }\r\n        tcp_apply_conditionals();\r\n    });\r\n}\r\n\r\nif (compStartInput) {\r\n    compStartInput.addEventListener('change', updateServiceYearsAndComp);\r\n}\r\nif (compEndInput) {\r\n    compEndInput.addEventListener('change', updateServiceYearsAndComp);\r\n}\r\nif (compAmountInput) {\r\n    compAmountInput.addEventListener('input', updateServiceYearsAndComp);\r\n}\r\n\r\n\/\/ \u2500\u2500 NEW: base income changes also recalc combined total \u2500\u2500\r\nif (baseIncomeInput) {\r\n    baseIncomeInput.addEventListener('input', updateCombinedIncome);\r\n}\r\n\r\n\/\/ \u2500\u2500 NEW: when rental checkbox toggles, clear\/show\/hide rental amount & recalc \u2500\u2500\r\nif (hasRentalCheckbox) {\r\n    hasRentalCheckbox.addEventListener('change', function() {\r\n        \/\/ If unticked, clear rental amount\r\n        if (!hasRentalCheckbox.checked && rentalAmountInput) {\r\n            rentalAmountInput.value = '';\r\n        }\r\n        tcp_apply_conditionals();\r\n        updateCombinedIncome();\r\n    });\r\n}\r\n\r\n\/\/ \u2500\u2500 NEW: when rental income amount changes, recalc combined \u2500\u2500\r\nif (rentalAmountInput) {\r\n    rentalAmountInput.addEventListener('input', updateCombinedIncome);\r\n}\r\n\r\n\r\n\/\/ \u2500\u2500 NEW: compute \u201cTotal Relief Amount\u201d whenever any relief-related input changes \u2500\u2500\r\nfunction updateTotalRelief() {\r\n    let form = document.getElementById('taxcalcpro_form');\r\n\r\n    \/\/ 1) Base individual\/spouse relief:\r\n    let reliefIndividual = Number(window.tcp_relief_individual || 0);\r\n\r\n    \/\/ 2) Disabled-self relief if checked:\r\n    let reliefDisabledSelf = 0;\r\n    let selfCheckbox = form.querySelector('[name=\"disabled_self\"]');\r\n    if (selfCheckbox && selfCheckbox.checked) {\r\n        reliefDisabledSelf = Number(window.tcp_relief_disabled_self || 0);\r\n    }\r\n\r\n    \/\/ 3) Spouse disabled relief if checked:\r\n    let reliefDisabledSpouse = 0;\r\n    let spouseCheckbox = form.querySelector('[name=\"spouse_disabled\"]');\r\n    if (spouseCheckbox && spouseCheckbox.checked) {\r\n        reliefDisabledSpouse = Number(window.tcp_relief_disabled_spouse || 0);\r\n    }\r\n\r\n    \/\/ 4) Alimony (always a raw number input, no \u201cconditional\u201d flag here):\r\n    let reliefAlimony = Number(form.querySelector('[name=\"alimony\"]')?.value || 0);\r\n\r\n    \/\/ 4) Child relief:\r\n    let numChildUnder18      = Number(form.querySelector('[name=\"num_child_under18\"]')?.value || 0);\r\n    let numChildALevel       = Number(form.querySelector('[name=\"num_child_alevel\"]')?.value || 0);\r\n    let numChildDiploma      = Number(form.querySelector('[name=\"num_child_diploma\"]')?.value || 0);\r\n    let numDisabledChild     = Number(form.querySelector('[name=\"num_disabled_child\"]')?.value || 0);\r\n    let numDisabledChildDip  = Number(form.querySelector('[name=\"num_disabled_child_diploma\"]')?.value || 0);\r\n\r\n    \/\/ Grab the raw SSPN, breastfeeding, kindergarten amounts:\r\n    let rawSSPN         = Number(form.querySelector('[name=\"sspn\"]')?.value || 0);\r\n    let rawBreastfeed   = Number(form.querySelector('[name=\"breastfeeding\"]')?.value || 0);\r\n    let rawKindergarten = Number(form.querySelector('[name=\"kindergarten\"]')?.value || 0);\r\n\r\n    let reliefChild =\r\n         numChildUnder18      * (Number(window.tcp_relief_child_under18)           || 0)\r\n       + numChildALevel       * (Number(window.tcp_relief_child_alevel)            || 0)\r\n       + numChildDiploma      * (Number(window.tcp_relief_child_diploma)           || 0)\r\n       + numDisabledChild     * (Number(window.tcp_relief_child_disabled)          || 0)\r\n       + numDisabledChildDip  * (Number(window.tcp_relief_child_disabled_diploma) || 0)\r\n       + rawSSPN\r\n       + rawBreastfeed\r\n       + rawKindergarten;\r\n\r\n    \/\/ write that value into the \u201cchild_relief_amount\u201d field:\r\n    let childReliefInput = form.querySelector('[name=\"child_relief_amount\"]');\r\n    if (childReliefInput) {\r\n      childReliefInput.value = reliefChild;\r\n    }\r\n\r\n    \/\/ 5) Parent relief:\r\n    let reliefParent = Number(form.querySelector('[name=\"parent_medical\"]')?.value || 0);\r\n\r\n    \/\/ 6) Other relief:\r\n    let otherFields = [\r\n      'prs','insurance','edu_fees','support_equip','medical',\r\n      'epf','life_ins','lifestyle','sport','socso','ev_charge',\r\n    ];\r\n    let reliefOther = 0;\r\n    otherFields.forEach(name => {\r\n      let v = Number(form.querySelector(`[name=\"${name}\"]`)?.value || 0);\r\n      reliefOther += v;\r\n    });\r\n\r\n    \/\/ 7) Total Relief (FORM\u2010ONLY: just individual + disabled_self + disabled_spouse)\r\n    let totalRelief = reliefIndividual\r\n                    + reliefDisabledSelf\r\n                    + reliefDisabledSpouse\r\n                    + reliefAlimony;\r\n\r\n    \/\/ 8) Write into the readonly \u201ctotal_relief_amount\u201d field:\r\n    let totalReliefInput = form.querySelector('[name=\"total_relief_amount\"]');\r\n    if (totalReliefInput) {\r\n      totalReliefInput.value = totalRelief;\r\n    }\r\n}\r\n\r\n\/\/ Attach updateTotalRelief() to every relief-related input\r\ndocument.getElementById('taxcalcpro_form').querySelectorAll(\r\n  '[name=\"disabled_self\"], [name=\"spouse_disabled\"], [name=\"alimony\"], [name=\"num_child_under18\"], [name=\"num_child_alevel\"], [name=\"num_child_diploma\"], \\\r\n   [name=\"num_disabled_child\"], [name=\"num_disabled_child_diploma\"], [name=\"parent_medical\"], \\\r\n   [name=\"sspn\"], [name=\"breastfeeding\"], [name=\"kindergarten\"], [name=\"prs\"], [name=\"insurance\"], \\\r\n   [name=\"edu_fees\"], [name=\"support_equip\"], [name=\"medical\"], [name=\"epf\"], [name=\"life_ins\"], \\\r\n   [name=\"lifestyle\"], [name=\"sport\"], [name=\"socso\"], [name=\"ev_charge\"]'\r\n).forEach(el => {\r\n  el.addEventListener('input', updateTotalRelief);\r\n  el.addEventListener('change', updateTotalRelief);\r\n});\r\n\r\n\/\/ Call it once on page load to initialize the field\r\nupdateTotalRelief();\r\n\r\n\r\n\/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\/\/ === Calculation logic remains as before ===\r\n\/\/ \u5728\u77ed\u78bc\u7684 JavaScript \u8a08\u7b97\u908f\u8f2f\u4e2d\uff0c\u4f7f\u7528\u65b0\u7684\u9580\u6abb\u548c\u91d1\u984d\r\ndocument.getElementById('taxcalcpro_form').addEventListener('submit', function(e) {\r\n    e.preventDefault();\r\n    const form = e.target;\r\n\r\n    function val(name, isNum = true, yesVal = 'yes') {\r\n        let el = form.querySelector(`[name=\"${name}\"]`);\r\n        if (!el) return isNum ? 0 : '';\r\n        if (el.type === \"checkbox\") return el.checked ? yesVal : 'no';\r\n        if (isNum) return Number(el.value || 0);\r\n        return el.value;\r\n    }\r\n\r\n    \/\/ Fetch all values\r\n    let income = val('combined_income_total');\r\n    let disabled_self = val('disabled_self', false) === 'yes';\r\n    let spouse_disabled = val('spouse_disabled', false) === 'yes';\r\n    let alimony = val('alimony');\r\n    let num_child_under18 = val('num_child_under18');\r\n    let num_child_alevel = val('num_child_alevel');\r\n    let num_child_diploma = val('num_child_diploma');\r\n    let num_disabled_child = val('num_disabled_child');\r\n    let num_disabled_child_diploma = val('num_disabled_child_diploma');\r\n    let sspn = val('sspn');\r\n    let breastfeeding = val('breastfeeding');\r\n    let kindergarten = val('kindergarten');\r\n    let parent_medical = val('parent_medical');\r\n    let prs = val('prs');\r\n    let insurance = val('insurance');\r\n    let edu_fees = val('edu_fees');\r\n    let support_equip = val('support_equip');\r\n    let medical = val('medical');\r\n    let epf = val('epf');\r\n    let life_ins = val('life_ins');\r\n    let lifestyle = val('lifestyle');\r\n    let sport = val('sport');\r\n    let socso = val('socso');\r\n    let ev_charge = val('ev_charge');\r\n    let zakat = val('zakat');\r\n\r\n    \/\/ Use admin-configured reliefs\r\n    let reliefIndividual   = Number(window.tcp_relief_individual || 0);\r\n    let reliefDisabledSelf = disabled_self ? Number(window.tcp_relief_disabled_self || 0) : 0;\r\n    let reliefDisabledSpouse = spouse_disabled ? Number(window.tcp_relief_disabled_spouse || 0) : 0;\r\n    let reliefAlimony = Number(form.querySelector('[name=\"alimony\"]')?.value || 0);\r\n\r\n    let reliefChild =\r\n        num_child_under18   * (Number(window.tcp_relief_child_under18)           || 0) +\r\n        num_child_alevel    * (Number(window.tcp_relief_child_alevel)            || 0) +\r\n        num_child_diploma   * (Number(window.tcp_relief_child_diploma)           || 0) +\r\n        num_disabled_child  * (Number(window.tcp_relief_child_disabled)          || 0) +\r\n        num_disabled_child_diploma * (Number(window.tcp_relief_child_disabled_diploma) || 0) +\r\n        sspn +\r\n        breastfeeding +\r\n        kindergarten;\r\n\r\n    let reliefParent = parent_medical;\r\n    let reliefOtherSpouse = alimony;\r\n    let reliefOther =\r\n        prs + insurance + edu_fees + support_equip + medical +\r\n        epf + life_ins + lifestyle + sport + socso + ev_charge;\r\n\r\n    let total_relief =\r\n        reliefIndividual +\r\n        reliefDisabledSelf +\r\n        reliefDisabledSpouse +\r\n        reliefChild +\r\n        reliefParent +\r\n        reliefOtherSpouse +\r\n        reliefOther;\r\n\r\n    let taxable = Math.max(0, income - total_relief);\r\n\r\n    \/\/ Build bands from admin settings\r\n    let bands = window.tcp_tax_bands.map(b => ({\r\n        min: b.min,\r\n        max: b.max === '' ? Infinity : b.max,\r\n        rate: b.rate\r\n    }));\r\n\r\n    \/\/ Calculate tax by band\r\n    let amount = 0;\r\n    let breakdown = \"\";\r\n\r\n    bands.forEach((slab, idx) => {\r\n        let lower = Number(slab.min);\r\n        let upper = slab.max;\r\n        if (taxable <= lower) return;\r\n\r\n        let sliceUpper = Math.min(taxable, upper);\r\n        let prevBound = lower > 0 ? lower - 1 : 0;\r\n        let bandAmt = sliceUpper - prevBound;\r\n        if (bandAmt < 0) bandAmt = 0;\r\n\r\n        let taxOnSlice = bandAmt * slab.rate;\r\n        amount += taxOnSlice;\r\n\r\n        let displayLower = lower;\r\n        let displayUpper = sliceUpper;\r\n\r\n        breakdown += `\r\n            <div style=\"color:#666;font-size:.97em;\">\r\n                Tier ${idx + 1} (${displayLower.toLocaleString()}\u2013${displayUpper.toLocaleString()}):\r\n                ${bandAmt.toLocaleString()} \u00d7 ${(slab.rate * 100).toFixed(0)}% = ${taxOnSlice.toFixed(0)}\r\n            <\/div>`;\r\n    });\r\n\r\n    let rebateThreshold = Number(window.tcp_rebate_threshold || 0);\r\n    let rebateAmount = Number(window.tcp_rebate_amount || 0);\r\n    let rebateApplied = (taxable <= rebateThreshold ? rebateAmount : 0);\r\n    let tax_to_pay = Math.max(0, amount - (zakat || 0) - rebateApplied);\r\n\r\n    document.getElementById('taxcalcpro_result').innerHTML = `\r\n        <div class=\"tcp-summary-header\">\r\n            Income Tax Summary\r\n        <\/div>\r\n        <div style=\"background:#fff;padding:22px 18px 20px 18px;border-radius:0 0 9px 9px;border:1.3px solid #2373e9;\">\r\n            <div style=\"margin-bottom:1.2em;\">\r\n                <span style=\"color:#444;font-weight:600;\">Gross Income Before Deduction<\/span>\r\n                <span style=\"float:right;font-size:1.19em;\">${income.toLocaleString()}<\/span>\r\n            <\/div>\r\n            <div style=\"color:#d83a3a;font-weight:600;\">\r\n                Tax Deductions\r\n                <span style=\"float:right;\">- ${total_relief.toLocaleString()}<\/span>\r\n            <\/div>\r\n            <div style=\"margin-bottom:1.2em; color:#888;font-size:.98em;\">\r\n                <div style=\"margin-left:16px;\">\r\n                    Individual \/ Spouse Relief\r\n                    <span style=\"float:right;\">${reliefIndividual.toLocaleString()}<\/span>\r\n                <\/div>\r\n                <div style=\"margin-left:16px;\">\r\n                    Other Spouse Relief\r\n                    <span style=\"float:right;\">${reliefOtherSpouse.toLocaleString()}<\/span>\r\n                <\/div>\r\n                <div style=\"margin-left:16px;color:#333;\">\r\n                    Disabled Self Relief\r\n                    <span style=\"float:right;\">${reliefDisabledSelf.toLocaleString()}<\/span>\r\n                <\/div>\r\n                <div style=\"margin-left:16px;color:#333;\">\r\n                    Spouse Disabled Relief\r\n                    <span style=\"float:right;\">${reliefDisabledSpouse.toLocaleString()}<\/span>\r\n                <\/div>\r\n                <div style=\"margin-left:16px;\">\r\n                    Child Relief\r\n                    <span style=\"float:right;\">${reliefChild.toLocaleString()}<\/span>\r\n                <\/div>\r\n                <div style=\"margin-left:16px;\">\r\n                    Parent Relief\r\n                    <span style=\"float:right;\">${reliefParent.toLocaleString()}<\/span>\r\n                <\/div>\r\n                <div style=\"margin-left:16px;\">\r\n                    Other Relief\r\n                    <span style=\"float:right;\">${reliefOther.toLocaleString()}<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div style=\"border-bottom:1px solid #ccc;margin-bottom:1em;\"><\/div>\r\n            <div style=\"color:#333;\">\r\n                <span style=\"font-weight:600;\">Taxable Income<\/span>\r\n                <span style=\"float:right;font-size:1.16em;\">${taxable.toLocaleString()}<\/span>\r\n            <\/div>\r\n            <div style=\"margin:8px 0 7px 0;\">\r\n                <span style=\"font-weight:600;\">Tax Amount (by bands)<\/span>\r\n                <span style=\"float:right;font-size:1.19em;\">${Math.round(amount)}<\/span>\r\n            <\/div>\r\n            <div style=\"margin-bottom:1.2em;margin-left:14px;\">\r\n                ${breakdown}\r\n            <\/div>\r\n            <div style=\"color:#d83a3a;font-weight:600;\">\r\n                Less Zakat\r\n                <span style=\"float:right;\">- ${(zakat || 0).toLocaleString()}<\/span>\r\n            <\/div>\r\n            <div style=\"color:#d83a3a;font-weight:600;margin-bottom:1.2em;\">\r\n                Less Tax Rebate\r\n                <span style=\"float:right;\">- ${rebateApplied.toLocaleString()}<\/span>\r\n            <\/div>\r\n            <div style=\"border-bottom:2px solid #2373e9;margin-bottom:1.2em;\"><\/div>\r\n            <div style=\"color:#222;font-weight:700;font-size:1.3em;\">\r\n                Tax You Should Pay\r\n                <span style=\"float:right;\">RM ${Math.round(tax_to_pay)}<\/span>\r\n            <\/div>\r\n            <div style=\"color:#888;font-size:1em;\">\r\n                Average Tax Rate<br>\r\n                <span style=\"font-size:.98em;\">\r\n                    (${Math.round(tax_to_pay)}\/${taxable.toLocaleString()}) x 100% = \r\n                    ${(taxable > 0 ? (tax_to_pay \/ taxable * 100).toFixed(1) : '0.0')}%\r\n                <\/span>\r\n            <\/div>\r\n        <\/div>\r\n    `;\r\n});\r\n\r\n\r\n\r\n\r\n});\r\n<\/script>\r\n\r\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Malaysia Tax Calculator to Estimate Your Income Tax Easily Filing taxes can be stressful, but it doesn\u2019t have to be. Our Malaysia tax calculator is built to help you estimate your annual income tax based on local tax brackets, reliefs, and rebates. Whether you&#8217;re employed, self-employed, or running a business, this tool simplifies the math\u2014so [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"cybocfi_hide_featured_image":"","footnotes":""},"class_list":["post-11869","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/pages\/11869","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/comments?post=11869"}],"version-history":[{"count":70,"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/pages\/11869\/revisions"}],"predecessor-version":[{"id":13187,"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/pages\/11869\/revisions\/13187"}],"wp:attachment":[{"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/media?parent=11869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}