Loading...

Doctor Dashboard

Sign in to manage your patients and orders

{{ error }}

{{ menuItems.find(item => item.id === currentView)?.name || 'Dashboard' }}

Pending Approval

{{ pendingApprovalCount }}

Ready to Sign

{{ approvedCount }}

Signed Orders

{{ signedCount }}

Total Patients

{{ patientsCount }}

Orders Pending Approval

Review and approve or decline patient orders

{{ pendingApprovalOrders.length ? 'No pending orders match your search' : 'No orders waiting for approval' }}

Try another name, order ID, product, or clear the filters.

Order ID

{{ order.id.substring(0, 8) }}...

Pending Followup Rx Postversand

Patient

{{ order.user?.name || 'Unknown' }}

{{ order.user?.email || order.userId }}

Items

{{ order.items?.length || 0 }} items

Created

{{ formatDate(order.createdAt) }}

Approved Orders

Orders that have been approved and are ready for processing

Electronic signing will be automatic once InfoCert integration is complete.

{{ approvedOrders.length ? 'No approved orders match your search' : 'No approved orders yet' }}

Try another name, order ID, product, or clear the filters.

Order ID

{{ order.id.substring(0, 8) }}...

Signing Failed Approved Followup Rx Postversand Auto-approved

{{ order.prescription.signingError }}

Patient

{{ order.user?.name || 'Unknown' }}

{{ order.user?.email || order.userId }}

Items

{{ order.items?.length || 0 }} items

Approved

{{ formatDate(order.updatedAt) }}

Signed Orders

Orders that have been signed and processed

{{ signedOrders.length ? 'No signed orders match your search' : 'No signed orders yet' }}

Try another name, order ID, status, or clear the filters.

Order ID

{{ order.id.substring(0, 8) }}...

Signed Auto-approved

Patient

{{ order.user?.name || 'Unknown' }}

{{ order.user?.email || order.userId }}

Items

{{ order.items?.length || 0 }} items

Signed

{{ formatDate(order.updatedAt) }}

Document Requests

Patients paid 99 € for a document on a signed order. Upload the PDF to issue it, or decline with a reason: declining refunds the patient automatically.

No open document requests.

{{ req.typeLabel }}

{{ req.id }} · paid {{ formatDate(req.paidAt) }} · order {{ req.orderId.substring(0, 8) }}…

{{ req.patient.firstName }} {{ req.patient.lastName }} · born {{ req.patient.birthDate }} · {{ req.patient.email }}

{{ req.details }}

Answered

Document Patient Result Date
{{ req.typeLabel }}
{{ req.id }}
{{ req.patient.firstName }} {{ req.patient.lastName }}
Declined · {{ refundLabel(req.refundStatus) }}
{{ req.declineReason }}
{{ formatDate(req.completedAt) }}

Videocall Availability

Manage your availability slots for videocall appointments

All times are displayed in CET (Central European Time) timezone

Video calls are powered by Jitsi Meet (open source, no payment required)

Loading availability...

Repeating availability

No rules yet. "Add availability" creates all appointments for the next {{ availabilityMeta.horizonDays }} days in one go and keeps them topped up.

{{ describeRule(rule) }}
{{ rule.startDate }} – {{ isOpenEnded(rule) ? 'ongoing' : rule.endDate }} · paused

Days off

No days off. Blocked days are skipped by every rule.

{{ day.date }} · {{ day.reason }}
{{ day.dayName }}
{{ day.dateFormatted }}
Day off No Slots {{ day.slots.length }} Slots

Times shown in CET

{{ slot.startTime }}
Reserviert (unbezahlt)
Booked
Führerschein-Check
{{ slot.precheckId }}
No availability slots for this day

Patients

View your patients and their order history

Patient Total Orders Last Order Actions

{{ patients.length ? 'No patients match your search' : 'No patients yet' }}

Try another name, email, order ID, or clear the filters.

{{ patient.user?.name || 'Unknown' }}
{{ patient.user?.email || patient.userId }}
{{ patient.orders.length }} {{ formatDate(patient.orders[0]?.createdAt) }}

Access Denied

You don't have doctor privileges to access this dashboard.

Order Details

Postversand - Physisches Rezept

Bitte das Rezept handschriftlich auf dem Rezeptblock ausfüllen und per Post an den Patienten senden.

Lieferadresse:

{{ selectedOrder.user?.name }}

{{ selectedOrder.deliveryAddress?.street }}

{{ selectedOrder.deliveryAddress?.zip }} {{ selectedOrder.deliveryAddress?.city }}

Order Information

Order ID: {{ selectedOrder.id }}
Status: {{ selectedOrder.status }} Auto-approved
Auto-approved at: {{ formatDate(selectedOrder.autoApprovedAt) }}
Created: {{ formatDate(selectedOrder.createdAt) }}
Updated: {{ formatDate(selectedOrder.updatedAt) }}

Patient Information

Name:
Email: {{ selectedOrder.user?.email || selectedOrder.userId }}
Phone: {{ selectedOrder.user?.phone || 'N/A' }}
Date of Birth: {{ selectedOrder.user.birthDate }} ({{ calculateAge(selectedOrder.user.birthDate) }} years) N/A

Order Items

{{ item.productName }}
PZN: {{ item.productPzn }}
Quantity: {{ item.quantity }}
Price: €{{ (item.price / 100).toFixed(2) }}
Dosierung festlegen (Extrakte, Vapes, Getränke)
{{ item.productName }} · {{ item.quantity }} ml
Fragebogen wird geladen...
Fragebogen konnte nicht geladen werden: {{ questionnaireError }}

Questionnaire Responses

{{ questionnaireTypeLabel(selectedOrderQuestionnaire) }} Version {{ selectedOrderQuestionnaire.questionnaireVersion ?? '?' }}
Aufklärung zur Fahrtüchtigkeit bestätigt am {{ formatDate(selectedOrderQuestionnaire.drivingAcknowledgement.acceptedAt) }} (Fassung {{ selectedOrderQuestionnaire.drivingAcknowledgement.version }})
Keine Bestätigung der Aufklärung zur Fahrtüchtigkeit gespeichert. Fragebögen von vor der Einführung haben keine.
{{ selectedOrderQuestionnaire.type === 'rx' ? section.title : getSectionTitle(section.id, selectedOrderQuestionnaire.type) }}
{{ getQuestionLabel(question, section.labels) }}: {{ Array.isArray(answer) ? answer.join(', ') : answer }}
Specified: "{{ section.otherTexts[question] }}"
BMI (berechnet): {{ formatBmi(selectedOrderQuestionnaire.bmi.value) }} kg/m²

Keine Antworten vorhanden

Produktbewertungen
{{ rating.productName }} ({{ rating.productId }})
{{ getRatingEmoji(n, rating.rating) }} {{ rating.rating }}/5
Kein Fragebogen vorhanden

Prescription Document

Scheduled Video Call

Scheduled: {{ formatVideoCallDateTime(selectedOrderVideoCall.date, selectedOrderVideoCall.startTime) }}

Video call powered by Jitsi Meet (open source, no payment required)

Signature Failed

{{ selectedOrder.prescription.signingError }}

Patient Details

Patient Information

Name: {{ selectedPatient.user?.name || 'Unknown' }}
Email: {{ selectedPatient.user?.email || selectedPatient.userId }}
Phone: {{ selectedPatient.user?.phone || 'N/A' }}
Total Orders: {{ selectedPatient.orders.length }}

Order History

Order ID Status Items Created Actions
{{ order.id.substring(0, 8) }}... DEMO {{ order.status }} {{ order.items?.length || 0 }} {{ formatDate(order.createdAt) }}

Add availability

All times are CET. Saving creates every appointment at once, up to {{ availabilityMeta.horizonDays }} days ahead.

Creates {{ rulePreview.total }} appointment(s) now: {{ rulePreview.perDay }} per day on {{ rulePreview.days }} day(s), up to {{ availabilityMeta.horizon }}. Ongoing rules are extended automatically every night. Check dates and times.

Block days

Open appointments in this range are removed; booked ones stay. Rules skip blocked days.

Copy week

Copies the open appointments of the chosen week (Mon–Sun) into the following weeks.

Clear open appointments

Removes all open appointments in the range. Booked appointments are kept.

Bulk Signature Request Results

Successfully created requests for {{ bulkResult.success.length }} orders:

  • {{ orderId }}

Failed to create requests for {{ bulkResult.failures.length }} orders:

Order ID Reason
{{ failure.orderId }} {{ failure.reason }}