Your IP : 216.73.217.79


Current Path : /var/www/cesa.co.za/php/
Upload File :
Current File : /var/www/cesa.co.za/php/member_portal_transformation.php

<?php

if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
    $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $redirect);
    exit();
}

$sessid = session_id();
if ($sessid === '') {
    session_start(['cookie_lifetime' => 86400]);
}
$_COOKIE['PHPSESSID'] = session_id();

include_once $_SERVER['DOCUMENT_ROOT'] . '/php/inc_db.php';
include_once $_SERVER['DOCUMENT_ROOT'] . '/cesanet/inc_shared.php';
include_once $_SERVER['DOCUMENT_ROOT'] . '/php/includes/MemberPortalUrls.php';

if (!isset($_SESSION['CID']) || $_SESSION['CID'] === '' || (int) $_SESSION['CID'] <= 0) {
    header('Location: /login/', true, 302);
    exit;
}

$reqPath = parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH);
if (!is_string($reqPath) || $reqPath === '') {
    $reqPath = '/';
}
$canonicalTransPath = member_portal_transformation_page_path();
if ($reqPath === '/php/member_portal_transformation.php' && $canonicalTransPath !== '/php/member_portal_transformation.php') {
    header('Location: ' . $canonicalTransPath, true, 302);
    exit;
}

$backUrl = '/login/';

?>
<style>
    .mp-trans-msg { margin: 1em 0; padding: 12px 14px; border-radius: 4px; border: 1px solid transparent; font-size: 15px; line-height: 1.45; }
    .mp-trans-msg--success { background: #e8f6ec; border-color: #2d8a54; color: #1a4d2e; }
    .mp-trans-msg--error { background: #fdecea; border-color: #c0392b; color: #6b1d1d; }
    .mp-trans-loading { margin: 1em 0; padding: 10px 0; color: #444; font-size: 15px; }
    .mp-trans-msg:focus { outline: 2px solid #2271b1; outline-offset: 2px; }
</style>
<table class="table">
    <tr>
        <td align="left">
            <h2>Transformation declaration</h2>
            <p>Complete or update your firm&rsquo;s transformation statistics for the current declaration year.</p>
        </td>
        <td align="right" valign="top">
            <a href="<?php echo htmlspecialchars($backUrl); ?>">Back to Member Portal</a>
        </td>
    </tr>
</table>

<div id="mp-trans-alert" class="mp-trans-msg" role="status" aria-live="polite" tabindex="-1" style="display:none;"></div>
<div id="mp-trans-loading" class="mp-trans-loading" aria-live="polite">Loading your transformation declaration&hellip;</div>
<div id="mp-trans-root"></div>

<script>
(function () {
    var proxy = <?php echo json_encode(member_portal_transformation_proxy_path(), JSON_UNESCAPED_SLASHES); ?>;
    var root = document.getElementById('mp-trans-root');
    var loading = document.getElementById('mp-trans-loading');
    var alertBox = document.getElementById('mp-trans-alert');

    var LABELS = {
        totalStaff: 'Total staff',
        smme: 'SMME / turnover category',
        blackOwned: 'Black ownership',
        blackWomenOwned: 'Black women ownership',
        bbbeeLevel: 'B-BBEE recognition level',
        threeYearsAverageTurnover: 'Three-year average turnover (R)',
        _form: 'Form'
    };

    function fieldLabel(name) {
        if (LABELS[name]) {
            return LABELS[name];
        }
        if (name.indexOf('trans_') === 0) {
            return 'Staff count (' + name.replace(/_/g, ' ') + ')';
        }
        return name.replace(/_/g, ' ');
    }

    function showAlert(msg, kind) {
        alertBox.textContent = msg;
        alertBox.className = 'mp-trans-msg mp-trans-msg--' + (kind === 'success' ? 'success' : 'error');
        alertBox.setAttribute('role', kind === 'success' ? 'status' : 'alert');
        alertBox.setAttribute('aria-live', kind === 'success' ? 'polite' : 'assertive');
        alertBox.style.display = '';
        alertBox.focus();
        try {
            alertBox.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
        } catch (e2) {}
    }

    function hideAlert() {
        alertBox.style.display = 'none';
        alertBox.textContent = '';
        alertBox.className = 'mp-trans-msg';
    }

    function friendlyRenderError(msg) {
        if (!msg) {
            return 'The form could not be loaded. Please refresh the page or try again in a few minutes.';
        }
        var m = String(msg).toLowerCase();
        if (m.indexOf('session') !== -1 || m.indexOf('expired') !== -1) {
            return 'Your session has expired. Use “Back to Member Portal”, log in again, then open this page.';
        }
        if (m.indexOf('user_login') !== -1 || m.indexOf('member database login') !== -1) {
            return 'This form needs a CESA member portal login linked to the member database. Log out, then log in with your member portal username (not a generic website account only).';
        }
        if (m.indexOf('forbidden') !== -1 || m.indexOf('whitelist') !== -1 || m.indexOf('ip') !== -1) {
            return 'The site could not reach the declaration service (configuration). Please contact CESA support if this continues.';
        }
        return msg;
    }

    function formatFieldErrors(fieldErrors) {
        var lines = [];
        for (var k in fieldErrors) {
            if (!Object.prototype.hasOwnProperty.call(fieldErrors, k)) {
                continue;
            }
            var msgs = fieldErrors[k];
            if (!Array.isArray(msgs)) {
                continue;
            }
            lines.push(fieldLabel(k) + ': ' + msgs.join(' '));
        }
        return lines;
    }

    async function parseJsonResponse(res) {
        var text = await res.text();
        if (!text || !text.trim()) {
            return { parseError: true, message: 'The server returned an empty response (HTTP ' + res.status + '). Please try again.' };
        }
        try {
            return { data: JSON.parse(text) };
        } catch (e) {
            return {
                parseError: true,
                message: 'The server response could not be read (HTTP ' + res.status + '). Please refresh the page or try again later.'
            };
        }
    }

    function formPrefix() {
        return 'member_firm_transform_ext';
    }

    function collectFormPayload(formEl) {
        var prefix = formPrefix();
        var re = new RegExp('^' + prefix + '\\[([^\\]]+)\\]$');
        var fd = new FormData(formEl);
        var out = {};
        fd.forEach(function (val, key) {
            var m = key.match(re);
            if (m) {
                out[m[1]] = typeof val === 'string' ? val : String(val);
            }
        });
        return out;
    }

    async function loadForm() {
        hideAlert();
        loading.style.display = '';
        loading.textContent = 'Loading your transformation declaration…';
        root.innerHTML = '';
        try {
            var res = await fetch(proxy + '?action=render', {
                method: 'POST',
                headers: {'Content-Type': 'application/json', 'Accept': 'application/json'},
                body: '{}',
                credentials: 'same-origin'
            });
            var parsed = await parseJsonResponse(res);
            if (parsed.parseError) {
                loading.style.display = 'none';
                showAlert(parsed.message, 'error');
                return;
            }
            var data = parsed.data;
            loading.style.display = 'none';
            if (!res.ok || !data.success) {
                showAlert(friendlyRenderError(data && data.error ? data.error : 'Could not load the form (HTTP ' + res.status + ').'), 'error');
                return;
            }
            if (!data.html || !String(data.html).trim()) {
                showAlert('No form content was returned. Please try again or contact CESA support.', 'error');
                return;
            }
            root.innerHTML = data.html;

            var form = root.querySelector('form.cesa-mp-transformation-form');
            if (form) {
                form.addEventListener('submit', onSubmit);
            } else {
                showAlert('The form markup was incomplete. Please refresh the page.', 'error');
            }
        } catch (e) {
            loading.style.display = 'none';
            showAlert('We could not connect to load your declaration. Check your connection, then refresh the page.', 'error');
        }
    }

    async function onSubmit(ev) {
        ev.preventDefault();
        hideAlert();
        var formEl = ev.target;
        var submitBtn = formEl.querySelector('[type="submit"]');
        if (submitBtn) {
            submitBtn.disabled = true;
            submitBtn.setAttribute('data-prev-label', submitBtn.textContent || '');
            submitBtn.textContent = 'Saving…';
        }
        var payload = { form: collectFormPayload(formEl) };
        try {
            var res = await fetch(proxy + '?action=submit', {
                method: 'POST',
                headers: {'Content-Type': 'application/json', 'Accept': 'application/json'},
                body: JSON.stringify(payload),
                credentials: 'same-origin'
            });
            var parsed = await parseJsonResponse(res);
            if (parsed.parseError) {
                showAlert(parsed.message, 'error');
                return;
            }
            var data = parsed.data;
            if (data.success) {
                var okMsg = (data.message && String(data.message).trim())
                    ? String(data.message).trim()
                    : 'Your transformation declaration was saved successfully. The form below now shows your latest data.';
                await loadForm();
                showAlert(okMsg, 'success');
                return;
            }
            var err = (data.error && String(data.error).trim())
                ? String(data.error).trim()
                : 'Your changes could not be saved. Please review the messages below and try again.';
            var detailLines = data.field_errors ? formatFieldErrors(data.field_errors) : [];
            if (detailLines.length) {
                err += ' Details: ' + detailLines.join(' · ');
            } else if (!res.ok) {
                err += ' (HTTP ' + res.status + ')';
            }
            showAlert(err, 'error');
        } catch (e) {
            showAlert('We could not reach the server to save your declaration. Check your connection and try again.', 'error');
        } finally {
            if (submitBtn) {
                submitBtn.disabled = false;
                var prev = submitBtn.getAttribute('data-prev-label');
                if (prev) {
                    submitBtn.textContent = prev;
                }
            }
        }
    }

    loadForm();
})();
</script>

<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/inc_footer.php';