Przejdź do głównej zawartości

Creating a Visit

Na tej stronie

Wizyty można tworzyć z kilku miejsc w aplikacji. Każda ścieżka prowadzi przez visitApi.create()create_visit.


flowchart LR
subgraph Sources
Appointment[From Appointment]
Patient[From Patient Profile]
Quick[Quick Visit Button]
Workspace[From Workspace]
end
subgraph API
create[visitApi.create]
end
subgraph Backend
cmd[create_visit]
end
Appointment --> create
Patient --> create
Quick --> create
Workspace --> create
create --> cmd

Szybkie tworzenie wizyty z dowolnego miejsca.

// onCreateNew callback z useVisitSelection
onCreateNew() → handleCreateNew()
// Flow
1. Open patient selector modal
2. Select existing patient OR create new
3. Create visit with patient_id
4. Open visit in editor tab
// PatientSelector component
onPatientSelect(patient: Patient) {
// Option 1: Existing patient
createVisit({ patient_id: patient.patient_id });
// Option 2: New patient
// Opens NewPatientView first
}

Konwersja appointment → visit po przyjściu pacjenta.

// CalendarDayView or AppointmentCard
onStartVisit(appointment: Appointment) {
// Create visit linked to appointment
await visitApi.create({
patient_id: appointment.patient_id,
appointment_id: appointment.appointment_id,
visit_type: appointment.appointment_type,
visit_date: new Date().toISOString(),
user_id: currentUser.user_id,
});
}
sequenceDiagram
participant User
participant Calendar
participant API as visitApi
participant BE as Backend
User->>Calendar: Click "Start Visit"
Calendar->>API: create({ appointment_id })
API->>BE: create_visit
BE->>BE: Update appointment status
BE-->>API: Visit created
API->>Calendar: Navigate to visit editor

Tworzenie wizyty bezpośrednio z profilu pacjenta.

// PatientProfileSummary
onCreateVisit() {
// patient already selected
await visitApi.create({
patient_id: selectedPatient.patient_id,
user_id: currentUser.user_id,
visit_status: 'draft',
visit_date: new Date().toISOString(),
});
// Navigate to Visits workspace with new visit open
}

Tworzenie nowego draftu w Workspace (Pracownia).

// useWorkspaceDraftActions
handleCreateDraft(patientId?: string, template?: VisitTemplate) {
const visit = await visitApi.create({
patient_id: patientId,
visit_status: 'draft',
visit_type: template?.visitType || 'consultation',
// Pre-fill from template if provided
soap_subjective: template?.defaultSubjective,
soap_objective: template?.defaultObjective,
});
// Add to workspace drafts list
fetchVisits();
}

interface CreateVisitInput {
patient_id: string; // Required
user_id: string; // Current vet
visit_date?: string; // ISO date, defaults to now
visit_type?: string; // consultation, vaccination, etc.
visit_status?: VisitStatus; // draft (default)
// Optional pre-fill
appointment_id?: string;
soap_subjective?: string;
soap_objective?: string;
soap_assessment?: string;
soap_plan?: string;
internal_notes?: string;
}

TypePolishUse Case
consultationKonsultacjaDefault, general visit
vaccinationSzczepienieVaccine administration
surgeryZabiegSurgical procedure
followupKontrolaFollow-up visit
emergencyNagły przypadekEmergency visit
groomingPielęgnacjaGrooming services
otherInneCustom type

Po utworzeniu wizyty:

  1. Tab opens - nowa zakładka w VisitsHubView
  2. Editor ready - CenterPanel z pustymi polami SOAP
  3. Audio ready - możliwość nagrywania
  4. AI ready - przygotowanie do generowania SOAP
// Post-create flow
visitApi.create(payload)
→ tabsController.openTabWithVisit(newVisit)
handleSelectVisit(newVisit)
→ editedData initialized
UI ready for editing

Przed utworzeniem wizyty:

CheckRequirement
patient_idMust exist in patients table
user_idMust be valid vet/admin
SessionActive session required
PermissionsUser can create visits

Po utworzeniu wizyty emitowany jest event:

// Tauri event
'visit_created' → payload: { visit_id, patient_id }
// Listeners refresh their data
useVisitsList.fetchVisits()
useWorkspaceData.fetchVisits()