Job Description
Database Support – Job Description
We are looking for a detail-oriented candidate to assist with database queries and data operations, ensuring accurate data handling and smooth system performance.
Key Responsibilities:
- Assist in writing and executing database queries
- Support data entry, updates, and maintenance tasks
- Help in data validation and ensuring data accuracy
- Generate basic reports and extract data as required
- Assist in troubleshooting data-related issues
- Work closely with developers and database administrators
- Maintain proper documentation of data processes
Required Skills:
- {
if (window.__sharedFormValidationLoaded) {
return;
}
window.__sharedFormValidationLoaded = true;
const disallowedChars = ["%","\u003C","\u003E","[","]","^","#","\u0026","*","$","|","\\","{","}","+","="];
const managedFormSelector = "form:not(.no-validation)";
const richTextFieldSelector = "textarea.tinymce_editor";
const textLikeFieldSelector = [
'input[type="text"]:not(.tagify)',
'input[type="email"]:not(.tagify)',
'input[type="tel"]:not(.tagify)',
'input:not([type]):not(.tagify)',
'textarea:not(.tagify)'
].join(", ");
const numberFieldSelector = 'input[type="number"]';
const ensureErrorNode = (input) => {
const nextNode = input.nextElementSibling;
if (nextNode && nextNode.classList && nextNode.classList.contains("js-field-error")) {
return nextNode;
}
const errorNode = document.createElement("small");
errorNode.className = "js-field-error text-danger d-block mt-1 d-none";
input.insertAdjacentElement("afterend", errorNode);
return errorNode;
};
const setFieldError = (input, message) => {
const errorNode = ensureErrorNode(input);
if (message) {
errorNode.textContent = message;
errorNode.classList.remove("d-none");
input.setCustomValidity(message);
return;
}
errorNode.textContent = "";
errorNode.classList.add("d-none");
input.setCustomValidity("");
};
const sanitizeNumberInput = (input) => {
const oldValue = input.value;
let newValue = "";
let dotCount = 0;
let cursorOffset = 0;
const selectionStart = typeof input.selectionStart === "number" ? input.selectionStart : null;
for (let i = 0; i < oldValue.length; i++) {
const char = oldValue[i];
const keepChar = (char >= "0" && char <= "9") || (char === "." && dotCount === 0);
if (keepChar) {
if (char === ".") {
dotCount++;
}
newValue += char;
} else if (selectionStart !== null && i < selectionStart) {
cursorOffset++;
}
}
if (newValue !== oldValue) {
input.value = newValue;
if (
selectionStart !== null &&
typeof input.setSelectionRange === "function"
) {
const newPosition = Math.max(0, selectionStart - cursorOffset);
input.setSelectionRange(newPosition, newPosition);
}
}
};
const validateTextLikeInput = (input) => {
const value = input.value || "";
let filteredDisallowed = disallowedChars.slice();
if (input.type === "email") {
filteredDisallowed = filteredDisallowed.filter((char) => char !== "@");
}
if (input.type !== "number") {
filteredDisallowed = filteredDisallowed.filter((char) => char !== ".");
}
let error = "";
if (filteredDisallowed.some((char) => char && value.includes(char))) {
error = "Invalid character entered! " + filteredDisallowed.join(" ");
} else if (
input.type !== "email" &&
!input.classList.contains("no-minlength") &&
value.length > 0 &&
value.length < 4
) {
error = "Minimum 4 characters required";
}
setFieldError(input, error);
};
const handleField = (target) => {
if (!(target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement)) {
return;
}
// Ignore Select2's internal search input so typing there does not trigger
// the generic minimum-length validator used for normal text fields.
if (
target.classList.contains("select2-search__field") ||
target.closest(".select2-container")
) {
setFieldError(target, "");
return;
}
if (!target.closest(managedFormSelector)) {
return;
}
// Tagify keeps its own serialized value in the original input, which
// includes JSON characters that should not be validated by this rule.
if (target.classList.contains("tagify")) {
setFieldError(target, "");
return;
}
// TinyMCE stores HTML markup in the underlying textarea, so the generic
// disallowed-character check would incorrectly flag valid rich text.
if (target.matches(richTextFieldSelector)) {
setFieldError(target, "");
return;
}
if (target.matches(numberFieldSelector)) {
sanitizeNumberInput(target);
return;
}
if (target.matches(textLikeFieldSelector)) {
validateTextLikeInput(target);
}
};
document.addEventListener("input", (event) => {
handleField(event.target);
}, true);
document.addEventListener("change", (event) => {
handleField(event.target);
}, true);
[
'input[type="text"]:not(.tagify)',
'input[type="email"]:not(.tagify)',
'input[type="tel"]:not(.tagify)',
'input[type="number"]',
'input:not([type]):not(.tagify)',
'textarea.tinymce_editor',
'textarea:not(.tagify)'
].forEach((selector) => {
document.querySelectorAll(`${managedFormSelector} ${selector}`).forEach((field) => {
handleField(field);
});
});
});