document.addEventListener('DOMContentLoaded', function () {
const dateInput = document.getElementById('date');
const dateError = document.getElementById('dateError');
const calendarIcon = document.getElementById('calendar-icon');
// Set the minimum date to the current date
const today = new Date().toISOString().split('T')[0];
if (dateInput) {
dateInput.setAttribute('min', today);
// Open the calendar when clicking on the icon
calendarIcon.addEventListener('click', function () {
dateInput.focus(); // Focus on the input first
setTimeout(() => dateInput.showPicker(), 0); // Delay to ensure it's within a user gesture
});
// Checking the selected date
dateInput.addEventListener('input', function () {
const selectedDate = new Date(dateInput.value);
const todayDate = new Date(today);
if (selectedDate < todayDate) {
dateError.style.display = 'block';
} else {
dateError.style.display = 'none';
}
});
}
const formSteps = document.querySelectorAll('.form-step');
const progressBarNum = document.getElementById('num');
const progressBar = document.getElementById('progress-bar-wrapper');
const progressBarFill = document.getElementById('progress-bar-fill');
const locationErrorStadt = document.getElementById('locationErrorStadt');
const locationStadt = document.getElementById('location');
const totalSteps = formSteps.length;
let currentStep = 0;
// Set the initial language based on URL parameter or localStorage
const vacancyUrl = window.location.href;
let selectedLanguage = localStorage.getItem('selectedLanguage');
if (!selectedLanguage) {
selectedLanguage = vacancyUrl.includes('/en/') ? 'en' : 'de';
localStorage.setItem('selectedLanguage', selectedLanguage);
}
const languageContainer = document.getElementById('language');
if (languageContainer) {
const languageBoxes = languageContainer.querySelectorAll('.language-box');
if(languageBoxes) {
languageBoxes.forEach((box) => {
if (box.dataset.language === selectedLanguage) {
box.classList.add('active-language');
} else {
box.classList.remove('active-language');
}
box.addEventListener('click', () => {
languageBoxes.forEach((b) => b.classList.remove('active-language'));
box.classList.add('active-language');
localStorage.setItem('selectedLanguage', box.dataset.language);
});
});
}
}
const savedTitle = localStorage.getItem('title');
const titleElement = document.getElementById('title-work-local');
if (titleElement) {
titleElement.textContent = savedTitle || 'Title not found';
} else {
console.warn("Element with ID 'title-work-local' not found on this page.");
}
function showStep(stepIndex) {
formSteps.forEach((step, index) => {
step.classList.toggle('active', index === stepIndex);
});
updateProgressBar(stepIndex);
currentStep = stepIndex;
}
function updateProgressBar(stepIndex) {
progressBarNum.textContent = stepIndex + 1;
if (stepIndex === 0) {
progressBar.style.display = 'none';
} else {
progressBar.style.display = 'flex';
progressBarFill.style.width = `${(stepIndex / (totalSteps - 1)) * 100}%`;
}
}
function validateLocation() {
if (locationStadt.value === 'start-location') {
locationStadt.classList.remove('valid-location');
locationStadt.classList.add('invalid-location');
locationErrorStadt.style.display = 'block';
return false;
} else {
locationStadt.classList.remove('invalid-location');
locationStadt.classList.add('valid-location');
locationErrorStadt.style.display = 'none';
return true;
}
}
// Navigation buttons for steps
document.getElementById('next-step-1').addEventListener('click', function () {
const firstname = document.getElementById('firstname');
const email = document.getElementById('email');
const phone = document.getElementById('phone');
const firstnameError = document.getElementById('nameError');
const emailError = document.getElementById('emailError');
const phoneError = document.getElementById('phoneError');
let isValid = true;
if (!firstname.value.trim()) {
firstnameError.style.display = 'flex';
firstnameError.textContent = 'Please enter your name.';
isValid = false;
} else {
firstnameError.style.display = 'none';
}
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!email.value.trim() || !emailPattern.test(email.value)) {
emailError.style.display = 'flex';
emailError.textContent = 'Please enter a valid email address.';
isValid = false;
} else {
emailError.style.display = 'none';
}
const phonePattern = /(\+?\d{1,4})?(\d{7,})/;
if (!phone.value.trim() || !phonePattern.test(phone.value)) {
phoneError.style.display = 'flex';
phoneError.textContent = 'Please enter a valid phone number.';
isValid = false;
} else {
phoneError.style.display = 'none';
}
if (isValid && currentStep < totalSteps - 1) {
showStep(currentStep + 1);
}
});
document.getElementById('prev-step-0').addEventListener('click', function () {
if (currentStep > 0) {
showStep(currentStep - 1);
}
});
document.getElementById('next-step-2').addEventListener('click', function () {
if (currentStep < totalSteps - 1) {
showStep(currentStep + 1);
}
});
document.getElementById('prev-step-1').addEventListener('click', function () {
if (currentStep > 0) {
showStep(currentStep - 1);
}
});
document.getElementById('next-step-3').addEventListener('click', function () {
if (currentStep < totalSteps - 1) {
showStep(currentStep + 1);
}
});
document.getElementById('prev-step-2').addEventListener('click', function () {
if (currentStep > 0) {
showStep(currentStep - 1);
}
});
// Функция загрузки файла на сервер
function uploadFileToWordPress(file) {
const formData = new FormData();
formData.append('file', file);
formData.append('action', 'upload_file_to_wordpress');
formData.append('security', ajax_object.ajax_nonce); // Добавляем nonce для безопасности
return fetch(ajax_object.ajax_url, {
method: 'POST',
body: formData,
})
.then(response => {
if (!response.ok) {
throw new Error('Failed to upload file');
}
return response.json();
})
.then(data => {
if (data.success) {
return data.data.url; // Возвращаем URL загруженного файла
} else {
throw new Error(data.data.error || 'File upload failed');
}
})
.catch(error => {
console.error("Upload error:", error);
throw error; // Перебрасываем ошибку для дальнейшей обработки
});
}
let uploadedFiles = [];
function setupFileUpload(fileInputId, uploadAreaId, fileNameDisplayId, removeButtonId) {
const fileInput = document.getElementById(fileInputId);
const uploadArea = document.getElementById(uploadAreaId);
const fileNameDisplay = document.getElementById(fileNameDisplayId);
const removeButton = document.getElementById(removeButtonId);
// Массив загруженных файлов
let isFileProcessing = false; // Флаг для защиты от параллельных загрузок
// Проверяем существование всех элементов
if (!fileInput || !uploadArea || !fileNameDisplay || !removeButton) {
console.error("Missing required elements for file upload.");
return;
}
// Обработчик на кнопку открытия диалога
const triggerButton = document.querySelector(`[data-target="${fileInputId}"]`);
if (!triggerButton) {
console.error(`Trigger button for input #${fileInputId} is missing.`);
return;
}
// **Защита от дублирующих обработчиков**
if (!triggerButton.dataset.listenerAdded) {
triggerButton.addEventListener('click', (event) => {
event.preventDefault();
console.log("Opening file dialog...");
fileInput.click(); // Открываем диалог выбора файла
});
triggerButton.dataset.listenerAdded = "true";
}
// Обработчик выбора файла
fileInput.addEventListener('change', async function () {
if (isFileProcessing) {
console.log("File processing is in progress, ignoring...");
return;
}
isFileProcessing = true;
if (fileInput.files.length > 0) {
try {
await handleFiles(fileInput.files);
} catch (error) {
console.error("Error during file handling:", error);
}
}
isFileProcessing = false;
});
// Обработчик Drag & Drop
uploadArea.addEventListener('drop', async function (event) {
event.preventDefault();
if (isFileProcessing) {
console.log("File processing is in progress, ignoring drop...");
return;
}
isFileProcessing = true;
const files = event.dataTransfer.files;
try {
await handleFiles(files);
} catch (error) {
console.error("Error during file handling:", error);
}
isFileProcessing = false;
});
// Предотвращение стандартного поведения при Drag & Drop
['dragenter', 'dragover', 'dragleave', 'drop'].forEach((eventName) => {
uploadArea.addEventListener(eventName, preventDefaults, false);
});
function preventDefaults(e) {
e.preventDefault();
e.stopPropagation();
}
// Проверка формата файла и загрузка
async function handleFiles(files) {
const validExtensions = ['.pdf', '.doc', '.docx', '.jpg', '.jpeg', '.png'];
for (let file of files) {
const fileExtension = file.name.slice(((file.name.lastIndexOf('.') - 1) >>> 0) + 2).toLowerCase();
if (validExtensions.includes(`.${fileExtension}`)) {
try {
console.log("Uploading file:", file.name);
const url = await uploadFileToWordPress(file);
uploadedFiles.push(url);
updateFileList();
} catch (error) {
console.error(`Error uploading file "${file.name}":`, error.message);
alert(`Ошибка загрузки файла "${file.name}": ${error.message}`);
}
} else {
console.error(`Invalid file format: ${file.name}. Allowed formats: PDF, DOC, DOCX, JPG, JPEG, PNG.`);
alert(`Недопустимый формат файла: ${file.name}. Разрешенные форматы: PDF, DOC, DOCX, JPG, JPEG, PNG.`);
}
}
}
// Обновление списка файлов
function updateFileList() {
if (uploadedFiles.length > 0) {
fileNameDisplay.innerHTML = `
${uploadedFiles.map(url => `${url} `).join('')} `;
fileNameDisplay.classList.add('valid-file');
removeButton.style.display = 'inline';
} else {
fileNameDisplay.textContent = '';
removeButton.style.display = 'none';
}
}
// Удаление файлов из списка
removeButton.addEventListener('click', function () {
uploadedFiles = [];
updateFileList();
});
}
// Настройка загрузки для первого и второго блоков
setupFileUpload('resume1', 'upload-area1', 'file-name1', 'remove-file-btn1');
setupFileUpload('resume2', 'upload-area2', 'file-name2', 'remove-file-btn2');
// Handle form submission for the first form
document.getElementById('application-form').addEventListener('submit', function (event) {
if (this.submitting) return;
this.submitting = true;
event.preventDefault();
if (!validateLocation()) {
console.log('Location validation failed!');
this.submitting = false;
return;
}
const urlParams = new URLSearchParams(window.location.search);
const jobId = urlParams.get('job_id');
const formData = new FormData(event.target);
const dataTitleElement = document.getElementById('title-work-local');
const dataTitle = dataTitleElement ? dataTitleElement.textContent.trim() : null;
const uniqueKey = `locations_${dataTitle}`;
const selectedLocations = JSON.parse(localStorage.getItem(uniqueKey)) || [];
console.log('selectedLocations', selectedLocations)
if (!selectedLocations.length) {
console.log('No locations selected!');
this.submitting = false;
return;
}
let firstname = formData.get('firstname');
const email = formData.get('email');
const phone = formData.get('phone');
const nameParts = firstname.split(' ');
const lastname = nameParts.length > 1 ? nameParts.slice(1).join(' ') : '';
firstname = nameParts[0];
if (!firstname || !email || !phone) {
console.log('Missing required fields!');
this.submitting = false;
return;
}
const data = {
jobid: jobId,
firstname: firstname,
lastname: lastname,
email: email,
phone: phone,
locations: selectedLocations,
language: localStorage.getItem('selectedLanguage'),
referrer: new URL(document.referrer).searchParams.get('utm_source') || 'Website'
};
fetch('https://recruiting01.god.de:5005/applications/first', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': '4cc98d781b76e3016f6c8d31896bac97bcca3f2f'
},
body: JSON.stringify(data)
})
.then(response => {
if (response.ok) {
return response.json();
} else {
throw new Error('Failed to submit the form');
}
})
.then(data => {
console.log('Success:', data);
const candidateId = data.data.candidateId;
document.getElementById('candidate-id').value = candidateId;
showStep(1);
})
.catch(error => {
console.error('Error:', error);
})
.finally(() => {
this.submitting = false;
});
});
// Handle form submission for the second form
document.getElementById('application-form2').addEventListener('submit', async function (event) {
event.preventDefault();
const submitButton = document.getElementById('submit-btn-form2');
submitButton.disabled = true;
const formData = new FormData(event.target);
const cvUrl = uploadedFiles.length > 0 ? uploadedFiles[0] : null;
const data = {
candidateId: formData.get('candidate-id'),
street: formData.get('street'),
zipcode: formData.get('postal_city').split(' ')[0],
city: formData.get('postal_city').split(' ')[1],
country: formData.get('country'),
website: formData.get('website'),
cv_url: cvUrl,
additional_files_url: uploadedFiles,
availability: formData.get('date')
};
try {
const response = await fetch('https://recruiting01.god.de:5005/applications/second', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': '4cc98d781b76e3016f6c8d31896bac97bcca3f2f'
},
body: JSON.stringify(data)
});
if (!response.ok) {
throw new Error('Failed to submit the form');
}
const responseData = await response.json();
window.location.href = '/thanks-for-your-application';
} catch (error) {
console.error('Error:', error);
submitButton.disabled = false;
}
});
document.getElementById('prev-step-page').addEventListener('click', function () {
window.history.back();
});
showStep(0);
});
document.getElementById('location')?.addEventListener('change', function () {
let storedLocations = JSON.parse(localStorage.getItem('selectedLocations')) || [];
const selectedOptions = Array.from(this.selectedOptions).map(option => option.value);
const index = selectedOptions.indexOf('start-location');
if (index > -1) {
selectedOptions.splice(index, 1);
}
selectedOptions.forEach(location => {
if (!storedLocations.includes(location)) {
storedLocations.push(location);
}
});
localStorage.setItem('selectedLocations', JSON.stringify(storedLocations));
updateSelectedLocationsDisplay(storedLocations);
});
document.addEventListener('DOMContentLoaded', async function () {
const locationList = document.getElementById('location');
const dataTitleElement = document.getElementById('title-work-local');
const dataTitle = dataTitleElement ? dataTitleElement.textContent.trim() : null;
const uniqueKey = `locations_${dataTitle}`;
const storedLocations = JSON.parse(localStorage.getItem(uniqueKey)) || [];
let selectedLocations = JSON.parse(localStorage.getItem(`selectedLocations_${uniqueKey}`)) || [];
if (storedLocations.length === 1) {
selectedLocations = [storedLocations[0]];
localStorage.setItem(`selectedLocations_${uniqueKey}`, JSON.stringify(selectedLocations));
}
function updateLocationList() {
// Сначала проверяем, что titleText уже получен и обновляем storedLocations
const titleElement = document.getElementById('title-work-local');
const titleText = titleElement ? titleElement.textContent.trim() : '';
// Обновляем storedLocations в зависимости от названия вакансии
if (titleText === 'Initiativbewerbung') {
console.log(titleText);
storedLocations.length = 0; // Очищаем массив
storedLocations.push(...[
'Berlin', 'Braunschweig', 'Breslau', 'Dortmund',
'Frankfurt am Main', 'Hamburg', 'Kaunas',
'Köln', 'München', 'Pune', 'Ratingen',
'Vilnius', 'Wolfsburg'
]);
}
console.log(storedLocations);
// Теперь отрисовываем список городов после обновления storedLocations
locationList.innerHTML = ''; // Очищаем старый список
storedLocations.forEach(location => {
const li = document.createElement('li');
li.textContent = location;
if (selectedLocations.includes(location)) {
li.classList.add('active-city');
}
li.addEventListener('click', function () {
toggleLocationSelection(location, li);
});
locationList.appendChild(li);
});
}
function toggleLocationSelection(location, element) {
if (selectedLocations.includes(location)) {
selectedLocations = selectedLocations.filter(loc => loc !== location);
element.classList.remove('active-city');
} else {
selectedLocations.push(location);
element.classList.add('active-city');
}
localStorage.setItem(`selectedLocations_${uniqueKey}`, JSON.stringify(selectedLocations));
}
const jobId = new URLSearchParams(window.location.search).get('job_id');
const titleElement = document.getElementById('title-work-local');
if (!jobId || !titleElement) {
if (titleElement) titleElement.textContent = 'Title not found';
return;
}
try {
const response = await fetch(`https://hyand.recruitee.com/api/offers/${jobId}`);
if (!response.ok) throw new Error('Ошибка при запросе');
const data = await response.json();
const siteLanguage = localStorage.getItem('selectedLanguage') || 'de';
const offerTitle = data?.offer?.translations?.[siteLanguage]?.sharing_title || 'Title not found';
// Записываем название в localStorage
localStorage.setItem('dataTitle', offerTitle);
// Отображаем название на странице
titleElement.textContent = offerTitle;
} catch (error) {
console.error(error);
titleElement.textContent = 'Title not found';
}
setTimeout(() => {
updateLocationList();
}, 1000);
});
Sichere und effiziente Bargeldverwaltung mit Cash-Handling-System - Hyand
Sichere und effiziente Bargeldverwaltung mit Cash-Handling-System
Bargeldtransport und -verwaltung sind wesentliche Bestandteile vieler Geschäftsmodelle. Sie können langwierig sein und viele Ressourcen binden. Der Sicherheitsaspekt ist eine weitere Herausforderung für Unternehmen.
Das bestehende Cash-Handling-System (CHS) unseres Kunden – ein digitales System der zentralen Kontrolle des Bargeldflusses und Risikomonitorings – sollte an die modernen technischen Möglichkeiten angepasst und die Digitalisierung der Prozesse optimiert werden. Dabei standen die Verbesserung der Bedienung sowie die Erweiterung der Funktionalitäten im Vordergrund. Die neuen Anforderungen mussten umgesetzt werden, ohne den laufenden Betrieb des Systems zu beeinflussen.
Um Optimierungspotenziale des bestehenden Systems zu identifizieren und umzusetzen, wurden Usability-Evaluationen und Nutzungskontextanalysen durchgeführt. Dabei wurde ein Bedarf an neuen Funktionalitäten festgestellt. Entlang Scrum und des Human-Centered-Designs wurde das CHS modernisiert, Prozesse optimiert und um neue Funktionalitäten erweitert. Mittels Reviews und geeigneter Evaluationsmethoden wurde das Feedback der Stakeholder, insbesondere der Nutzerinnen und Nutzer, direkt eingebunden und so die gemeinsame Software-Vision kontinuierlich im laufenden Betrieb verwirklicht.
Die zentrale Verwaltung und transparente Überwachung des Bargeldflusses ermöglicht ein verbessertes Risikomanagement sowie ein effizienteres Reporting. Dies gewährleistet eine gesicherte Bargelddisposition und optimiert gleichzeitig Prozesse sowie die Nutzerführung. Auffälligkeiten können dadurch schneller bearbeitet werden. Die Bearbeitungszeit wurde um ca. 30 Prozent reduziert .
Ergänzend wird die digitale Erstellung und Verwaltung von Verträgen vereinfacht, wodurch auch die Bewertbarkeit von Dienstleistern deutlich übersichtlicher gestaltet wird. Dank hochflexibler Im- und Exportschnittstellen lässt sich die Lösung nahtlos in bestehende Systemlandschaften integrieren und individuell anpassen.
Entdecken Sie unsere Lösungen Profitieren auch Sie von unserer umfassenden Erfahrung aus Projekten für Unternehmen unterschiedlichster Größe.
Unser Kunde ist ein Vollsortimenter im Lebensmittelgroßhandel (Küchengeräte und Lebensmittel).
_automotive, _digital_services, _requirement_engineering
Für einen großen Automobilhersteller ist die Organisation der Transporteure ein ressourcenintensiver Prozess. Täglich müssen etwa 60.000 Fahrzeuge ...
Gesteigerte Energiekosten, Klimaschutz, Ressourcenverschwendung – eine effiziente Nutzung von Energie hat viele Gründe. ...
_banking_&_insurance, _customer_centricity, _ui/ux
Für unseren Kunden aus der Finanzbranche wurden wir mit der Optimierung und Digitalisierung eines bisher manuellen Prozesses...
_automotive, _enterprise_development
Die Versandabteilung transportiert Fahrzeuge von einem Ort zum anderen. Um die Fahrzeuge zu identifizieren und zu lokalisieren, ...
Optimierte Arbeitsabläufe und erhöhte Sicherheit durch ein innovatives System für Cash-Handling.
_automotive, _requirement_engineering
Für unseren Kunden aus der Automobil-Branche ist die Steuerung von Qualifizierungsmaßnahmen für Mitarbeiterinnen und Mitarbeiter sowie für Partnerinnen und Partner die Grundlage für einheitliche Qualitätsstandards.
_banking_&_insurance, _customer_centricity, _digital_services
Qualitativ hochwertige und schnelle Kundenbetreuung ist für den Erfolg einer Kundenbeziehung entscheidend...
_application_management, _retail
Der Kunde ist ein international führendes Einzelhandelsunternehmen mit
ca. 80.000 Mitarbeiterinnen und Mitarbeitern.
Sie möchten mehr darüber wissen, wie wir Ihr Unternehmen
mit individueller Software- und Appentwicklung unterstützen können? Sprechen Sie uns an – wir helfen Ihnen weiter!