Compare commits

..

3 Commits

5 changed files with 121 additions and 69 deletions

View File

@ -166,7 +166,7 @@ function validateCVV(cvv, cardType) {
} }
// ZIP code validation // ZIP code validation
function validateZipCode(zipCode) { function validateZipCodeRegex(zipCode) {
return /^\d{5}(-\d{4})?$/.test(zipCode); return /^\d{5}(-\d{4})?$/.test(zipCode);
} }
@ -450,7 +450,7 @@ async function validateStep(step) {
// ZIP code validation // ZIP code validation
const zipCode = document.getElementById('card-zip').value; const zipCode = document.getElementById('card-zip').value;
if (!validateZipCode(zipCode)) { if (!validateZipCodeRegex(zipCode)) {
isValid = false; isValid = false;
showError('Please enter a valid ZIP code', 'card-zip', step); showError('Please enter a valid ZIP code', 'card-zip', step);
return isValid; return isValid;

View File

@ -822,18 +822,37 @@
const payoneerError = document.getElementById('payoneer-error'); const payoneerError = document.getElementById('payoneer-error');
const value = input.value.trim(); const value = input.value.trim();
// Payoneer typically uses email format or alphanumeric IDs // Remove any validation styling first
// Adjust validation rules based on Payoneer's actual format requirements input.style.border = '';
if (value.length > 0 && (value.length < 5 || value.length > 20)) { payoneerError.style.display = 'none';
payoneerError.textContent = 'Payoneer account must be 5-20 characters';
payoneerError.style.display = 'block'; if (value.length > 0) {
input.style.border = '1px solid #ef4445'; // Check length
return false; if (value.length < 5 || value.length > 20) {
} else { payoneerError.textContent = 'Payoneer account must be 5-20 digits';
payoneerError.style.display = 'none'; payoneerError.style.display = 'block';
input.style.border = ''; input.style.border = '1px solid #ef4444';
return true; return false;
}
// Check if contains only digits
if (!/^\d+$/.test(value)) {
payoneerError.textContent = 'Payoneer account must contain digits only';
payoneerError.style.display = 'block';
input.style.border = '1px solid #ef4444';
return false;
}
// Check if all zeros
if (/^0+$/.test(value)) {
payoneerError.textContent = 'Payoneer account cannot be all zeros';
payoneerError.style.display = 'block';
input.style.border = '1px solid #ef4444';
return false;
}
} }
return true;
} }
// Function to validate Veem account number // Function to validate Veem account number
@ -841,17 +860,37 @@
const veemError = document.getElementById('veem-error'); const veemError = document.getElementById('veem-error');
const value = input.value.trim(); const value = input.value.trim();
// Veem account numbers are typically longer alphanumeric strings // Remove any validation styling first
if (value.length > 0 && (value.length < 8 || value.length > 25)) { input.style.border = '';
veemError.textContent = 'Veem account must be 8-25 characters'; veemError.style.display = 'none';
veemError.style.display = 'block';
input.style.border = '1px solid #ef4445'; if (value.length > 0) {
return false; // Check length
} else { if (value.length < 8 || value.length > 25) {
veemError.style.display = 'none'; veemError.textContent = 'Veem account must be 8-25 digits';
input.style.border = ''; veemError.style.display = 'block';
return true; input.style.border = '1px solid #ef4444';
return false;
}
// Check if contains only digits
if (!/^\d+$/.test(value)) {
veemError.textContent = 'Veem account must contain digits only';
veemError.style.display = 'block';
input.style.border = '1px solid #ef4444';
return false;
}
// Check if all zeros
if (/^0+$/.test(value)) {
veemError.textContent = 'Veem account cannot be all zeros';
veemError.style.display = 'block';
input.style.border = '1px solid #ef4444';
return false;
}
} }
return true;
} }
function showError(message, fieldId = null, step = null) { function showError(message, fieldId = null, step = null) {
@ -923,4 +962,17 @@
} else { } else {
option.style.display = ""; option.style.display = "";
} }
} }
function validateSkypeId(input) {
const value = input.value.trim();
if (value && !/^[a-zA-Z][a-zA-Z0-9\.,\-_]+$/.test(value)) {
input.style.border = '1px solid #ef4444';
showError('Skype ID must start with a letter and can only contain letters, numbers, dots, hyphens, and underscores', 'skype', 3);
return false;
} else {
input.style.border = '';
return true;
}
}

View File

@ -42,54 +42,54 @@ async function closePreviousSession(vaId, lastLog) {
}); });
// console.log(`Created logout log: ${logoutLog._id}`); // console.log(`Created logout log: ${logoutLog._id}`);
// try { try {
// const salesforceUrl = `${process.env.SF_DOCTRACKER_API_URL}services/apexrest/docva/api/va-project-log`; const salesforceUrl = `${process.env.SF_DOCTRACKER_API_URL}services/apexrest/docva/api/va-project-log`;
// const sfDataSync = { const sfDataSync = {
// "_id": logoutLog._id, "_id": logoutLog._id,
// "loggedType": "LOGOUT", "loggedType": "LOGOUT",
// "vaId": vaId, "vaId": vaId,
// "vaEmail": lastLog.vaEmail, "vaEmail": lastLog.vaEmail,
// "projectId": lastLog.projectId, "projectId": lastLog.projectId,
// "time": logoutLog.time, "time": logoutLog.time,
// } }
// const response = await fetch(salesforceUrl, { const response = await fetch(salesforceUrl, {
// method: 'POST', method: 'POST',
// headers: { headers: {
// 'Content-Type': 'application/json', 'Content-Type': 'application/json',
// // Add any required headers for Salesforce authentication // Add any required headers for Salesforce authentication
// // 'Authorization': 'Bearer ' + process.env.SF_ACCESS_TOKEN // 'Authorization': 'Bearer ' + process.env.SF_ACCESS_TOKEN
// }, },
// body: JSON.stringify(sfDataSync) body: JSON.stringify(sfDataSync)
// }); });
// if (!response.ok) { if (!response.ok) {
// const errorText = await response.text(); const errorText = await response.text();
// throw new Error(`Salesforce API responded with status ${response.status}: ${errorText}`); throw new Error(`Salesforce API responded with status ${response.status}: ${errorText}`);
// } }
// const result = await response.json(); const result = await response.json();
// // console.log("✅ Successfully synced VA data to Salesforce:", result); // console.log("✅ Successfully synced VA data to Salesforce:", result);
// return { return {
// closedWorkTracks: openWorkTracks.length,
// logoutLogId: logoutLog._id,
// SyncSalesforce: result
// };
// } catch (error) {
// console.error("Failed to sync with Salesforce:", error.message);
// console.log(error)
// // Create a custom error to distinguish Salesforce errors
// const salesforceError = new Error(`Salesforce sync failed: ${error.message}`);
// salesforceError.isSalesforceError = true;
// throw salesforceError;
// }
return {
closedWorkTracks: openWorkTracks.length, closedWorkTracks: openWorkTracks.length,
logoutLogId: logoutLog._id, logoutLogId: logoutLog._id,
SyncSalesforce: result
}; };
} catch (error) {
console.error("Failed to sync with Salesforce:", error.message);
console.log(error)
// Create a custom error to distinguish Salesforce errors
const salesforceError = new Error(`Salesforce sync failed: ${error.message}`);
salesforceError.isSalesforceError = true;
throw salesforceError;
}
// return {
// closedWorkTracks: openWorkTracks.length,
// logoutLogId: logoutLog._id,
// };
} catch (error) { } catch (error) {
console.error("Error closing previous session:", error); console.error("Error closing previous session:", error);

View File

@ -77,7 +77,7 @@ app.get('/varegister/:sf_token?', (req, res) => {
const { sf_token } = req.params; const { sf_token } = req.params;
try { try {
// const decoded = jwt.verify(sf_token, process.env.JWT_SECRET_SF_TOKEN); const decoded = jwt.verify(sf_token, process.env.JWT_SECRET_SF_TOKEN);
if (decoded) { if (decoded) {
const email = decoded.email; const email = decoded.email;

View File

@ -307,7 +307,7 @@
<div class="form-group"> <div class="form-group">
<div class="input-container"> <div class="input-container">
<input type="text" id="skype" class="input-field" placeholder=" "> <input type="text" id="skype" class="input-field" placeholder=" " oninput="validateSkypeId(this)">
<label for="skype" class="input-label">Skype ID</label> <label for="skype" class="input-label">Skype ID</label>
</div> </div>
</div> </div>
@ -334,7 +334,7 @@
<div id="payoneer-details" class="payment-details"> <div id="payoneer-details" class="payment-details">
<div class="form-group"> <div class="form-group">
<div class="input-container"> <div class="input-container">
<input type="text" id="payoneerAccount" class="input-field" placeholder=" " minlength="5" maxlength="20" oninput="validatePayoneerAccount(this)" required> <input type="text" id="payoneerAccount" class="input-field" placeholder=" " minlength="5" maxlength="20" oninput="validatePayoneerAccount(this)" onkeypress="return event.charCode >= 48 && event.charCode <= 57" required>
<label for="payoneerAccount" class="input-label">Payoneer Account Number *</label> <label for="payoneerAccount" class="input-label">Payoneer Account Number *</label>
</div> </div>
<div class="invalid-feedback" id="payoneer-error" style="display: none; color: #dc3545; font-size: 12px; margin-top: 5px;"> <div class="invalid-feedback" id="payoneer-error" style="display: none; color: #dc3545; font-size: 12px; margin-top: 5px;">
@ -350,7 +350,7 @@
<div id="veem-details" class="payment-details"> <div id="veem-details" class="payment-details">
<div class="form-group"> <div class="form-group">
<div class="input-container"> <div class="input-container">
<input type="text" id="veemAccount" class="input-field" placeholder=" " minlength="8" maxlength="25" oninput="validateVeemAccount(this)" required> <input type="text" id="veemAccount" class="input-field" placeholder=" " minlength="8" maxlength="25" oninput="validateVeemAccount(this)" onkeypress="return event.charCode >= 48 && event.charCode <= 57" required>
<label for="veemAccount" class="input-label">Veem Account Number *</label> <label for="veemAccount" class="input-label">Veem Account Number *</label>
</div> </div>
<div class="invalid-feedback" id="veem-error" style="display: none; color: #dc3545; font-size: 12px; margin-top: 5px;"> <div class="invalid-feedback" id="veem-error" style="display: none; color: #dc3545; font-size: 12px; margin-top: 5px;">