feat: Add registry lookup explanation and real-time status

- Add expandable info section explaining the lookup workflow
- Explain why NIP→Biała Lista→KRS is needed (KRS API doesn't support NIP)
- Show real-time status during lookup process
- Better UX for understanding multi-step data retrieval

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-02-01 14:35:30 +01:00
parent c73e90bc70
commit 5a611d92e1

View File

@ -135,6 +135,95 @@
font-weight: 400;
}
.lookup-status {
margin-top: var(--spacing-sm);
padding: var(--spacing-sm) var(--spacing-md);
background: var(--background);
border-radius: var(--radius);
font-size: var(--font-size-sm);
color: var(--text-secondary);
}
.lookup-status.loading {
background: rgba(59, 130, 246, 0.1);
color: #3b82f6;
}
.lookup-status.success {
background: var(--success-light);
color: var(--success);
}
.lookup-status.error {
background: var(--error-light);
color: var(--error);
}
.registry-info {
margin-top: var(--spacing-lg);
border: 1px solid var(--border);
border-radius: var(--radius);
background: var(--background);
}
.registry-info-header {
display: flex;
align-items: center;
gap: var(--spacing-sm);
padding: var(--spacing-sm) var(--spacing-md);
cursor: pointer;
font-size: var(--font-size-sm);
color: var(--text-secondary);
user-select: none;
}
.registry-info-header:hover {
color: var(--primary);
}
.registry-info-toggle {
margin-left: auto;
transition: transform 0.2s;
}
.registry-info.open .registry-info-toggle {
transform: rotate(180deg);
}
.registry-info-content {
display: none;
padding: var(--spacing-md);
padding-top: 0;
font-size: var(--font-size-sm);
color: var(--text-secondary);
line-height: 1.6;
}
.registry-info.open .registry-info-content {
display: block;
}
.registry-info-content ol {
margin: var(--spacing-xs) 0 var(--spacing-md) var(--spacing-lg);
padding: 0;
}
.registry-info-content li {
margin-bottom: var(--spacing-xs);
}
.registry-info-content p {
margin: var(--spacing-sm) 0;
}
.registry-info-note {
padding: var(--spacing-sm);
background: rgba(251, 191, 36, 0.1);
border-left: 3px solid var(--warning);
border-radius: 0 var(--radius) var(--radius) 0;
font-style: italic;
}
.nip-lookup {
display: flex;
gap: var(--spacing-sm);
@ -392,9 +481,35 @@
<div class="form-group">
<button type="button" class="btn-lookup" id="btnLookup" style="width: 100%;">
Sprawdź w rejestrze (KRS lub CEIDG)
Pobierz dane z rejestru
</button>
<div class="form-hint">Podaj NIP. Dla spółek (Sp. z o.o., SA) podaj też KRS aby pobrać dane z rejestru.</div>
<div id="lookupStatus" class="lookup-status" style="display: none;"></div>
</div>
<div class="registry-info">
<div class="registry-info-header" onclick="toggleRegistryInfo()">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="10"/>
<path d="M12 16v-4M12 8h.01"/>
</svg>
Jak działa pobieranie danych?
<span class="registry-info-toggle"></span>
</div>
<div class="registry-info-content" id="registryInfoContent">
<p><strong>Dla spółek</strong> (Sp. z o.o., SA, itp.):</p>
<ol>
<li><strong>Biała Lista VAT</strong> (Ministerstwo Finansów) — na podstawie NIP pobieramy numer KRS</li>
<li><strong>KRS Open API</strong> (Ministerstwo Sprawiedliwości) — na podstawie KRS pobieramy pełne dane firmy</li>
</ol>
<p><strong>Dla jednoosobowych działalności</strong> (JDG):</p>
<ol>
<li><strong>CEIDG</strong> (dane.biznes.gov.pl) — bezpośrednio na podstawie NIP</li>
</ol>
<p class="registry-info-note">
Dlaczego tak? KRS Open API nie obsługuje wyszukiwania po NIP — wymaga numeru KRS.
Dlatego najpierw sprawdzamy Białą Listę VAT, która zwraca KRS dla danego NIP.
</p>
</div>
</div>
<div id="registryPreview" class="registry-preview" style="display: none;">
@ -705,10 +820,21 @@
const nipInput = document.getElementById('nipInput');
const krsInput = document.getElementById('krsInput');
const btnLookup = document.getElementById('btnLookup');
const lookupStatus = document.getElementById('lookupStatus');
const registryPreview = document.getElementById('registryPreview');
const registrySource = document.getElementById('registrySource');
const registryData = document.getElementById('registryData');
function toggleRegistryInfo() {
document.querySelector('.registry-info').classList.toggle('open');
}
function setLookupStatus(message, type) {
lookupStatus.textContent = message;
lookupStatus.className = 'lookup-status ' + type;
lookupStatus.style.display = message ? 'block' : 'none';
}
btnLookup.addEventListener('click', async function() {
const nip = nipInput.value.replace(/[\s-]/g, '');
const krs = krsInput ? krsInput.value.replace(/[\s-]/g, '') : '';
@ -719,7 +845,14 @@ btnLookup.addEventListener('click', async function() {
}
btnLookup.disabled = true;
btnLookup.innerHTML = '<span class="loading-spinner"></span> Sprawdzam w rejestrach...';
btnLookup.innerHTML = '<span class="loading-spinner"></span> Pobieranie...';
// Show step-by-step status
if (krs && krs.length >= 7) {
setLookupStatus('Pobieram dane z KRS Open API (Ministerstwo Sprawiedliwości)...', 'loading');
} else {
setLookupStatus('Sprawdzam NIP w Białej Liście VAT (Ministerstwo Finansów)...', 'loading');
}
try {
const response = await fetch('/api/membership/lookup-nip', {
@ -731,6 +864,12 @@ btnLookup.addEventListener('click', async function() {
const result = await response.json();
if (result.success && result.data) {
if (result.source === 'KRS') {
setLookupStatus('✓ Dane pobrane z KRS Open API', 'success');
} else if (result.source === 'CEIDG') {
setLookupStatus('✓ Dane pobrane z CEIDG (jednoosobowa działalność)', 'success');
}
registrySource.textContent = result.source;
registryPreview.classList.add('success');
registryPreview.style.display = 'block';
@ -753,6 +892,7 @@ btnLookup.addEventListener('click', async function() {
if (data.regon) document.querySelector('[name="regon"]').value = data.regon;
document.querySelector('[name="registry_source"]').value = result.source;
} else {
setLookupStatus('Firma nie znaleziona w KRS ani CEIDG — wypełnij dane ręcznie', 'error');
registryPreview.classList.remove('success');
registryPreview.style.display = 'block';
registryData.innerHTML = '<p>Firma nie została znaleziona w rejestrze. Wypełnij dane ręcznie.</p>';
@ -760,10 +900,10 @@ btnLookup.addEventListener('click', async function() {
}
} catch (error) {
console.error('Lookup error:', error);
alert('Błąd podczas sprawdzania w rejestrach');
setLookupStatus('Błąd połączenia z rejestrem — spróbuj ponownie', 'error');
} finally {
btnLookup.disabled = false;
btnLookup.innerHTML = 'Sprawdź w rejestrze (KRS lub CEIDG)';
btnLookup.innerHTML = 'Pobierz dane z rejestru';
}
});
{% endif %}