feat: Show application status banner instead of join CTA for pending applications
Some checks are pending
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions

- Check for pending membership application on homepage
- Show blue "Deklaracja w toku" banner with status info
- Different messages for: draft, submitted, under_review, pending_user_approval, changes_requested
- Link to membership status page instead of application form

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-02-03 13:20:03 +01:00
parent de281e5bda
commit 4eadcd9a8d
2 changed files with 58 additions and 18 deletions

View File

@ -39,6 +39,7 @@ from database import (
AIChatMessage,
UserSession,
SearchQuery,
MembershipApplication,
)
from utils.helpers import sanitize_input
from extensions import limiter
@ -107,6 +108,14 @@ def index():
).first() is not None
user_can_attend = next_event.can_user_attend(current_user)
# Sprawdź czy użytkownik ma deklarację członkowską w toku
pending_application = None
if not current_user.is_norda_member and not current_user.company_id:
pending_application = db.query(MembershipApplication).filter(
MembershipApplication.user_id == current_user.id,
MembershipApplication.status.in_(['draft', 'submitted', 'under_review', 'pending_user_approval', 'changes_requested'])
).first()
return render_template(
'index.html',
companies=companies,
@ -116,7 +125,8 @@ def index():
total_categories=total_categories,
next_event=next_event,
user_registered=user_registered,
user_can_attend=user_can_attend
user_can_attend=user_can_attend,
pending_application=pending_application
)
finally:
db.close()

View File

@ -802,25 +802,55 @@
{% block content %}
<!-- Header - różny dla członków i nie-członków -->
{% if current_user.is_authenticated and not current_user.is_norda_member and not current_user.company_id %}
<!-- Banner CTA dla nie-członków NORDA -->
<a href="{{ url_for('membership.apply') }}" class="membership-header" data-animate="fadeIn" style="display: flex; align-items: center; gap: var(--spacing-xl); padding: var(--spacing-xl); background: linear-gradient(135deg, #22c55e 0%, #16a34a 100%); border-radius: var(--radius-lg); margin-bottom: var(--spacing-xl); text-decoration: none; color: white;">
<div style="font-size: 3rem;">🤝</div>
<div style="flex: 1;">
<h1 style="font-size: var(--font-size-2xl); margin-bottom: var(--spacing-xs); font-weight: 700;">
Dołącz do Izby Przedsiębiorców NORDA
</h1>
<p style="font-size: var(--font-size-md); opacity: 0.9; margin: 0;">
Złóż deklarację członkowską i zyskaj pełny dostęp do katalog {{ total_companies }} firm, wydarzeń i funkcji portalu
</p>
{% if pending_application %}
<!-- Banner dla użytkownika z deklaracją w toku -->
<a href="{{ url_for('membership.status') }}" class="membership-header" data-animate="fadeIn" style="display: flex; align-items: center; gap: var(--spacing-xl); padding: var(--spacing-xl); background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%); border-radius: var(--radius-lg); margin-bottom: var(--spacing-xl); text-decoration: none; color: white;">
<div style="font-size: 3rem;">📋</div>
<div style="flex: 1;">
<h1 style="font-size: var(--font-size-2xl); margin-bottom: var(--spacing-xs); font-weight: 700;">
Deklaracja członkowska w toku
</h1>
<p style="font-size: var(--font-size-md); opacity: 0.9; margin: 0;">
{% if pending_application.status == 'submitted' or pending_application.status == 'under_review' %}
Twoja deklaracja dla firmy "{{ pending_application.company_name }}" oczekuje na rozpatrzenie
{% elif pending_application.status == 'pending_user_approval' %}
Administrator zaproponował zmiany - sprawdź i zaakceptuj
{% elif pending_application.status == 'changes_requested' %}
Wymagane są poprawki w Twojej deklaracji
{% else %}
Kontynuuj wypełnianie deklaracji dla firmy "{{ pending_application.company_name or 'Twoja firma' }}"
{% endif %}
</p>
</div>
<div style="background: white; color: #1d4ed8; padding: var(--spacing-md) var(--spacing-xl); border-radius: var(--radius); font-weight: 700; font-size: var(--font-size-lg); white-space: nowrap;">
{% if pending_application.status == 'draft' %}Kontynuuj →{% else %}Sprawdź status →{% endif %}
</div>
</a>
<div style="background: #dbeafe; border: 1px solid #93c5fd; padding: var(--spacing-md); border-radius: var(--radius); margin-bottom: var(--spacing-xl); display: flex; align-items: center; gap: var(--spacing-sm);">
<span style="font-size: 1.2rem;"></span>
<span style="color: #1e40af;">Przeglądasz listę firm Izby NORDA. Pełny dostęp do szczegółów firm otrzymasz po zatwierdzeniu deklaracji.</span>
</div>
<div style="background: white; color: #16a34a; padding: var(--spacing-md) var(--spacing-xl); border-radius: var(--radius); font-weight: 700; font-size: var(--font-size-lg); white-space: nowrap;">
Złóż deklarację →
{% else %}
<!-- Banner CTA dla nie-członków NORDA bez deklaracji -->
<a href="{{ url_for('membership.apply') }}" class="membership-header" data-animate="fadeIn" style="display: flex; align-items: center; gap: var(--spacing-xl); padding: var(--spacing-xl); background: linear-gradient(135deg, #22c55e 0%, #16a34a 100%); border-radius: var(--radius-lg); margin-bottom: var(--spacing-xl); text-decoration: none; color: white;">
<div style="font-size: 3rem;">🤝</div>
<div style="flex: 1;">
<h1 style="font-size: var(--font-size-2xl); margin-bottom: var(--spacing-xs); font-weight: 700;">
Dołącz do Izby Przedsiębiorców NORDA
</h1>
<p style="font-size: var(--font-size-md); opacity: 0.9; margin: 0;">
Złóż deklarację członkowską i zyskaj pełny dostęp do katalog {{ total_companies }} firm, wydarzeń i funkcji portalu
</p>
</div>
<div style="background: white; color: #16a34a; padding: var(--spacing-md) var(--spacing-xl); border-radius: var(--radius); font-weight: 700; font-size: var(--font-size-lg); white-space: nowrap;">
Złóż deklarację →
</div>
</a>
<div style="background: #fef3c7; border: 1px solid #fde68a; padding: var(--spacing-md); border-radius: var(--radius); margin-bottom: var(--spacing-xl); display: flex; align-items: center; gap: var(--spacing-sm);">
<span style="font-size: 1.2rem;">🔒</span>
<span style="color: #92400e;">Przeglądasz listę firm Izby NORDA. Aby zobaczyć szczegóły każdej firmy, złóż deklarację członkowską.</span>
</div>
</a>
<div style="background: #fef3c7; border: 1px solid #fde68a; padding: var(--spacing-md); border-radius: var(--radius); margin-bottom: var(--spacing-xl); display: flex; align-items: center; gap: var(--spacing-sm);">
<span style="font-size: 1.2rem;">🔒</span>
<span style="color: #92400e;">Przeglądasz listę firm Izby NORDA. Aby zobaczyć szczegóły każdej firmy, złóż deklarację członkowską.</span>
</div>
{% endif %}
{% else %}
<!-- Standardowy nagłówek dla członków -->
<div style="background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%); color: white; padding: var(--spacing-xl); border-radius: var(--radius-lg); margin-bottom: var(--spacing-xl); text-align: center;">