Cześć, {{ currentUser.name.split(' ')[0] }} · {{ formatDatePL(relDate(0)) }}
Najbliższe eventy
Wymaga uwagi
| Event | Klient | Data | Uczestnicy | Progress | Zadania | Zespół | Status |
|---|---|---|---|---|---|---|---|
|
{{ ev.name }}
|
{{ clientById(ev.clientId)?.name }} | {{ formatDatePL(ev.date) }}DZIŚ | {{ ev.attendees }} |
|
{{ ev.tasks.filter(t=>t.status==='DONE').length }}/{{ ev.tasks.length }} | {{ ev.team.length }}/{{ ev.requiredStaff }} | {{ EVENT_STATUS_LABELS[ev.status] }} |
{{ selectedEvent.name }}
{{ clientById(selectedEvent.clientId)?.name }} · {{ formatDatePL(selectedEvent.date) }} {{ selectedEvent.time }} · {{ selectedEvent.location }} · {{ selectedEvent.attendees }} uczestników · koordynator: {{ employeeName(selectedEvent.coordinatorId) }}
{{ EVENT_STATUS_LABELS[selectedEvent.status] }}
Etap eventu
{{ EVENT_STATUS_LABELS[s] }}
Event został anulowany.
Finanse
Przychód
{{ formatPLN(selectedEvent.finance.revenue) }}
Koszty
{{ formatPLN(selectedEvent.finance.costs.reduce((s,c)=>s+c.amount,0)) }}
Zysk
{{ formatPLN(eventProfit(selectedEvent)) }}
Marża
{{ eventMargin(selectedEvent) }}%
Postęp przygotowań
{{ eventProgress(selectedEvent) }}%
Zespół: {{ selectedEvent.team.length }}/{{ selectedEvent.requiredStaff }} · Zadania: {{ selectedEvent.tasks.filter(t=>t.status==='DONE').length }}/{{ selectedEvent.tasks.length }}
Komentarze
{{ cm.user }}{{ cm.at }}
{{ cm.text }}
{{ selectedEvent.tasks.filter(t=>t.status==='DONE').length }} / {{ selectedEvent.tasks.length }} wykonanych
{{ t.title }}
{{ employeeName(t.assigneeId) }} · termin {{ formatDatePL(t.dueDate) }}
Przypisano {{ selectedEvent.team.length }} z {{ selectedEvent.requiredStaff }} wymaganych
Brakuje jeszcze {{ missingStaff(selectedEvent) }} {{ missingStaff(selectedEvent)===1 ? 'osoby' : 'osób' }}.
{{ employeeName(t.employeeId).split(' ').map(p=>p[0]).slice(0,2).join('') }}
{{ employeeName(t.employeeId) }}
{{ t.roleAtEvent }} · {{ t.start }}–{{ t.end }}
{{ employeeName(t.employeeId) }} · {{ t.roleAtEvent }}{{ t.start }}–{{ t.end }}
{{ s.name }}
{{ s.type }} · {{ s.contact }} · {{ formatPLN(s.cost) }}
{{ equipmentById(need.equipmentId)?.name }}
Zarezerwowano {{ equipmentReservationFor(equipmentById(need.equipmentId), selectedEvent.id)?.qty ?? 0 }} / potrzeba {{ need.neededQty }}
{{ g.name }}
{{ g.email || g.phone || '—' }}
Przychód
{{ formatPLN(selectedEvent.finance.revenue) }}
Koszty
{{ formatPLN(selectedEvent.finance.costs.reduce((s,c)=>s+c.amount,0)) }}
Zysk
{{ formatPLN(eventProfit(selectedEvent)) }}
Marża
{{ eventMargin(selectedEvent) }}%
Płatność:
Koszty
{{ c.category }} · {{ c.note }}{{ formatPLN(c.amount) }}
- {{ e.at.split(' ')[1] }} {{ e.user }} — {{ e.text }}
{{ selectedEvent.name }}
Teraz
{{ selectedEvent.timeline[dayModeIndex].time }}
{{ selectedEvent.timeline[dayModeIndex].label }}
Dalej
{{ selectedEvent.timeline[dayModeIndex+1].time }} — {{ selectedEvent.timeline[dayModeIndex+1].label }}
Zespół
{{ employeeName(t.employeeId) }} · {{ t.roleAtEvent }}
Problemy
{{ p.reason }}{{ p.status==='OPEN'?'Otwarty':p.status==='IN_PROGRESS'?'W trakcie':'Rozwiązany' }}
{{ p.comment }}
{{ p.reportedBy }} · {{ p.reportedAt }}
Kontakty
Koordynator
{{ employeeName(selectedEvent.coordinatorId) }}
Klient
{{ clientById(selectedEvent.clientId)?.contactPerson }}
{{ s.type }}
{{ s.name }}
Harmonogram — najbliższe 7 dni
{{ formatDatePL(relDate(offset-1)) }} · dziś
Brak zaplanowanych zmian.
{{ ev.name }}
{{ employeeName(t.employeeId) }} · {{ t.roleAtEvent }}
{{ t.start }}–{{ t.end }}
| Klient | Kontakt | Eventy | Wartość |
|---|---|---|---|
| {{ c.name }} | {{ c.contactPerson }} · {{ c.email }} | {{ clientEvents(c).length }} | {{ formatPLN(clientLifetimeValue(c)) }} |
{{ selectedClient.name }}
{{ selectedClient.contactPerson }} · {{ selectedClient.email }} · {{ selectedClient.phone }}
Lifetime value: {{ formatPLN(clientLifetimeValue(selectedClient)) }}
Historia eventów
Oferty
Komunikacja
{{ a.kind==='call'?'Telefon':a.kind==='email'?'Email':'Spotkanie' }}{{ a.at }}
{{ a.text }}
Notatki
{{ a.author }}{{ a.at }}
{{ a.text }}
{{ e.name.split(' ').map(p=>p[0]).slice(0,2).join('') }}
{{ e.name }}
{{ e.jobRole }}
{{ e.phone }}
{{ employeeIsBusyToday(e.id) ? 'Zajęty dziś' : 'Dostępny' }}
{{ employeeAssignedEvents(e.id).length }} eventów · {{ employeeTotalHours(e.id) }} h
| Dostawca | Typ | Event | Koszt | Status |
|---|---|---|---|---|
| {{ s.name }} | {{ s.type }} | {{ s.eventName }} | {{ formatPLN(s.cost) }} | {{ SUPPLIER_STATUS_LABELS[s.status] }} |
| Sprzęt | Ilość | Dostępne | Stan |
|---|---|---|---|
| {{ eq.name }} | {{ eq.quantity }} | {{ eq.condition==='DAMAGED'||eq.condition==='RETIRED' ? '—' : equipmentAvailableQty(eq) }} | {{ CONDITION_LABELS[eq.condition] }} |
| Event | Przychód | Koszty | Zysk | Płatność |
|---|---|---|---|---|
| {{ ev.name }} | {{ formatPLN(ev.finance.revenue) }} | {{ formatPLN(ev.finance.costs.reduce((s,c)=>s+c.amount,0)) }} | {{ formatPLN(eventProfit(ev)) }} | {{ PAYMENT_LABELS[ev.finance.paymentStatus] }} |
Rentowność eventów
{{ row.event.name }}{{ formatPLN(row.profit) }} ({{ row.margin }}%)
Obciążenie pracowników
{{ row.employee.name }}{{ row.hours }} h
Status eventów
{{ EVENT_STATUS_LABELS[row.status] }}{{ row.count }}
Automatyzacje (demo)
Automatyzacje działają wyłącznie jako demonstracja UX — w prototypie nic nie jest faktycznie wysyłane.
Pozostałe ustawienia będą dostępne w kolejnej wersji prototypu.
{{ currentUser.name.split(' ').map(p=>p[0]).slice(0,2).join('') }}
{{ currentUser.name }}
{{ currentUser.jobRole }}
Przełącz użytkownika (prototyp)