/* Server calculates the identifier from the selected customer's stored mobile. Manual values remain editable. Changing customer clears an unchanged auto value. */ (() => { const button = document.querySelector('#generate-deposit-identifier'); if (!button) return; const form = button.closest('form'); const customer = form.elements.namedItem('customer'); const input = form.elements.namedItem('deposit_id'); const status = document.querySelector('#identifier-generation-status'); const replacement = document.querySelector('#identifier-replacement'); const candidate = document.querySelector('#identifier-candidate'); const originalLabel = button.innerHTML; let activeCustomer = customer.value, generated = '', pending = '', controller = null; function customerChanged() { if (activeCustomer !== customer.value) { controller?.abort(); controller = null; if (generated && input.value === generated) input.value = ''; generated = ''; pending = ''; replacement.hidden = true; activeCustomer = customer.value; } button.disabled = !customer.value; button.innerHTML = originalLabel; status.textContent = customer.value ? 'شناسه بر اساس شماره موبایل مشتری انتخاب‌شده تولید می‌شود.' : 'ابتدا مشتری را انتخاب کنید؛ شناسه بر اساس شماره موبایل او تولید می‌شود.'; } function applyIdentifier(value) { input.value = value; generated = value; pending = ''; replacement.hidden = true; input.dispatchEvent(new Event('input', {bubbles:true})); input.dispatchEvent(new Event('change', {bubbles:true})); input.focus(); status.textContent = 'شناسه تولید و در فیلد وارد شد؛ قبل از صدور اعلامیه آن را بررسی کنید.'; } customer.addEventListener('change', customerChanged); button.addEventListener('click', async () => { if (!customer.value) return; const selectedCustomer = customer.value; const request = new AbortController(); controller = request; button.disabled = true; button.textContent = 'در حال تولید…'; replacement.hidden = true; status.textContent = 'در حال دریافت شناسه از سیستم…'; let failureMessage = 'شناسه دریافت نشد؛ اتصال را بررسی کنید و دوباره تلاش کنید.'; try { const response = await fetch(button.dataset.url, { method: 'POST', credentials: 'same-origin', cache: 'no-store', signal: request.signal, headers: {'X-CSRFToken': form.elements.namedItem('csrfmiddlewaretoken').value}, body: new URLSearchParams({customer: selectedCustomer}) }); const data = await response.json(); if (request !== controller || customer.value !== selectedCustomer) return; if (!response.ok) {failureMessage = data.error || 'شناسه تولید نشد؛ دوباره تلاش کنید.'; throw new Error('generation');} if (data.customer !== selectedCustomer || !/^[0-9]{13}$/.test(data.identifier)) {failureMessage = 'پاسخ سیستم معتبر نیست؛ دوباره تلاش کنید.'; throw new Error('generation');} if (input.value.trim() && input.value !== data.identifier) { pending = data.identifier; candidate.textContent = pending; replacement.hidden = false; status.textContent = 'شناسه آماده است؛ برای جایگزینی مقدار فعلی، دکمه جایگزینی را بزنید.'; } else applyIdentifier(data.identifier); } catch (error) { if (error.name !== 'AbortError' && request === controller) status.textContent = failureMessage; } finally { if (request === controller) {controller = null; button.disabled = !customer.value; button.innerHTML = originalLabel;} } }); document.querySelector('#apply-deposit-identifier').addEventListener('click', () => {if (pending) applyIdentifier(pending);}); document.querySelector('#cancel-deposit-identifier').addEventListener('click', () => {pending = ''; replacement.hidden = true; status.textContent = 'شناسه فعلی حفظ شد.'; button.focus();}); customerChanged(); })();