| Current Path : /var/www/cesa.co.za/php/ |
| 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’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…</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';