FILTR:
Všichni
{{ t.short_name || t.full_name }}{{ t.id===user.id ? ' ★' : '' }}
{{ periodKindLabel(periodDetail.kind) }} — {{ periodDetail.label }}
Od–do: {{ fmtDate(periodDetail.date_from) }} – {{ fmtDate(periodDetail.date_to) }}
{{ periodDetail.description }}
🔒 Vidí jen administrátoři
{{ periodModal.id ? 'Upravit období' : 'Nové významné období' }}
{{ dayDetailTitle }}
{{ ev.object_name || 'Bez objektu' }}
! ! 🔒⤷{{ ev.title }}
Žádné zakázky na tento den.
Koš je prázdný — nic nebylo vyhozeno.
{{ it.kind==='note' ? '📝' : '🗂️' }}
{{ it.title || '(bez názvu)' }}
{{ it.object }} · {{ fmtDate(it.when) }}
{{ d }}
Techniciukládám…×
{{ b.p.label }}
‹
! ! {{ evStartTime(bar.ev) }} {{ bar.ev._seg+1 }}/{{ bar.ev._segn }}🔒⚠⤷{{ bar.ev.object_name }} · {{ bar.ev.title }}
{{ initials(te.short_name, te.full_name) }}
+
›
{{ day.num }}.{{ +day.date.substring(5,7) }}.
{{ initials(te.short_name, te.full_name) }}
🔒
{{ (cn.start_at && !cn.all_day) ? cn.start_at.substring(11,16) + ' ' + cn.text : cn.text }}
+ pozn.
{{ initials(ev.creator_name, ev.creator_full_name) }}
! ! 🔒⤷{{ ev.title }}
{{ day.num }}.{{ +day.date.substring(5,7) }}.
{{ blockInit(b) }}{{ blockLabel(b, day.date) }}
{{ av.name }} {{ av.unavailable ? '✕' : minToStr(av.s)+'–'+minToStr(av.e) }}
{{ dayNames[i] }} {{ day.num }}.{{ parseInt(day.date.substring(5,7)) }}.
{{ t.label }}
{{ seg.init }}{{ seg.text }}
{{ blockInit(b) }}{{ blockLabel(b, day.date) }}
{{ av.name }} {{ av.unavailable ? '✕' : minToStr(av.s)+'–'+minToStr(av.e) }}
⛔ Dostupnost — vidíš {{ user.role==='admin' ? 'všechny (administrátor)' : 'jen sebe' }}; technici se navzájem nevidí. Klik do dne = zapsat, kdy nemůžeš. V kalendáři zakázek z toho zůstane jen tenký proužek za číslem dne (6–18 h).
{{ dayNames[i] }} {{ day.num }}.{{ parseInt(day.date.substring(5,7)) }}.
{{ initials(te.short_name, te.full_name) }}
🔒
{{ (cn.start_at && !cn.all_day) ? cn.start_at.substring(11,16) + ' ' + cn.text : cn.text }}
+ pozn.
{{ initials(ev.creator_name, ev.creator_full_name) }}
! ! 🔒⤷{{ ev.title }}
ukládám…
{{ initials(note.owner ? note.owner.short_name : '', note.owner ? note.owner.full_name : '') }}
{{ initials(sw.short_name, sw.full_name) }}
Zatím tu nic není.
Klikni na + Papírek a hoď sem cokoli, na co nechceš zapomenout —
třeba „sehnat projektanta" nebo „sehnat revizáka na Balabenku".
Klikni na + Papírek a hoď sem cokoli, na co nechceš zapomenout —
třeba „sehnat projektanta" nebo „sehnat revizáka na Balabenku".
Sdílet papírek
Vyber kolegy — papírek se jim zobrazí na jejich nástěnce (jen ke čtení).
Datum {{ dashSortCol.key==='term' ? (dashSortCol.dir>0?'▲':'▼') : '' }}
Lokalita {{ dashSortCol.key==='locality' ? (dashSortCol.dir>0?'▲':'▼') : '' }}
A–Z {{ dashSortCol.key==='object' ? (dashSortCol.dir>0?'▲':'▼') : '' }}
Historie
Termín
{{ q.l }}
{{ dashTermFilter==='trash' ? 'Hledat v koši' : 'Hledat v seznamu' }}
Rozsah termínu
–
Lokalita
Všechny
{{ l }}
Provádí
Všichni
{{ t.short_name || t.full_name }}
! 🔒⚠{{ objShort(t.object_name) }} {{ t.title }}
{{ fmtDate(t.start_at||t.end_at) }}
{{ initials(te.short_name, te.full_name) }}
Žádné zakázky pro zvolený filtr.
| Objekt {{ dashSortCol.key==='object' ? (dashSortCol.dir>0?'▲':'▼') : '' }} | Lokalita {{ dashSortCol.key==='locality' ? (dashSortCol.dir>0?'▲':'▼') : '' }} | Zakázka {{ dashSortCol.key==='title' ? (dashSortCol.dir>0?'▲':'▼') : '' }} | Provádí | Založil | Termín {{ dashSortCol.key==='term' ? (dashSortCol.dir>0?'▲':'▼') : '' }} | Zbývá {{ dashSortCol.key==='remaining' ? (dashSortCol.dir>0?'▲':'▼') : '' }} | Priorita {{ dashSortCol.key==='priority' ? (dashSortCol.dir>0?'▲':'▼') : '' }} | Stav {{ dashSortCol.key==='status' ? (dashSortCol.dir>0?'▲':'▼') : '' }} | Vznik {{ dashSortCol.key==='created' ? (dashSortCol.dir>0?'▲':'▼') : '' }} |
|---|---|---|---|---|---|---|---|---|---|
| {{ g.label }}{{ g.info }} | |||||||||
| {{ objMid(t.object_name) }} | {{ t.object_locality || '—' }} | 🔒 ⚠ {{ t.title }} |
{{ initials(te.short_name, te.full_name) }}
—
|
{{ initials(t.creator_name, t.creator_full_name) }} — | {{ dayName(t.start_at) }} {{ fmtDate(t.start_at) }} {{ t.start_at.substring(11,16) }} → {{ dayName(t.end_at) }} {{ fmtDate(t.end_at) }} {{ t.segments.length }} termíny bez termínu | {{ daysLeft(t.end_at || t.start_at) }} — | ! — | {{ dashStatusLabel(t.status) }} | {{ fmtDate(t.created_at) }} |
Celkem {{ dashRows.length }} {{ dashRows.length===1 ? 'zakázka' : (dashRows.length>=2 && dashRows.length<=4 ? 'zakázky' : 'zakázek') }} v koši — otevři zakázku a dej „Vrátit z koše“, nebo ji smaž trvale.
Žádné zakázky pro zvolený filtr.
Řazení:
Lokalita:
Všechny
{{ l }} {{ objLocCount(l) }}
{{ o.name }}
⚠ {{ alertsFor(o.id).length }}
🔐 {{ vaultCount(o.id) }}
{{ recentTasks(o.tasks).length }}/{{ o.tasks.length }}
{{ t.title }}
{{ initials(te.short_name, te.full_name) }}
{{ fmtDate(t.start_at) }}
Žádné aktivní zakázky
+ {{ o.tasks.length - 8 }} dalších
Osobni
{{ o.name }}
{{ recentTasks(o.tasks).length }}/{{ o.tasks.length }}
●
{{ t.title }}
{{ fmtDate(t.start_at) }}
+ {{ recentTasks(o.tasks).length - 4 }} dalsich
Zadne aktivni zakazky
📦 Archiv ({{ archivedTree.length }}) {{ showObjArchive ? '▾' : '▸' }}
{{ o.name }}
V archivu od {{ fmtDate(o.archived_at) }}
Žádné objekty.
Vývoj Střela 🔒 jen Robert
{{ bsHealth.service }} · {{ bsLoading ? 'načítám…' : 'obnoveno ' + bsAgo(bsHealth.last_run) }}
{{ bsError }}
Zdraví systému
{{ bsBadCount ? bsBadCount + ' × CHYBA' : 'vše OK' }}
měřeno {{ bsFmtTs(bsHealth.last_run) }}, dál každých 30 min
Živé dotazy na klíče a služby, na kterých Střelo stojí. Když něco přejde z OK do CHYBA, přijde ti hned zvonek, push a e-mail. Proužek vpravo = posledních 7 dní (zelená celý den OK, žlutá část měření selhala, červená selhalo).
{{ c.label }}
{{ bsStateText(c.ok) }}
{{ c.detail || '—' }}
{{ c.ts ? bsFmtTs(c.ts) : '' }} · {{ c.ms }} ms
{{ bsLoading ? 'Načítám…' : 'Zatím nic.' }}
Nedokonalosti
{{ bsFriction.counts.open.n }} otevřených
Co lidem ve Střelu nejde — sbírá se samo z provozu: asistent nerozuměl nebo akci neprovedl, stejná věc zkoušená třikrát po sobě, prázdný přepis řeči, diktát hned znovu do stejného pole, chyba serveru, „nefunguje / nejde“ v komentáři či hodnocení. Stejná věc od stejného člověka do 24 h se sčítá (×N). Nové záznamy ti chodí souhrnně nejvýš 1× za hodinu.
{{ bsLoading ? 'Načítám…' : 'Nic tu není.' }}
{{ bsKindIcon(it.kind) }}
{{ bsFmtTs(it.last_ts || it.ts) }}
{{ it.user_name || '—' }}
„{{ it.text }}“
{{ it.kind_label }}
×{{ it.count }}
✎
{{ it.status === 'done' ? '✓ vyřešeno' : '— ignorováno' }}
Načítám…
{{ ln[0] }}{{ ln[1] }}
Opakování×{{ it.count }}, poprvé {{ bsFmtTs(it.ts) }}, naposledy {{ bsFmtTs(it.last_ts) }}
Používání
Kdo kolik Střelo používá a co v něm dělá; jak se daří asistentovi a diktátu; kolik to stojí. Podrobný kalendář na člověka je v záložce Technici.
Lidé (od {{ bsUsage.since }})
| kdo | dní | návštěv | čas | akcí | zakázek | příloh | výkaz | asistent | nerozuměl | diktátů | server | AI $ |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ (u.name||'?').slice(0,2) }}{{ u.name }} | {{ u.days }} | {{ u.sessions }} | {{ bsDur(u.seconds) }} | {{ u.actions }} | {{ u.task_opens }} | {{ u.file_opens }} | {{ u.worklog }} | {{ u.assistant }} | {{ u.assistant_fail_pct == null ? '—' : u.assistant_fail + ' (' + u.assistant_fail_pct + ' %)' }} | {{ u.dictate }} | {{ u.stt_server }} | {{ bsUsd(u.cost_usd) }} |
| Nikdo tu v tomhle období nebyl. | ||||||||||||
Karta člověka:
{{ bsPersonBusy ? 'Načítám…' : 'Nic.' }}
{{ (bsPerson.user.short_name||bsPerson.user.full_name||'?').slice(0,2) }}
{{ bsPerson.user.full_name }} {{ bsPerson.user.role }}
naposledy ve Střelu {{ bsPerson.user.last_seen ? bsAgo(bsPerson.user.last_seen) : '—' }} · aktivních dní {{ bsPerson.active_days }} z {{ bsPerson.days }}
{{ bsPerson.totals.sessions }}návštěv
{{ bsDur(bsPerson.totals.seconds) }}ve Střelu
{{ bsPerson.totals.actions }}úprav
{{ bsPerson.totals.task_opens }}otevřených zakázek
{{ bsPerson.totals.file_opens }}příloh v náhledu
{{ bsPerson.totals.worklog }}zápisů výkazu
{{ bsPerson.assistant.total }} · {{ bsPerson.assistant.fail }}× nerozuměl ({{ bsPerson.assistant.fail_pct }} %)asistent
{{ bsPerson.dictation.total }} · server {{ bsPerson.dictation.server }} / prohlížeč {{ bsPerson.dictation.browser }}diktátů
{{ bsUsd(bsPerson.cost_usd) }}AI (asistent)
{{ bsPerson.friction_open }}otevřených nedokonalostí
Každý dotaz na asistenta a každý diktát za období, nejnovější nahoře. Červeně = asistent nerozuměl nebo akci neprovedl, nebo přepis vrátil prázdno. V bublině je surový přepis z prohlížeče, když byl.
Asistenta ani diktát v tomhle období nepoužil.
{{ bsTimeShort(it.ts) }}
{{ bsActIcon(it.action) }}
„{{ it.text || '(prázdné)' }}“
→ {{ it.answer }}
{{ it.answer }}
Nedokonalosti, které se u něj zachytily (za období + všechny dosud otevřené). Klepni pro detail, vyřeš nebo ignoruj rovnou tady.
Nic se u něj nezachytilo.
{{ bsKindIcon(it.kind) }}
{{ bsFmtTs(it.last_ts || it.ts) }}
„{{ it.text }}“
{{ it.kind_label }}
×{{ it.count }}
{{ it.status === 'done' ? '✓ vyřešeno' : '— ignorováno' }}
Načítám…
{{ ln[0] }}{{ ln[1] }}
Obrazovky (čas)
Žádná měření obrazovek.
Zakázky, u kterých byl nejdéle
#{{ t.task_id }} {{ t.label }}{{ bsDur(t.sec) }} · {{ t.n }}×
Žádnou zakázku neotevřel.
Úpravy podle druhu
Nic neupravil.
Asistent podle akcí a zařízení
Po dnech — čas ve Střelu (šedě, min), asistent (modře, tmavě nerozuměl), diktát (oranžově)
{{ bsDayShort(d.day) }}
Obrazovky (otevření)
Zatím žádná měření obrazovek.
Úpravy podle druhu
Asistent
dotazů{{ bsUsage.assistant.total }}
nerozuměl / neprovedl{{ bsUsage.assistant.fail }} ({{ bsUsage.assistant.fail_pct }} %)
Podle zařízení
{{ d.device }}{{ d.total }} · nerozuměl {{ d.fail }}
Diktát
diktátů celkem{{ bsUsage.dictation.total }}
přepis přes server (gpt-4o-transcribe){{ bsUsage.dictation.server }}
přepis v prohlížeči{{ bsUsage.dictation.browser }}
prázdný přepis{{ bsUsage.dictation.stt_empty }}
průměrná délka (slov) server / vše{{ bsUsage.dictation.avg_words_server == null ? '—' : bsUsage.dictation.avg_words_server }} / {{ bsUsage.dictation.avg_words_all == null ? '—' : bsUsage.dictation.avg_words_all }}
minut zvuku (známo u {{ bsUsage.dictation.minutes_known_of[0] }} z {{ bsUsage.dictation.minutes_known_of[1] }}){{ bsUsage.dictation.minutes }}
Cena AI (orientačně)
Anthropic — celkem{{ bsUsd(bsUsage.cost.anthropic_usd) }}
{{ f.feature }} · {{ f.calls }} volání{{ bsUsd(f.usd) }}
{{ m.model }} · {{ m.calls }} volání · vstup {{ m.input }} · cache {{ m.cache_read }}/{{ m.cache_write }} · výstup {{ m.output }}{{ bsUsd(m.usd) }}
OpenAI — přepis řeči{{ bsUsd(bsUsage.cost.openai_usd) }}
{{ bsUsage.cost.note }}; {{ bsUsage.cost.openai_note }}.
Po dnech — asistent (tmavě = nerozuměl) a diktát
{{ bsDayShort(d.day) }}
Dotazy na asistenta a jejich cena — {{ bsUsage.queries.count }} dotazů, celkem {{ bsUsd(bsUsage.queries.usd) }}, průměr {{ bsUsdQ(bsUsage.queries.avg_usd) }}
{{ bsUsdQ(q.usd) }}
„{{ q.text || '(prázdné)' }}“
V tomhle období žádné dotazy.
{{ bsLoading ? 'Načítám…' : 'Zatím nic.' }}
Záznamy
Hovor z telefonu: u nahrávky Sdílet → Střelo. Z PC: Nový záznam nebo soubor přetáhni sem.{{ recError }}
Zatím žádné záznamy.
Na telefonu otevři nahrávku hovoru a dej Sdílet → Střelo.
Na telefonu otevři nahrávku hovoru a dej Sdílet → Střelo.
{{ recStatus(r).ico }}
{{ recFmtWhen(r.recorded_at || r.created_at) }}
{{ recTitle(r) }}
{{ r.context_label || recCtxLabel(r.context_kind) }}
{{ r.status==='hotovo' ? (r.summary || 'přepsáno') : (r.status==='chyba' ? (r.error || 'nepovedlo se') : recStatus(r).txt + '…') }}
{{ r.mine ? '' : r.created_by_name }}
{{ recFmtDur(r.duration_sec) }}
🎙 Nový záznam
📎 {{ f.name }} {{ recFmtSize(f.size) }}
nahráno {{ recFmtWhen(recNew.recorded_at) }}
K čemu
S kým
🙈 Záznam vidíš jen ty — nikdo jiný (ani administrátor) se k němu nedostane.
Poznámka (nepovinné)
{{ recNew.error }}
Odesílám {{ recUpload.pct }} %
Zvuk se po přepisu na serveru smaže.
{{ recTitle(recDetail.recording) }}
K čemu
S kým
Poznámka
✍️ {{ recDetail.recording.status==='ceka' ? 'Čeká na přepis…' : 'Přepisuje se…' }} Hodinový hovor trvá pár minut, ozve se zvonek.
{{ recDetail.recording.error || 'Přepis se nepovedl.' }}
Zvuk už na serveru není — pošli záznam z telefonu znovu.
{{ recDetail.recording.error }}
Shrnutí{{ recDetail.recording.summary }}
Poznámka{{ recDetail.recording.note }}
{{ s.name }}
{{ s.text }}
přepis {{ recDetail.transcript.provider }} {{ recDetail.transcript.model }}
· zvuk na serveru smazán {{ recFmtWhen(recDetail.recording.audio_deleted_at) }}
Technici 🔒 jen administrátor
Používání Střela
Nahoře jsou ti, kdo Střelo používají nejméně. Klepni na den a uvidíš, kdy přišel, jak dlouho tam byl, na čem, které obrazovky, zakázky a přílohy otevřel a co upravil.
Čas, zakázky a přílohy se měří od {{ usageSince }}; starší dny ukazují jen úpravy, obrazovky a přihlášení.
den: nebyl nakoukl pracoval 5 min+ 15 min+
{{ initials(u.short_name, u.full_name) }}
{{ u.full_name }}
{{ u.role }}
Naposledy ve Střelu{{ usageLast(u).text }}
{{ u.active_days }}dnů z {{ usageDays }}
{{ u.visits }}návštěv
{{ usageDur(u.seconds) }}čas ve Střelu
{{ u.tasks }}otevřených zakázek
{{ u.files }}prohlédnutých příloh
{{ u.actions }}úprav
Načítám…
Za celé období po něm ve Střelu není žádná stopa.
{{ usageDayLabel(g.day) }}{{ usageDayHead(g) }}
Kde byl:{{ sc.name }} {{ usageDur(sc.seconds) }}
Tento den po něm ve Střelu není žádná stopa.
{{ usageLoading ? 'Načítám…' : 'Žádní uživatelé.' }}
{{ initials(u.short_name, u.full_name) }}
⚠ {{ uaDaysInactive(u) }} dní bez aktivity
⚠ nikdy
{{ u.full_name }}
{{ u.role }} · {{ u.short_name }}
{{ isOnline(u) ? 'Online' : (isRecent(u) ? 'Nedávno' : 'Offline') }}
Poslední přihlášení
{{ u.last_login ? fmtDateTime(u.last_login) : 'Nikdy' }}
Poslední aktivita
{{ u.last_active ? fmtDateTime(u.last_active) : 'Nikdy' }}
Akce (24h / 7d)
{{ u.actions_24h || 0 }} / {{ u.actions_7d || 0 }}
Přihlášení:
{{ fmtDateTime(l.created_at) }}
{{ l.ip_address || '?' }}
🔐 Trezor — odkryl ({{ vaultSeen.seen.length }} položek):
{{ vaultSeen.error }}
Nikdy nic neodkryl.
{{ x.object_name || '?' }} · {{ x.title || '(smazáno)' }}
{{ x.n }}× · {{ fmtDateTime(x.last_at) }}
Otisky (passkey):
👆 {{ pk.label || pk.id }} od {{ fmtDate(pk.created_at) }} · naposledy {{ fmtDateTime(pk.last_used_at) }}
Poslední události trezoru:
{{ logActionLabel(l.action) }} {{ l.object_name }} · {{ l.title }}
{{ fmtDateTime(l.created_at) }}
Poslední akce:
{{ fmtDateTime(a.created_at) }}
{{ uaDescription(a) }}
▶
Objednávky 🔒 jen administrátor
{{ ordersUploading ? 'Importuji…' : 'Přetáhni objednávku nebo e-mail sem (PDF / obrázek / .eml)…' }}
Vyber objednávku pro zakázku: {{ orderPickTask.title }} — klikni na řádek a připojí se.
Načítám…
| Datum {{ orderSort.key==='created_at' ? (orderSort.dir>0?'▲':'▼') : '' }} | Obsah objednávky {{ orderSort.key==='summary' ? (orderSort.dir>0?'▲':'▼') : '' }} | Odběratel {{ orderSort.key==='customer_name' ? (orderSort.dir>0?'▲':'▼') : '' }} | Objekt {{ orderSort.key==='object_name' ? (orderSort.dir>0?'▲':'▼') : '' }} | Částka {{ orderSort.key==='amount_total' ? (orderSort.dir>0?'▲':'▼') : '' }} | Vystaveno {{ orderSort.key==='order_date' ? (orderSort.dir>0?'▲':'▼') : '' }} | Termín {{ orderSort.key==='delivery_date' ? (orderSort.dir>0?'▲':'▼') : '' }} | |
|---|---|---|---|---|---|---|---|
| {{ euDate(o.created_at) }} | 🕓 Ke schválení{{ o.summary || '—' }} | {{ o.amount_total != null ? (o.amount_total + ' ' + (o.currency || 'CZK')) : '—' }} | {{ euDate(o.order_date) }} | {{ euDate(o.delivery_date) }} | |||
| Žádné objednávky | |||||||
📜 Historie
Zakázky, poznámky, příjezdy a výkazy. Ptát se můžeš i asistenta: „co se dělo letos v Úžicích?“
← Zpět
Od
do
{{ p.l }}
{{ st.l }}
✕
{{ histSummary.tasks }} zakázek ({{ histSummary.done }} hotových)
· {{ histSummary.worklogs }} výkazů
· nejčastěji:
{{ oc[0] }} {{ oc[1] }}
· zobrazeno prvních {{ histItems.length }}, upřesni filtr
načítám…
Chyba: {{ histError }}
V historii nic neodpovídá filtrům.
{{ g.label }} {{ g.items.length }}
{{ histDay(it) }}
📊
{{ it.object_name || '—' }}{{ objShort(it.object_name) }}
{{ it.location || '—' }}
{{ it.title || '—' }} 💬{{ it.comment_count }}
{{ histSub(it) }}
{{ histWhenNote(it) }}
{{ t.short_name }}
{{ histEps(it)[0] }}
{{ histStatus2(it)[0] }}
Výkaz
Kdy
{{ histDm(it.date) }} {{ it.date.slice(0,4) }} {{ it.time_from }}–{{ it.time_to }} ({{ it.hours }} h)
{{ si ? ', ' : '' }}{{ fmtDateTime(sg.start_at) }} – {{ fmtDateTime(sg.end_at) }}
{{ histWhenNote(it) }} {{ histDm(it.date) }} {{ it.date.slice(0,4) }}
· ukončeno {{ fmtDate(it.completed_at) }}
{{ it.kind==='worklog' ? 'Kdo' : 'Technici' }}
{{ (it.technicians || []).map(t => t.short_name).join(', ') || '—' }}
Činnost{{ it.activity || '—' }}
Popis{{ it.description }}
Stav EPS{{ histEps(it)[0] }}
Příjezdy{{ it.visits.map(v => histDm(v) + ' ' + v.slice(11)).join(', ') }}
… a {{ it.comment_count - it.comments.length }} starších poznámek v kartě zakázky
{{ fmtDate(c.at) }} {{ c.author }}: {{ c.text }}
Ukončené zakázky 🔒 jen administrátor
Ukončeno
–
{{ archiveView.length }} z {{ archiveItems.length }}
| Č. {{ archSort.key==='seq' ? (archSort.dir>0?'▲':'▼') : '' }} | Objekt {{ archSort.key==='object_name' ? (archSort.dir>0?'▲':'▼') : '' }} | Název zakázky {{ archSort.key==='title' ? (archSort.dir>0?'▲':'▼') : '' }} | Odběratel {{ archSort.key==='_cust' ? (archSort.dir>0?'▲':'▼') : '' }} | Datum ukončení {{ archSort.key==='_completed' ? (archSort.dir>0?'▲':'▼') : '' }} | Technik | |
|---|---|---|---|---|---|---|
| {{ g.label }}{{ g.info }} | ||||||
| {{ a.seq ? '#' + a.seq : '—' }} | {{ objMid(a.object_name) }} |
{{ a.title || 'Bez názvu' }}
{{ a.description }}
|
{{ custName(a.customer_id) }} | {{ fmtDateTime(a.completed_at || a.updated_at || a.created_at) }} | {{ a.technician_names || '—' }} | |
Žádné ukončené zakázky.
📒 Rejstřík ukončených zakázek
Nepřerušená řada pořadových čísel — smazané zakázky zůstávají v řadě. Chybějící číslo = ztracená položka.
⚠️ V řadě chybí čísla: {{ registryGaps.join(', ') }} — to by nemělo nastat, něco se ztratilo!
| Č. | Zakázka | Objekt | Ukončeno | Kdo | Stav | Pozn. |
|---|---|---|---|---|---|---|
| #{{ r.seq }} | {{ r.title || 'Bez názvu' }} | {{ r.object_name || '—' }} | {{ fmtDate(r.completed_at) }} | {{ r.completed_by_name || '—' }} | {{ registryLabel(r.status) }} | smazal(a) {{ r.deleted_by_name || '?' }} {{ fmtDate(r.deleted_at) }} faktura č. {{ r.invoice_number }} |
Rejstřík je zatím prázdný — první číslo dostane příští ukončená zakázka.
Nová zakázka do archivu
{{ fmtDateTime(archDetail.updated_at || archDetail.created_at) }}
· {{ archDetail.technician_names }}
{{ archDetail.description }}
✨ Připravuju návrh textu z obsahu zakázky…
{{ isg.error }}
Odběratel: navrhuji {{ isg.customer.name }} ({{ isg.customer.reason }})
🧾 Fakturační údaje
povinné pro odeslání k fakturaci
✓ Kompletní
⚠️ Chybí: {{ archMissingFields.join(', ') }}
⚠️ {{ f._excelError }}
Objednávka ze schránky (jen admin)
{{ o.order_number || ('#'+o.id) }}
{{ o.customer_name || '—' }}
· {{ o.amount_total }} {{ o.currency||'CZK' }}
náhled
Žádná připojená objednávka.
Nevyčerpané objednávky odběratele této zakázky:
{{ o.order_number || ('#'+o.id) }}
{{ o.customer_name || '—' }}
· {{ o.amount_total }} {{ o.currency||'CZK' }}
Žádné volné objednávky tohoto odběratele.
⚠️ {{ f._excelError }}
📷 Od techniků
📷 {{ archTechMedia.length }}
🎤 {{ archTechAudio.length }}
📄 {{ archTechDocs.length }}
💬 {{ archTaskComments.length }}
Technici k zakázce nic nepřidali.
Fotky a videa ({{ archTechMedia.length }})
{{ fmtDateTime(f.taken_at || f.uploaded_at) }}
{{ f.caption }}+ popis
Audio ({{ archTechAudio.length }})
🎤 {{ f.caption || f.original_name }} {{ fmtDateTime(f.uploaded_at) }}
Soubory ({{ archTechDocs.length }})
Poznámky ({{ archTaskComments.length }})
({{ taskActivity.length }})
{{ taskActivity.length ? 'Žádné události pro tento filtr.' : 'Zatím žádné události.' }}
| Zdr. | Datum a čas | Kdo | Akce | Co se stalo |
|---|---|---|---|---|
| {{ histSource(a).icon }} | {{ fmtDateTime(a.created_at) }} | {{ initials(a.user_short, a.user_name) }}{{ a.user_name }} | {{ histAction(a) }} | {{ histChangeText(a) }} |
📥 Export do Excelu
Sloupce jsou ve stejném pořadí jako tabulka. Zaškrtnutí = sloupec bude v Excelu, políčko pod ním = filtr. Předvyplněno podle toho, co máš právě vyfiltrované.
—
Další sloupce do Excelu:
{{ invExportDesc }}
Nastavení fakturace
jeden email na řádek
Fakturace 🔒 jen administrátor
| Č.{{ invSort.key==='seq' ? (invSort.dir>0?'▲':'▼') : '' }} | Objekt{{ invSort.key==='object_name' ? (invSort.dir>0?'▲':'▼') : '' }} | Zakázka{{ invSort.key==='task_title' ? (invSort.dir>0?'▲':'▼') : '' }} | Částka{{ invSort.key==='amount' ? (invSort.dir>0?'▲':'▼') : '' }} | DÚZP{{ invSort.key==='duzp' ? (invSort.dir>0?'▲':'▼') : '' }} | RM | Stav{{ invSort.key==='status' ? (invSort.dir>0?'▲':'▼') : '' }} | AH | Poznámka | Č. faktury{{ invSort.key==='invoice_number' ? (invSort.dir>0?'▲':'▼') : '' }} | Odesláno{{ invSort.key==='created_at' ? (invSort.dir>0?'▲':'▼') : '' }} | Odběratel{{ invSort.key==='customer_name' ? (invSort.dir>0?'▲':'▼') : '' }} | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ inv.seq || '—' }} | {{ objMid(inv.object_name) }} |
{{ inv.task_title || 'Bez názvu' }} |
{{ inv.duzp ? inv.duzp.slice(8,10).replace(/^0/,'') + '.' + inv.duzp.slice(5,7).replace(/^0/,'') + '.' + inv.duzp.slice(2,4) : '—' }} | {{ inv.approved_by_rm }} – | {{ inv.status==='invoiced' ? 'Vyfakt.' : 'Čeká' }} | {{ inv.approved_by }} – |
|
{{ fmtDate(inv.created_at) }} | {{ inv.customer_name || '—' }} |
|||
| Celkem · {{ invCount }} | {{ fmtKc(invTotal) }} | |||||||||||
| Č. {{ invSort.key==='seq' ? (invSort.dir>0?'▲':'▼') : '' }} | Objekt {{ invSort.key==='object_name' ? (invSort.dir>0?'▲':'▼') : '' }} | Název zakázky {{ invSort.key==='task_title' ? (invSort.dir>0?'▲':'▼') : '' }} | Odběratel {{ invSort.key==='customer_name' ? (invSort.dir>0?'▲':'▼') : '' }} | Částka {{ invSort.key==='amount' ? (invSort.dir>0?'▲':'▼') : '' }} | DÚZP {{ invSort.key==='duzp' ? (invSort.dir>0?'▲':'▼') : '' }} | Odesláno {{ invSort.key==='created_at' ? (invSort.dir>0?'▲':'▼') : '' }} | Číslo faktury {{ invSort.key==='invoice_number' ? (invSort.dir>0?'▲':'▼') : '' }} | Podklad (AH) | Schválil (RM) | Komentář | Stav {{ invSort.key==='status' ? (invSort.dir>0?'▲':'▼') : '' }} | Akce |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ g.label }}{{ g.info }} | ||||||||||||
| {{ inv.seq ? '#' + inv.seq : '—' }} | {{ objMid(inv.object_name) }} |
{{ inv.task_title || 'Bez názvu' }}
{{ inv.invoice_text }}
|
{{ inv.customer_name || '-' }} | {{ fmtDate(inv.created_at) }} |
|
{{ inv.approved_by }} – | {{ inv.approved_by_rm }} – | {{ inv.status==='invoiced' ? 'Vyfakturováno' : 'Čeká' }} | ||||
| Celkem — {{ invCount }} {{ invCount===1 ? 'položka' : (invCount>=2 && invCount<=4 ? 'položky' : 'položek') }} · měsíc {{ invMonth }} · k fakturaci · vyfakturováno | {{ fmtKc(invTotal) }} | |||||||||||
Žádné položky k zobrazení
Žádné položky pro zvolený měsíc.
Odběratel
Objekt
{{ invModalInv.object_name || '—' }}
DUZP
Částka
Kč
Číslo faktury
Objednávka
{{ invModalInv.order_number || ('#'+invModalInv.order_id) }} 📄 zobrazit
Text faktury
✨ Připravuju návrh textu z obsahu zakázky…
{{ isg.error }}
Odběratel: navrhuji {{ isg.customer.name }} ({{ isg.customer.reason }})
Interní poznámky k fakturaci
Načítám zakázku…
{{ invTaskError }}
Popis zakázky
Bez popisu
Závěr zakázky
🤖{{ ln.l }}: {{ ln.t }}
Technik závěr nezapsal
Fotky a videa ({{ invTaskMedia.length }})
Audio ({{ invTaskAudio.length }})
🎤 {{ f.original_name }} {{ f.uploader_name || '' }} · {{ fmtDateTime(f.uploaded_at) }}
Dokumenty ({{ invTaskDocs.length }})
Poznámky techniků ({{ invTask.comments.length }})
Žádné poznámky
✓ Uloženo
Uloží text faktury, poznámky, částku, DÚZP i číslo faktury.
Přílohy ({{ invDetailFiles.length }})
Žádné přílohy
{{ invZoomIdx+1 }} / {{ invDetailFiles.length }}
🎤
{{ invZoom.original_name || invZoom.filename }}
📝
{{ invZoom.original_name || invZoom.filename }}
Načítám náhled…
📄
{{ invZoom.original_name || invZoom.filename }}
Tento typ souboru prohlížeč přímo nezobrazí.
Revize
{{ revYear }}
{{ revMonthNames[month-1] }}
Zadne
{{ rev.object_name }}
oček. {{ revFmtD(rev.expected_date) }}
{{ revMark(rev).icon }}
{{ revMark(rev).text }}
{{ t }}
{{ rev.notes }}
📄 Protokoly z revizí (OneDrive)
Střelo jen čte, a to jen složky, které tady výslovně povolíš. U každé složky určíš, kdo uvidí, co z ní Střelo načte: všichni, nebo jen administrátoři. Složky s nabídkami, smlouvami, fakturami a podobně jsou vždy jen pro administrátory a technikům se nikdy nezobrazí. Z protokolů se vyčte datum zkoušky a u revize se ukáže jako 📄 s datem.
{{ revProtMsg }}
🔒 Oprávnění k OneDrivu může měnit jen Robert Machovský. Tady je vidíš jen pro čtení.
Připojení k Microsoftu
✅ Připojeno jako {{ revProtStatus.account }}
Funguje přes tvé přihlášení. Spolehlivější je firemní přístup od správce.
⚠ {{ revProtStatus.note }}Nepřipojeno.
Firemní přístup funguje bez tvého přihlášení i bez zapnutého počítače.
1. Otevři {{ revProtDc.verification_uri }}
2. Zadej kód {{ revProtDc.user_code }} a přihlas se účtem, kde je OneDrive s protokoly.
Čekám na potvrzení…
2. Zadej kód {{ revProtDc.user_code }} a přihlas se účtem, kde je OneDrive s protokoly.
Čekám na potvrzení…
Údaje dostaneš od správce Microsoft 365. Klíč se uloží jen na server a už se nikde nezobrazí.
⚠ Na serveru chybí knihovna pypdf — PDF se nepřečtou.
Povolené složky (jen tyto Střelo čte)
{{ (revProtStatus.allowed||[]).length }} složek · protokolů {{ revProtStatus.count }}
Poslední prohledání: {{ revProtStatus.state && revProtStatus.state.last_scan ? revProtStatus.state.last_scan.replace('T',' ').slice(0,16) : '—' }} · chyba: {{ revProtStatus.state.last_error }}
| Povolená složka | Objekt | Kdo vidí | Protokolů | |
|---|---|---|---|---|
| 📁 {{ f.label }} | vždy jen admin | {{ f.count }} |
📁 {{ revProtCrumbs().join(' / ') }}
· {{ revProtBrowse.files }} PDF/Word přímo zde
· obsahuje „{{ revProtBrowse.sensitive }}“ — jde povolit jen pro administrátory
✓ už povolená
Vyber, kde složka s protokoly je: tvůj OneDrive, složka, kterou ti někdo nasdílel, nebo firemní web (SharePoint / Teams).
nic dalšího tady není
| Soubor | Objekt | Ukončení zkoušky | Zdroj data |
|---|---|---|---|
| {{ revProtSourceLabel(p.date_source) }} |
Zatím žádné protokoly — zkus „Prohledat teď".
{{ revDetailItem.object_name }}
Měsíc: {{ revDetailItem.month }}/{{ revDetailItem.year }}
{{ revMark(revDetailItem).icon }}
{{ revDetailItem.task.title }}
{{ revFmtD(revDetailItem.task.start_at) }} – {{ revFmtD(revDetailItem.task.end_at) }} · {{ dashStatusLabel(revDetailItem.task.status) }}
(nalezeno podle názvu)
✗ Neproběhlo —
žádná revizní zakázka. Očekávané dokončení {{ revFmtD(revDetailItem.expected_date) }} {{ revDetailItem.year }} (předchozí zkouška ukončena {{ revFmtD(revDetailItem.prev_date) }} + půl roku).
📄 {{ revDetailItem.protocol.name }}
ukončení {{ revFmtD(revDetailItem.protocol.end_date) }} · {{ revProtSourceLabel(revDetailItem.protocol.source) }}
⚠ liší se od posledního dne zakázky
žádný protokol k tomuto měsíci — Protokoly…
{{ revSaveLabel || 'Ukládá se samo' }}
Odběratelé
{{ custSaveLabel || 'Ukládá se samo' }}
| Název | IČO | Objekty | |
|---|---|---|---|
| {{ cust.name }} | {{ cust.ico || '' }} |
{{ objNameById(oid) }}
|
Žádní odběratelé. Klikněte na + Nový odběratel.
📖 Odborný slovník pojmů 🔒 jen administrátor
Asistent podle tohoto slovníku opravuje zkomolená slova z hlasu i diktátu (např. „sériák" na „sériové číslo", „kion" na „KION") ve všech vstupech — diktafon, hlasový asistent, faktury i výkaz.
⏳ Návrhy ke schválení ({{ glossarySuggestions.length }})
{{ t.correct }}
← {{ t.variants }}
{{ t.note }}
{{ glossaryEdit.id ? 'Upravit pojem' : 'Nový pojem' }}
Varianty odděl čárkou — všechny tvary, jak je přepis komolí.
Slovník ({{ glossaryApproved.length }})
| Správný tvar | Jak to zní | Poznámka | Druh | Akce |
|---|---|---|---|---|
| {{ t.correct }} | {{ t.variants }} | {{ t.note }} | {{ t.kind }} | |
| Zatím žádné pojmy. Přidej první přes „+ Přidat pojem". | ||||
{{ wlMonthNames[wlMonth-1] }} {{ wlYear }}
{{ t.short_name || t.full_name || t.name }}
| Datum | Den | Od | Do | Hodiny | Fond | Cinnost | Objekt | Popis |
|---|---|---|---|---|---|---|---|---|
| {{ day.label }} | {{ day.dayName }} | {{ e.time_from || '' }} | {{ e.time_to || '' }} | {{ wlHoursDisplay(e.hours) }} | {{ day.quota === 'Svátek' ? 'Svátek' : (day.quota ? (typeof day.quota === 'number' ? wlFmtHM(day.quota) : day.quota) : '') }} | {{ wlActivityDisplay(e.activity) }} | {{ e.location || '' }}📋 | {{ e.description || '' }} |
| {{ day.label }} | {{ day.dayName }} | {{ day.quota === 'Svátek' ? '0' : '' }} | {{ day.quota === 'Svátek' ? 'Svátek' : (day.quota ? (typeof day.quota === 'number' ? wlFmtHM(day.quota) : day.quota) : '') }} | {{ day.quota === 'Svátek' ? 'Svátek' : '' }}--- | {{ day.quota === 'Svátek' ? 'Státní svátek' : '' }} | |||
| Celkem (vše kromě Neplaceného volna) | {{ wlFmtHM(wlWorkedDecimal) }} | {{ wlFmtHM(wlQuotaTotal) }} | neplacené volno: {{ wlFmtHM(wlUnpaidDecimal) }} h {{ wlRemainingDisplay }} | |||||
📋 Historie změn výkazu ({{ wlHistory.length }} záznamů)
Zatím žádné změny.
📅 {{ wlhDateFull(h) }} · 📍 {{ wlhLocation(h) }} · 👤 {{ wlhTechName(h) }}
{{ wlhFieldLabel(key) }}: {{ wlhFmt(key, h.old_values[key]) }} → {{ wlhFmt(key, nv) }}
{{ h.new_values.time_from }}–{{ h.new_values.time_to }} · {{ h.new_values.hours }} h · {{ h.new_values.activity }} · {{ h.new_values.description }}
{{ h.old_values.time_from }}–{{ h.old_values.time_to }} · {{ h.old_values.hours }} h · {{ h.old_values.activity }} · {{ h.old_values.description }}